【问题标题】:side-by-side boxplot with multiple Pandas DataFrames具有多个 Pandas DataFrames 的并排箱线图
【发布时间】:2019-10-23 10:21:27
【问题描述】:

尽管本网站之前有一些很好的示例,但我无法在一个绘图中为多个 pandas DataFrame 生成并排的框。

我试过了:

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

df = pd.DataFrame({'A1':[9,16.2,8.1],'A2':[3.3,21.5,4.1],
                   'B1':[8,9.8,1.6],'B2':[10.8,2.2,3.6],
                   'C1':[1.3,2.8,1.6],'C2':[3.1,4.1,3.6],})

df1 = df.loc[:, 'A1':'A2']
df2 = df.loc[:, 'B1':'B2']
df3 = df.loc[:, 'C1':'C2']

fig = matplotlib.pyplot.boxplot(df1)
fig = matplotlib.pyplot.boxplot(df2)
fig = matplotlib.pyplot.boxplot(df3)
plt.show()

但我想要这样的东西:

此外,如果我可以将各个数据点显示为框中的点,那就太好了。因此,如果有人对此也有建议,那就太好了!

谢谢!

【问题讨论】:

    标签: python pandas matplotlib boxplot


    【解决方案1】:

    如果我理解正确,你想要 6 个箱线图,每组 3 个,每组 2 个(每组是 A/B/C,每组内你有 1/2)?

    您可以使用 seabord 轻松实现所需的结果,但您必须首先以“长格式”重构您的数据框。 我首先使用pd.wide_to_long() 将数据拆分为 3 组 A/B/C 中的数据,并使用一个新列标识子组 1/2,然后我进一步使用melt 生成的数据帧以获得长格式数据帧:

    df = pd.DataFrame({'A1':[9,16.2,8.1],'A2':[3.3,21.5,4.1],
                       'B1':[8,9.8,1.6],'B2':[10.8,2.2,3.6],
                       'C1':[1.3,2.8,1.6],'C2':[3.1,4.1,3.6],})
    
    df["id"] = df.index
    df = pd.wide_to_long(df, stubnames=['A','B','C'], i='id', j='group').reset_index().drop('id', axis=1)
    df = df.melt(id_vars='group')
    

    生成的数据框现在是这样的:

        group   variable    value
    0   1   A   9.0
    1   1   A   16.2
    2   1   A   8.1
    3   2   A   3.3
    4   2   A   21.5
    5   2   A   4.1
    6   1   B   8.0
    7   1   B   9.8
    8   1   B   1.6
    9   2   B   10.8
    10  2   B   2.2
    11  2   B   3.6
    12  1   C   1.3
    13  1   C   2.8
    14  1   C   1.6
    15  2   C   3.1
    16  2   C   4.1
    17  2   C   3.6
    

    然后使用seaborn's boxplot 生成绘图就很简单了:

    sns.boxplot(data=df, x='variable', y='value', hue='group')
    

    如果您愿意,您可以在箱线图顶部叠加一个 swarmplot 以查看各个数据点

    sns.boxplot(data=df, x='variable', y='value', hue='group')
    sns.swarmplot(data=df, x='variable', y='value', hue='group', dodge=True, palette=['grey','grey'], s=10)
    

    【讨论】:

    • 非常感谢您的回答!正是我想要的。
    猜你喜欢
    • 2017-08-03
    • 2017-12-12
    • 2019-03-19
    • 2018-02-16
    • 2018-05-16
    • 2015-12-20
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多