Python 2.7和Pandas Boxplot连接中值

时间:2017-05-18 05:19:16

标签: python pandas plot line boxplot

似乎绘制一条连接箱形图平均值的线条是一件简单的事情,但我无法弄清楚如何在熊猫中做这个情节。

我正在使用此语法来执行boxplot,以便它自动生成Y对X设备的方框图,而无需对数据框进行外部操作:

df.boxplot(column='Y_Data', by="Category", showfliers=True, showmeans=True)

enter image description here

我想做的一种方法是通过从箱线图中获取平均值来做一个线图,但我不确定如何从图中提取该信息。

1 个答案:

答案 0 :(得分:3)

您可以保存从df.boxplot()返回的轴对象,并使用同一轴将平均值绘制为线图。我建议使用Seaborn的pointplot作为线条,因为它可以很好地处理分类的x轴。

首先让我们生成一些样本数据:

import pandas as pd
import numpy as np
import seaborn as sns

N = 150
values = np.random.random(size=N)
groups = np.random.choice(['A','B','C'], size=N)
df = pd.DataFrame({'value':values, 'group':groups})

print(df.head())
  group     value
0     A  0.816847
1     A  0.468465
2     C  0.871975
3     B  0.933708
4     A  0.480170
              ...

接下来,制作箱形图并保存轴对象:

ax = df.boxplot(column='value', by='group', showfliers=True, 
                positions=range(df.group.unique().shape[0]))

注意:Pyplot / Pandas positions中存在一个奇怪的boxplot()参数,这可能导致一个错误。请参阅this discussion中的详细信息,包括我在此处使用的解决方法。

最后,使用groupby获取类别均值,然后将平均值与重叠在箱线图顶部的线图连接:

sns.pointplot(x='group', y='value', data=df.groupby('group', as_index=False).mean(), ax=ax)

boxplot

您的标题提到“中位数”,但您在帖子中谈到了类别方法。我在这里使用了手段;如果您想要绘制中位数,请将groupby聚合更改为median()