在分组后使用mean和std绘制错误栏

Mar*_*nto 4 python plot matplotlib pandas

我有以下数据帧:

                    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
Run Code Online (Sandbox Code Playgroud)

如果想要绘制2条曲线(点+误差),使用索引列作为X轴"Insert"并将两条曲线区分为"Quality"[good,poor],我该怎么办?它们也应该是不同的颜色.

我有点卡住,我制作了各种各样的情节.

unu*_*tbu 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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

要使两个图显示在相同的轴上:

  1. 创建自己的axes 对象,ax.
  2. 在每次调用时将ax参数设置为axes对象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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述