Python 分组后用平均值和标准值绘制误差条

Python 分组后用平均值和标准值绘制误差条,python,pandas,matplotlib,plot,Python,Pandas,Matplotlib,Plot,我有以下数据帧: 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.322

我有以下数据帧:

                    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
如果要绘制两条曲线(点+错误),使用索引列
“Insert”
作为X轴,并通过
“Quality”
[好,差]区分两条曲线,该怎么办?它们也应该有不同的颜色


我有点卡住了,除了我需要的那一个,我制作了每一种绘图。

你可以在
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()

要使两个绘图显示在同一轴上,请执行以下操作:

  • 创建自己的
    对象,ax
  • 在每次调用
    group.plot时,将
    ax
    参数设置为
    axes
    对象

  • 它可能看起来更像条形图:

    # 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()
    

    您想要一个平均值的条形图,并将标准偏差作为其周围的误差吗?还是一个线条图,用
    std
    作为阴影区域?您想要的输出是什么?平均值是点e,标准值是垂直线(如matplotlib.errorbar)