【问题标题】:Matplotlib 2.02 plotting within a for loopMatplotlib 2.02 在 for 循环中绘图
【发布时间】:2018-04-12 22:51:48
【问题描述】:

我在 for 循环中生成的绘图上遇到了两件事,我的代码加载了一些数据,使用 curve_fit 将其拟合到函数中,然后在同一绘图上绘制测量数据和拟合 5 个不同测量的 y 值集(测量数据由空圆圈标记表示,并用与标记相同颜色的实线拟合)

首先,我正在努力减少拟合的线宽(实线),但是我减少了线宽的浮点值,我可以增加大小,而不是通过下面输出中显示的值来减小它。其次,我希望图例只显示圆圈标记而不是带有线条的圆圈 - 我似乎无法让它工作,有什么想法吗?

这是我的代码,并附上谷歌驱动器共享链接上的输出图和数据文件(由于某种原因,它切断了这篇文章中的长文本行):

import scipy 
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

#define vogel-fulcher-tamman (VFT) function
def vft(x,sigma_0,temp_vf,D):
 return np.log(sigma_0)-((D*temp_vf)/(x-temp_vf))

#load and sort data
data=np.genfromtxt('data file',skip_header=3)

temp=data[:,0]
inverse_temp=data[:,1]
dc_conduct=np.log10(data[:,2:11])
only_adam=dc_conduct[:,4:9]

colors = ['b','g','r','c','m']
labels = ['50mg 2-adam','300mg 2-adam','100 mg 2-adam','150 mg 2-adam','250mg
2-adam']  

for i in range(0,len(only_adam)):

    #fit VTF function
    y=only_adam[:,i]
    popt, pcov = curve_fit(vft,temp,y)


    #plotting
    plt.plot(inverse_temp,y,color=colors[i],marker='o',markerfacecolor='none',
    label=labels[i])
    plt.plot(inverse_temp,vft(temp, *popt),linewidth=0.00001,linestyle='- 
    ',color=colors[i])
    plt.ylabel("Ionic Conductivity [Scm**2/mol]")
    plt.xlabel("1000 / [T(K)]")
    plt.axis('tight')
    plt.legend(loc='lower left')

【问题讨论】:

    标签: python python-3.x numpy matplotlib scipy


    【解决方案1】:
    • 您正在循环only_adam 的行,但使用循环变量i 索引该数组的列。这没有意义,并导致显示的错误。
    • 显示数据点的绘图中有线条。这些是显示的行。您不能通过减小另一个绘图的线宽来使它们变小。相反,您需要关闭该图的线型,例如plot(..., ls="")

    【讨论】:

    • 感谢您的回复。如何更改我的 for 循环以遍历 only_adam 的列 - 我尝试使用切片,即 for i in only_adam[:,i] 但这不起作用。关于您的第二点,我不确定您的意思,数据点是指未拟合的数据吗?为了澄清,我说圆形标记是未拟合数据而拟合数据是实线是正确的?
    • 拟合线未显示在绘图中,因为它的线宽为 0。您看到的线条来自您的第一个绘图。答案告诉你如何摆脱这些。要遍历数组的列,您确实可以迭代其中一行的长度。
    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 2021-05-23
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    相关资源
    最近更新 更多