下面横条图中间的误差黑线非常长,即使stds
是:
array([ 1.14428879e-01, 3.38164768e-01, 5.58287430e-01,
7.77484276e-01, 9.95380202e-01, 1.58493526e-08,
8.69720905e-02, 8.64435493e-02, 5.12989176e-03])
绘制此图的代码是:
pl.barh(ind,means,align='center',xerr=stds,ecolor='k', alpha=0.3)
这是为什么?
最佳答案
你图中的误差线是正确的。取最长的一个,值9.95380202e-01
=0.995380202
1.0
。当您将一个N×1的值数组传递到xerr
时,这些值将被标绘为该值的±即它们将跨越长度的两倍。因此,值为xerr
的1.0
将跨越2.0
个单位,从width - 1.0
到width + 1.0
。为了避免这种情况,您可以创建一个2×N数组,其中一行仅由零组成,请参见下面的示例。
来自pyplot.bar()
的文档(同样适用于pyplot.barh()
):
详细信息:xerr和yerr直接传递到errorbar()
,因此它们可以
也有2xN形状,用于独立的上下规格
错误。
从pyplot.errorbar()
的文档中:
xerr/yerr:[scalar | N、Nx1或2xN array like]
如果一个标量数,len(N)array-like对象,或者Nx1 array-like对象
对象,错误栏是在相对于数据的正负值处绘制的。
如果2xN形状序列,则在-row1和+row2处绘制错误条
相对于数据。
显示错误栏不同“组合”的示例:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(9)
y = np.random.rand(9) * 10
stds = np.array([1.14428879e-01, 3.38164768e-01, 5.58287430e-01,
7.77484276e-01, 9.95380202e-01, 1.58493526e-08,
8.69720905e-02, 8.64435493e-02, 5.12989176e-03])
# Create array with only positive errors
pos_xerr = np.vstack((np.zeros(len(stds)), stds))
# Create array with only negative errors
neg_xerr = np.vstack((stds, np.zeros(len(stds))))
#Create array with different positive and negative error
both_xerr = np.vstack((stds, np.random.rand(len(stds))*2))
fig, ((ax, ax2),(ax3, ax4)) = plt.subplots(2,2, figsize=(9,5))
# Plot centered errorbars (+/- given value)
ax.barh(x, y, xerr=stds, ecolor='k', align='center', alpha=0.3)
ax.set_title('+/- errorbars')
# Plot positive errorbars
ax2.barh(x, y, xerr=pos_xerr, ecolor='g', align='center', alpha=0.3)
ax2.set_title('Positive errorbars')
# Plot negative errorbars
ax3.barh(x, y, xerr=neg_xerr, ecolor='r', align='center', alpha=0.3)
ax3.set_title('Negative errorbars')
# Plot errorbars with different positive and negative error
ax4.barh(x, y, xerr=both_xerr, ecolor='b', align='center', alpha=0.3)
ax4.set_title('Different positive and negative error')
plt.tight_layout()
plt.show()
关于python - 条形图显示奇数误差线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18513842/