matplotlib y-scale as log with base e

时间:2018-02-06 12:36:21

标签: python matplotlib logging

我正在尝试绘制一个函数,其函数为I_threshold = A * e ^(T / T_0)。 所以y轴用基数e进行对数缩放。

我的输入看起来像这样

Temp=[10,12.5,15,17.5,20,22.5,25,27.5,30,32.5,35,37.5,40,42.5,45,47.5,50]

和输出,即I_threshold看起来像这样

[22.376331312083646, 22.773439481450737, 23.440242034972115, 23.969920199339803, 24.80014584753161, 25.275728442307503, 26.291852943772966, 26.969268640398795, 28.09683889698702, 28.952552190706545, 30.325961112054102, 31.488435380923281, 33.176033568454699, 34.613872631424236, 36.710165595581906, 38.567151879424728, 41.245216030694756]

我尝试使用上述等式确定函数并返回函数。所以我使用以下代码来分散和绘制函数。

fig3=plt.figure(3)
ax3=fig3.add_subplot(111)


def efit(T,T_0,A):
    return(A*np.e**(T/T_0))

Temp=[10,12.5,15,17.5,20,22.5,25,27.5,30,32.5,35,37.5,40,42.5,45,47.5,50]   
params_dremp, covariance_dremp= optimize.curve_fit(efit,Temp,I_threshold)


#print(params_dremp[0],params_dremp[1])

majorLocator_2=MultipleLocator(5)
majorFormatter_2=FormatStrFormatter('%.1f')
minorLocator_2=MultipleLocator(1)

#ax3.xaxis.set_major_locator(majorLocator_2)
#ax3.xaxis.set_major_formatter(majorFormatter_2)
#ax3.xaxis.set_minor_locator(minorLocator_2)


locmaj = LogLocator(base=np.e, numticks=1)
ax3.yaxis.set_major_locator(locmaj)
print(I_threshold)
#print(np.size(Temp),np.size(I_threshold))
plt.scatter(Temp,I_threshold)
ax3.set_yscale('log',basey=np.e)
#plt.semilogy(Temp,I_threshold, basey=np.e)

#plt.plot(Temp,fitt(Temp,*params_dremp),'b--')
plt.xlabel('$ T_c \ (^0 C)$')
plt.ylabel('$ I_t \ (mA) $')
#plt.tick_params(axis='y', which='minor')
plt.grid(True,which="major",color='black',ls="-",linewidth=0.5)

当我以正常比例分散绘制数据时。我得到以下图片。

enter image description here

但是,当使用基准e的对数刻度y轴散射时,我得到以下图像。

enter image description here

此图表在查看图像时似乎不是线性的。有人知道这里出了什么问题。

我的目标是制作一个看起来像这样的情节。

enter image description here

谢谢

1 个答案:

答案 0 :(得分:1)

请注意,如果数据在对数刻度上不是线性的,这意味着数据不正确或者出现此期望的模型是错误的。无论如何,这在这里没有任何帮助。

是否使用日志比例来定位e10并不会更改图表本身,因为它们只是因常数因子[wikipedia]

而不同

enter image description here

然后,将是否将标记标记显示为基数e或基数10标记,例如,只是一种品味问题。 1 * 10^21 * e^2进行比较。由于所讨论的情节只有十分之一的时间,因此似乎更适合使用十进制刻度或正常数字,如下所示。

要在绘图上生成对数刻度,可以使用ax.set_yscale('log')。因为这里要绘制的值的范围相当有限且不超过十年,所以仍然可以使用通常的AutoLocator来调整刻度。

import matplotlib.pyplot as plt
from matplotlib.ticker import AutoLocator, ScalarFormatter

Temp=[10,12.5,15,17.5,20,22.5,25,27.5,30,32.5,35,37.5,40,42.5,45,47.5,50]

I_threshold = [22.376331312083646, 22.773439481450737, 23.440242034972115, 
               23.969920199339803, 24.80014584753161, 25.275728442307503, 
               26.291852943772966, 26.969268640398795, 28.09683889698702, 
               28.952552190706545, 30.325961112054102, 31.488435380923281, 
               33.176033568454699, 34.613872631424236, 36.710165595581906, 
               38.567151879424728, 41.245216030694756]

fig, ax = plt.subplots()

ax.set_yscale('log')
ax.yaxis.set_major_locator(AutoLocator())
ax.yaxis.set_major_formatter(ScalarFormatter())
ax.minorticks_off()

ax.scatter(Temp,I_threshold)

plt.xlabel('$ T_c \ (^\circ C)$')
plt.ylabel('$ I_t \ (mA) $')

plt.grid(True,which="major",color='black',ls="-",linewidth=0.5)

plt.show()

这会产生问题所需的情节。

enter image description here