matplotlib 条形图,每个条具有不同的误差线
matplotlib bar chart with different error bars for each bar
我正在尝试创建一个条形图来显示每个组的 95% 置信区间。显然,由于它们是 95% 的置信区间,因此它们是不对称的。但是,我遇到的问题是我无法弄清楚如何使每个组(即每个条)的每个 95%CI 条都不同,因为显然每个条都不同。
我的代码如下:
meanPassivePSE = np.mean(PSE_PASSIVE)
stdPassivePSE = np.std(PSE_PASSIVE)
meanActivePSE= np.mean(PSE_ACTIVE_HUMAN)
stdActivePSE = np.std(PSE_ACTIVE_HUMAN)
meanRoboticPSE=np.mean(PSE_ACTIVE_ROBOT)
stdRoboticPSE = np.std(PSE_ACTIVE_ROBOT)
#95%conf intervals
confInterval95Passive = stats.norm.interval(0.95, loc=meanPassivePSE, scale=stdPassivePSE/np.sqrt(len(PSE_PASSIVE)))
confInterval95Active = stats.norm.interval(0.95, loc=meanActivePSE, scale=stdActivePSE/np.sqrt(len(PSE_ACTIVE_HUMAN)))
confInterval95Robot = stats.norm.interval(0.95, loc=meanRoboticPSE, scale=stdRoboticPSE/np.sqrt(len(PSE_ACTIVE_ROBOT)))
conditions = 'Passive', 'Active Human', 'Active Robot'
yPos = np.arange(len(conditions))
PSE = [meanPassivePSE, meanActivePSE, meanRoboticPSE]
plt.bar(yPos, PSE, align='center', alpha=0.5, color=('g','b','r'), yerr = (????) )
#plt.errorbar(confInterval95Passive[0], confInterval95Passive[1])
plt.xticks(yPos,conditions)
plt.ylabel('Point of Subject Equality (ms)')
plt.title('Average Point of Subjective Equality in each Condition')
plt.show()
因此,例如:
`confInterval95Passive[0],confInterval95Passive[1] = 2.71596442574 4.13221200188`
但是对于三组(被动、主动和机器人)中的每一组,这些统计数据都是不同的。那么如何使条形图具有三个不同的条,三个不同且不对称的误差条?我认为它应该在 'yerr=' 参数中处理?
感谢您的帮助!!
我是这样解决问题的:
yerrs = [[meanPassivePSE-confInterval95Passive[0], confInterval95Active-confInterval95Active[0], confInterval95Robot-confInterval95Robot[0]],
[[confInterval95Passive[1]-meanPassivePSE, confInterval95Active[1]-confInterval95Active, confInterval95Robot[1]-confInterval95Robot]]
- ax.errorbars 使用从平均值
到 add/substract 的值
- 因此计算出的置信区间需要用平均值来规范化
- 稍后 ax.errorbars adds/substracts 再次使用这些值。
现在可以将参数放入 bar()-方法
plt.bar(yPos, PSE, align='center', alpha=0.5, color=('g','b','r'), yerr = yerrs )
我正在尝试创建一个条形图来显示每个组的 95% 置信区间。显然,由于它们是 95% 的置信区间,因此它们是不对称的。但是,我遇到的问题是我无法弄清楚如何使每个组(即每个条)的每个 95%CI 条都不同,因为显然每个条都不同。
我的代码如下:
meanPassivePSE = np.mean(PSE_PASSIVE)
stdPassivePSE = np.std(PSE_PASSIVE)
meanActivePSE= np.mean(PSE_ACTIVE_HUMAN)
stdActivePSE = np.std(PSE_ACTIVE_HUMAN)
meanRoboticPSE=np.mean(PSE_ACTIVE_ROBOT)
stdRoboticPSE = np.std(PSE_ACTIVE_ROBOT)
#95%conf intervals
confInterval95Passive = stats.norm.interval(0.95, loc=meanPassivePSE, scale=stdPassivePSE/np.sqrt(len(PSE_PASSIVE)))
confInterval95Active = stats.norm.interval(0.95, loc=meanActivePSE, scale=stdActivePSE/np.sqrt(len(PSE_ACTIVE_HUMAN)))
confInterval95Robot = stats.norm.interval(0.95, loc=meanRoboticPSE, scale=stdRoboticPSE/np.sqrt(len(PSE_ACTIVE_ROBOT)))
conditions = 'Passive', 'Active Human', 'Active Robot'
yPos = np.arange(len(conditions))
PSE = [meanPassivePSE, meanActivePSE, meanRoboticPSE]
plt.bar(yPos, PSE, align='center', alpha=0.5, color=('g','b','r'), yerr = (????) )
#plt.errorbar(confInterval95Passive[0], confInterval95Passive[1])
plt.xticks(yPos,conditions)
plt.ylabel('Point of Subject Equality (ms)')
plt.title('Average Point of Subjective Equality in each Condition')
plt.show()
因此,例如:
`confInterval95Passive[0],confInterval95Passive[1] = 2.71596442574 4.13221200188`
但是对于三组(被动、主动和机器人)中的每一组,这些统计数据都是不同的。那么如何使条形图具有三个不同的条,三个不同且不对称的误差条?我认为它应该在 'yerr=' 参数中处理?
感谢您的帮助!!
我是这样解决问题的:
yerrs = [[meanPassivePSE-confInterval95Passive[0], confInterval95Active-confInterval95Active[0], confInterval95Robot-confInterval95Robot[0]],
[[confInterval95Passive[1]-meanPassivePSE, confInterval95Active[1]-confInterval95Active, confInterval95Robot[1]-confInterval95Robot]]
- ax.errorbars 使用从平均值 到 add/substract 的值
- 因此计算出的置信区间需要用平均值来规范化
- 稍后 ax.errorbars adds/substracts 再次使用这些值。
现在可以将参数放入 bar()-方法
plt.bar(yPos, PSE, align='center', alpha=0.5, color=('g','b','r'), yerr = yerrs )