matplotlib 如何将误差条添加到条带图

6yjfywim  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(218)

我在使用Seaborn在Python中创建的图中添加误差条时遇到了一些困难。
我目前有一个'csv'格式的 Dataframe ;

TSMdatabase = 'TSMvsRunmaster.csv';
tsmdf = pd.read_csv(TSMdatabase, sep=',');

Dataframe的标题格式如下:

Run,TSMX_Value,TSMX_Error,TSMX+1_Value,TSMX+1_Error,Source

然后使用for循环读入不同的TSM值:

TSM = ['001', '002', '003', '004', '010', '011', '012', 
   '013', '016', '017', '101', '102', '104', '105', '106']

for x in TSM:
     tsm = x

最后,我给了我一张图:

plt.figure()
sns.set_style("darkgrid")
ax = sns.stripplot(x="Run", y='TSM'+str(tsm)+'_Value', hue="Source", data=tsmdf, 
                   jitter=True, palette="Set2", split=True)
plt.xticks(rotation=40)
plt.title('Run TSM'+str(tsm)+' Comparison')
plt.show()

不带误差线的特定TSM图

如果我尝试添加误差线,最终在每个子数据集的中间只有一个误差线:

每个源代码,Python和Matlab实际上在 Dataframe 中有自己的错误!
谁有什么主意!真的非常感谢!

w8biq8rn

w8biq8rn1#

绘制平均值+误差更适合sns.pointplot()而不是sns.stripplot()。Seaborn文件中指出了这一点:

sns.pointplot使用散点图图示符显示点估计值和置信区间。点图通过散点图点的位置表示数值变量的集中趋势估计值,并使用误差条提供该估计值周围的不确定性的一些指示。
sns.stripplot绘制一个散点图,其中一个变量是分类的。带状图可以单独绘制,但在您希望显示所有观察结果沿着潜在分布的一些表示的情况下,它也是对箱线图或小提琴图的很好补充。

如果您可以访问所有观测值,而不仅仅是平均值+误差,那么您可以通过以下方式实现您想要的结果:

import seaborn as sns
%matplotlib inline

tips = sns.load_dataset('tips')
sns.pointplot('sex', 'tip', hue='smoker',
    data=tips, dodge=True, join=False)

您可以使用ci参数将置信区间的类型从默认的95%更改为:

sns.pointplot('sex', 'tip', hue='smoker',
    data=tips, dodge=True, join=False, ci='sd')

在上文中,Seaborn计算了误差和集中趋势的测量值。如果您已经预先计算了这些值,则会有一点麻烦,因为目前不可能使用带有预先计算的误差条的sns.pointplot()。在使用sns.pointplot()绘制均值后,我使用plt.errorbar()添加误差:

ax = sns.pointplot('sex', 'tip', hue='smoker',
    data=tips, dodge=True, join=False, ci=None)

# Find the x,y coordinates for each point
x_coords = []
y_coords = []
for point_pair in ax.collections:
    for x, y in point_pair.get_offsets():
        x_coords.append(x)
        y_coords.append(y)

# Calculate the type of error to plot as the error bars
# Make sure the order is the same as the points were looped over
errors = tips.groupby(['smoker', 'sex']).std()['tip']
colors = ['steelblue']*2 + ['coral']*2
ax.errorbar(x_coords, y_coords, yerr=errors,
    ecolor=colors, fmt=' ', zorder=-1)

你也可以使用matplotlib直接绘制整个图,如果你手动提供x位置,类似于this example

相关问题