【问题标题】:How to connect boxplot median valuesPython 2.7 和 Pandas Boxplot 连接中值
【发布时间】:2017-10-17 18:14:12
【问题描述】:

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

我正在使用这种语法来制作箱线图,以便它自动生成 Y 与 X 设备的箱线图,而无需对数据框进行外部操作:

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

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

【问题讨论】:

    标签: python pandas plot line boxplot


    【解决方案1】:

    您可以保存从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 boxplot() 中有一个奇怪的 positions 参数,它可能会导致一个错误。在this discussion 中查看更多信息,包括我在这里采用的解决方法。

    最后,使用groupby 获取类别均值,然后将均值与覆盖在箱线图顶部的线图连接起来:

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

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

    【讨论】:

    • 一个很好的答案!我没有使用 Seaborn 包,但看起来这样做是一个合乎逻辑的选择,而且我已经拥有所有依赖项。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2018-05-28
    相关资源
    最近更新 更多