错误栏在loglog图中不显示

时间:2019-06-20 16:22:48

标签: matplotlib errorbar loglog

我有这些数组

temperature = np.array([28.999795, 30.999707, 32.999471, 34.999571, 36.999753, 50.99875, 51.998767, 52.998236, 53.99675])
rate = np.array([ 8.08506648, 10.44422144, 13.77091141, 18.19601143, 24.96162138, 2538.75705877, 3517.08335312, 4981.46389811, 6818.2314983 ])
yerr = np.array([[5.12265926, 6.35525683, 8.63172001, 12.3078776, 17.48173449, 1155.0608696, 1599.30388408, 2220.70562796, 3069.64971509],[1.27615421e+01, 1.71655550e+01, 2.19724055e+01, 2.69018947e+01, 3.56424659e+01, 5.58085454e+03, 7.73609470e+03, 1.11787335e+04, 1.51522014e+04]])

当我将误差绘制为单个点时,它们到中间点的距离等于预期值

plt.plot(temperature, rate, marker='o', ls='none', fillstyle='none', color='r')
plt.plot(temperature, yerr[0], marker='*', ls='none', fillstyle='none', color='b' )
plt.plot(temperature, yerr[1], marker='*', ls='none', fillstyle='none', color='g' )
plt.xscale('log')
plt.yscale('log')
plt.show()

enter image description here

但是,当我使用内置功能错误栏时,却没有得到预期的行为。

plt.plot(temperature, rate, marker='o', ls='none', fillstyle='none', color='r')
plt.plot(temperature, yerr[0], marker='*', ls='none', fillstyle='none', color='b' )
plt.plot(temperature, yerr[1], marker='*', ls='none', fillstyle='none', color='g' )
plt.errorbar(temperature, rate, yerr=yerr, marker='o', ls='none', fillstyle='none', color='r' )
plt.xscale('log')
plt.yscale('log')
plt.show()

enter image description here

有人知道这个问题是什么吗?

1 个答案:

答案 0 :(得分:2)

您正在犯一个基本错误。在第一个图中,您具有绝对的上下限,而没有误差线。误差线将是这些下限/上限与实际rate的差。在第二张图中,当您使用plt.errorbar(...)时,误差线始终相对于中心y值(在您的情况下为rate)进行定义。

因此,使用参数yerr=yerr时,实际较低误差线yerr[0])现在为rate - yerr[0],而实际较高误差线yerr[1] - rate

plt.plot(temperature, rate, marker='o', ls='none', fillstyle='none', color='r')
plt.plot(temperature, yerr[0], marker='*', ls='none', fillstyle='none', color='b' )
plt.plot(temperature, yerr[1], marker='*', ls='none', fillstyle='none', color='g' )

yerr[0] = rate - yerr[0] # Compute the actual error bar now
yerr[1] = yerr[1] - rate # Compute the actual error bar now
plt.errorbar(temperature, rate, yerr=yerr, marker='o', ls='none', fillstyle='none', color='r' )
plt.xscale('log')
plt.yscale('log')
plt.show()

enter image description here