Графики ошибок в графике данных с использованием Seaborn FacetGrid
Я хочу построить столбцы ошибок из столбца в кадре данных панд на Seaborn FacetGrid
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar']*2,
'B' : ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C' : np.random.randn(8),
'D' : np.random.randn(8)})
df
Пример кадра данных
A B C D
0 foo one 0.445827 -0.311863
1 bar one 0.862154 -0.229065
2 foo two 0.290981 -0.835301
3 bar three 0.995732 0.356807
4 foo two 0.029311 0.631812
5 bar two 0.023164 -0.468248
6 foo one -1.568248 2.508461
7 bar three -0.407807 0.319404
Этот код работает для полос ошибок фиксированного размера:
g = sns.FacetGrid(df, col="A", hue="B", size =5)
g.map(plt.errorbar, "C", "D",yerr=0.5, fmt='o');
Но я не могу заставить его работать, используя значения из фрейма данных
df['E'] = abs(df['D']*0.5)
g = sns.FacetGrid(df, col="A", hue="B", size =5)
g.map(plt.errorbar, "C", "D", yerr=df['E']);
или же
g = sns.FacetGrid(df, col="A", hue="B", size =5)
g.map(plt.errorbar, "C", "D", yerr='E');
оба производят списки ошибок
РЕДАКТИРОВАТЬ:
После большого количества чтения документации по matplotlib и различных ответов на вопросы stackru, вот чистое решение matplotlib
#define a color palette index based on column 'B'
df['cind'] = pd.Categorical(df['B']).labels
#how many categories in column 'A'
cats = df['A'].unique()
cats.sort()
#get the seaborn colour palette and convert to array
cp = sns.color_palette()
cpa = np.array(cp)
#draw a subplot for each category in column "A"
fig, axs = plt.subplots(nrows=1, ncols=len(cats), sharey=True)
for i,ax in enumerate(axs):
df_sub = df[df['A'] == cats[i]]
col = cpa[df_sub['cind']]
ax.scatter(df_sub['C'], df_sub['D'], c=col)
eb = ax.errorbar(df_sub['C'], df_sub['D'], yerr=df_sub['E'], fmt=None)
a, (b, c), (d,) = eb.lines
d.set_color(col)
Кроме меток, а ось ограничивает ее ОК. Для каждой категории в столбце "A" был нанесен отдельный субплот, окрашенный категорией в столбце "B". (Обратите внимание, что случайные данные отличаются от приведенных выше)
Я все еще хотел бы решение панды / моря, если у кого-нибудь есть какие-нибудь идеи?
2 ответа
Когда используешь FacetGrid.map
все, что относится к data
DataFrame должен быть передан как позиционный аргумент. Это будет работать в вашем случае, потому что yerr
третий позиционный аргумент для plt.errorbar
Однако для демонстрации я собираюсь использовать набор данных tips:
from scipy import stats
tips_all = sns.load_dataset("tips")
tips_grouped = tips_all.groupby(["smoker", "size"])
tips = tips_grouped.mean()
tips["CI"] = tips_grouped.total_bill.apply(stats.sem) * 1.96
tips.reset_index(inplace=True)
Я могу затем построить с помощью FacetGrid
а также errorbar
:
g = sns.FacetGrid(tips, col="smoker", size=5)
g.map(plt.errorbar, "size", "total_bill", "CI", marker="o")
Однако имейте в виду, что существуют функции построения морских графиков для перехода от полного набора данных к графикам с панелями ошибок (с использованием начальной загрузки), поэтому для многих приложений это может не понадобиться. Например, вы можете использовать factorplot
:
sns.factorplot("size", "total_bill", col="smoker",
data=tips_all, kind="point")
Или же lmplot
:
sns.lmplot("size", "total_bill", col="smoker",
data=tips_all, fit_reg=False, x_estimator=np.mean)
Вы не показываете, что df['E']
на самом деле, и если это список такой же длины, как df['C']
а также df['D']
,
yerr
Аргумент ключевого слова (kwarg) принимает либо одно значение, которое будет применено для каждого элемента в списках для ключей C и D из фрейма данных, либо ему нужен список значений той же длины, что и эти списки.
Таким образом, C, D и E должны быть связаны со списками одинаковой длины, или C и D должны быть списками одинаковой длины, а E должны быть связаны с одним списком. float
или же int
, Если это единственный float
или же int
находится внутри списка, вы должны извлечь его, как df['E'][0]
,
пример matplotlib
код с yerr
: http://matplotlib.org/1.2.1/examples/pylab_examples/errorbar_demo.html
Описание API гистограммы yerr
: http://matplotlib.org/api/pyplot_api.html