2016-01-13 2 views
3

У меня есть следующий dataframe:Plotting errorbar со средним и стандом после группировки

    mean  std 
insert quality      
0.0 good  0.009905 0.003662 
0.1 good  0.450190 0.281895 
     poor  0.376818 0.306806 
0.2 good  0.801856 0.243288 
     poor  0.643859 0.322378 
0.3 good  0.833235 0.172025 
     poor  0.698972 0.263266 
0.4 good  0.842288 0.141925 
     poor  0.706708 0.241269 
0.5 good  0.853634 0.118604 
     poor  0.685716 0.208073 
0.6 good  0.845496 0.118609 
     poor  0.675907 0.207755 
0.7 good  0.826335 0.133820 
     poor  0.656934 0.222823 
0.8 good  0.829707 0.130154 
     poor  0.627111 0.213046 
0.9 good  0.816636 0.137371 
     poor  0.589331 0.232756 
1.0 good  0.801211 0.147864 
     poor  0.554589 0.245867 

Что я должен делать, если хотят построить 2 кривых (точки + ошибка), используя в качестве оси Х в колонке "Insert" и дифференциации две кривые на "Quality" [хорошо, плохо]? Они также должны быть разных цветов.

Я своего рода застрял, я продюсировал всякого рода сюжета, кроме того, мне нужно.

+0

Хотите ли вы бар сюжет среднего значения, со стандартным отклонением как ошибки вокруг него? Или линейный график, с 'std' в качестве заштрихованной области? Каков ваш желаемый результат? –

+0

mean - точка e std - это вертикальная линия (например, matplotlib.errorbar) –

ответ

7

Вы могли бы перебрать группы в df.groupby('quality') и вызвать group.plot по каждой группе.

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

df = pd.DataFrame({ 
    'insert': [0.0, 0.1, 0.1, 0.2, 0.2, 0.3, 0.3, 0.4, 0.4, 0.5, 0.5, 0.6, 0.6, 
    0.7, 0.7, 0.8, 0.8, 0.9, 0.9, 1.0, 1.0], 
    'mean': [0.009905, 0.45019, 0.376818, 0.801856, 0.643859, 0.833235, 
    0.698972, 0.842288, 0.706708, 0.853634, 0.685716, 0.845496, 0.675907, 
    0.826335, 0.656934, 0.829707, 0.627111, 0.816636, 0.589331, 0.801211, 
    0.554589], 
    'quality': ['good', 'good', 'poor', 'good', 'poor', 'good', 'poor', 'good', 
    'poor', 'good', 'poor', 'good', 'poor', 'good', 'poor', 'good', 'poor', 
    'good', 'poor', 'good', 'poor'], 
    'std': [0.003662, 0.281895, 0.306806, 0.243288, 0.322378, 0.172025, 
    0.263266, 0.141925, 0.241269, 0.118604, 0.208073, 0.118609, 0.207755, 
    0.13382, 0.222823, 0.130154, 0.213046, 0.137371, 0.232756, 0.147864, 
    0.245867]}) 

fig, ax = plt.subplots() # 1 

for key, group in df.groupby('quality'): 
    group.plot('insert', 'mean', yerr='std', label=key, ax=ax) # 2 

plt.show() 

enter image description here

Для того, чтобы оба графика появляются на одних и тех же осей:

  1. создать свой собственный axes объект, топор.
  2. установить параметр в axes объекта в каждом вызове ax к group.plot

Это может выглядеть лучше, как бар, сюжет:

# fill in missing data with 0, so the bar plots are aligned 
df = df.pivot(index='insert', columns='quality').fillna(0).stack().reset_index() 

colors = ['green', 'red'] 
positions = [0, 1] 

for group, color, pos in zip(df.groupby('quality'), colors, positions): 
    key, group = group 
    print(group) 
    group.plot('insert', 'mean', yerr='std', kind='bar', width=0.4, label=key, 
       position=pos, color=color, alpha=0.5, ax=ax) 

ax.set_xlim(-1, 11) 
plt.show() 

enter image description here

Смежные вопросы