dani reta
dani reta

Reputation: 69

errorbar not behaving in loglog plot

I have these arrays

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

When I plot the errors as individual points, their distances to the middle point is equal as expected

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

However, when I use the built-in function errorbar, I do not get the expected behaviour.

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

Does anyone know what the issue is?

Upvotes: 2

Views: 707

Answers (1)

Sheldore
Sheldore

Reputation: 39052

You are doing a fundamental mistake. In the first plot, you have absolute lower and upper bounds and not the error bars. The error bars will be the difference of these lower/upper bounds from the actual rate. In the second plot, when you use plt.errorbar(...), the error bars are always defined with respect to the center y-value (rate in your case).

So to use the argument yerr=yerr, the actual lower error bars (yerr[0]) will now be rate - yerr[0] while the actual upper error bars will be 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

Upvotes: 2

Related Questions