Как указать пользовательские панели ошибок в catblot Seaborn?
Я пытаюсь визуализировать некоторые данные, используя пакет Seaborn в Python. В частности, я хотел бы использовать 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, не дают мне удовлетворительного решения.
Здесь я приведу пример минимальной полной проверки:
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 категорический гистограмма с ошибками по умолчанию
Я попробовал следующее решение, но я думаю, что оно не работает с многобарочными графиками.
Заранее спасибо за ваше время и вашу помощь.
1 ответ
Вы можете сделать это следующим образом:
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()
Адаптировано из этого ответа .
Выход: