如何在 Seaborn catplot 中指定自定义错误栏?

How to specify custom error bars in a Seaborn catplot?

我正在尝试使用 Python 中的 Seaborn 包可视化一些数据。特别是,我想使用 catplot(kind='bar') 函数(以前命名为 factorplot())。我的 DataFrame 看起来像这样(列 'x''col''row''hue' 是分类的):

   x  y        dy col row hue
0  4  9  0.766591   1   0   2
1  5  9  0.688683   0   1   0
2  0  7  0.707982   0   0   1
3  3  6  0.767210   2   1   0
4  3  8  0.287153   0   1   0

我想用不确定列'dy'来表示'y'的误差线。 Seaborn catplots 执行的默认引导程序或标准偏差误差条没有为我提供令人满意的解决方案。

这里我提供一个最小的完整可验证的例子:

import pandas as pd
import numpy.random as npr
import seaborn as sns

npr.seed(seed=0)
my_sz = 1000

df_x = pd.DataFrame(npr.randint(0,7,size=(my_sz, 1)), columns=['x'])
df_y = pd.DataFrame(npr.randint(5,10,size=(my_sz, 1)), columns=['y'])
df_dy = pd.DataFrame(npr.random(size=(my_sz, 1)), columns=['dy'])
df_col = pd.DataFrame(npr.randint(0,3,size=(my_sz, 1)), columns=['col'])
df_row = pd.DataFrame(npr.randint(0,2,size=(my_sz, 1)), columns=['row'])
df_hue = pd.DataFrame(npr.randint(0,3,size=(my_sz, 1)), columns=['hue'])

df = pd.concat([df_x, df_y, df_dy, df_col, df_row, df_hue], axis=1)

df[['x', 'col', 'row', 'hue']] =df[['x', 'col', 'row', 'hue']].astype('category')
    
cat_plt = sns.catplot(x='x',
                      y='y',
                      hue='hue',
                      data=df,
                      row='row',
                      col='col',
                      kind='bar',
                     );

带有默认误差线的 Seaborn 分类条形图

我尝试了以下 ,但我认为它不适用于多条形图。

提前感谢您的宝贵时间和帮助。

你可以这样做:

import pandas as pd
import numpy.random as npr
import seaborn as sns
import matplotlib.pyplot as plt

def errplot(x, y, yerr, hue, **kwargs):
    data = kwargs.pop('data')
    p = data.pivot_table(index=x, columns=hue, values=y, aggfunc='mean')
    err = data.pivot_table(index=x, columns=hue, values=yerr, aggfunc='mean')
    p.plot(kind='bar', yerr=err, ax=plt.gca(), **kwargs)

sns.set_theme()
npr.seed(seed=0)
my_sz = 1000

df_x = pd.DataFrame(npr.randint(0, 7, size=(my_sz, 1)), columns=['x'])
df_y = pd.DataFrame(npr.randint(5, 10, size=(my_sz, 1)), columns=['y'])
df_dy = pd.DataFrame(npr.random(size=(my_sz, 1)), columns=['dy'])
df_col = pd.DataFrame(npr.randint(0, 3, size=(my_sz, 1)), columns=['col'])
df_row = pd.DataFrame(npr.randint(0, 2, size=(my_sz, 1)), columns=['row'])
df_hue = pd.DataFrame(npr.randint(0, 3, size=(my_sz, 1)), columns=['hue'])

df = pd.concat([df_x, df_y, df_dy, df_col, df_row, df_hue], axis=1)
df[['x', 'col', 'row', 'hue']] = df[['x', 'col', 'row', 'hue']].astype('category')

g = sns.FacetGrid(df, row='row', col='col')
g.map_dataframe(errplot, "x", "y", "dy", "hue", color=['blue', 'orange', 'green'], width=0.8)

plt.subplots_adjust(right=0.90)
plt.legend(loc='center left', bbox_to_anchor=(1,1))

plt.show()

改编自

输出: