Графики ошибок в графике данных с использованием 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

Другие вопросы по тегам