errorbar 在 loglog 图中没有表现

errorbar not behaving in loglog plot

我有这些数组

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()

但是,当我使用内置函数 errorbar 时,我没有得到预期的行为。

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()

有人知道问题出在哪里吗?

你犯了一个根本性的错误。在第一个图中,您有绝对的下限和上限,而不是误差线。误差线将是这些 lower/upper 范围与实际 rate 范围的差异。在第二个图中,当您使用 plt.errorbar(...) 时,误差线总是相对于中心 y-value(在您的情况下为 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()