pandas 中两组的箱线图

Ale*_*xis 4 python matplotlib boxplot pandas

我有以下数据集:

df_plots = pd.DataFrame({'Group':['A','A','A','A','A','A','B','B','B','B','B','B'],
                         'Type':['X','X','X','Y','Y','Y','X','X','X','Y','Y','Y'],
                         'Value':[1,1.2,1.4,1.3,1.8,1.5,15,19,18,17,12,13]})
df_plots
    Group   Type    Value
0   A       X       1.0
1   A       X       1.2
2   A       X       1.4
3   A       Y       1.3
4   A       Y       1.8
5   A       Y       1.5
6   B       X       15.0
7   B       X       19.0
8   B       X       18.0
9   B       Y       17.0
10  B       Y       12.0
11  B       Y       13.0
Run Code Online (Sandbox Code Playgroud)

我想Group在每个图中创建箱线图(示例中有两个)并按类型显示。我已经尝试过这个:

fig, axs = plt.subplots(1,2,figsize=(8,6), sharey=False)
axs = axs.flatten()

for i, g in enumerate(df_plots[['Group','Type','Value']].groupby(['Group','Type'])):
    g[1].boxplot(ax=axs[i])
Run Code Online (Sandbox Code Playgroud)
  • 结果为IndexError,因为循环尝试创建 4 个绘图。
df_plots = pd.DataFrame({'Group':['A','A','A','A','A','A','B','B','B','B','B','B'],
                         'Type':['X','X','X','Y','Y','Y','X','X','X','Y','Y','Y'],
                         'Value':[1,1.2,1.4,1.3,1.8,1.5,15,19,18,17,12,13]})
df_plots
    Group   Type    Value
0   A       X       1.0
1   A       X       1.2
2   A       X       1.4
3   A       Y       1.3
4   A       Y       1.8
5   A       Y       1.5
6   B       X       15.0
7   B       X       19.0
8   B       X       18.0
9   B       Y       17.0
10  B       Y       12.0
11  B       Y       13.0
Run Code Online (Sandbox Code Playgroud)

然后我尝试了这个:

fig, axs = plt.subplots(1,2,figsize=(8,6), sharey=False)
axs = axs.flatten()

for i, g in enumerate(df_plots[['Group','Type','Value']].groupby(['Group','Type'])):
    g[1].boxplot(ax=axs[i], by=['Group','Type'])
Run Code Online (Sandbox Code Playgroud)

但不,我也有同样的问题。预期结果应该只有两个图,每个图的每种类型都有一个盒须图。这是这个想法的草图:

在此输入图像描述

请提供任何帮助,我们将不胜感激,通过这段代码,我可以控制数据的某些方面,而seaborn 无法控制这些方面。

Hen*_*ker 6

我们可以使用groupby boxplot每个子图创建子图Group,然后用 分隔每个boxplot子图Type

fig, axes = plt.subplots(1, 2, figsize=(8, 6), sharey=False)
df_plots.groupby('Group').boxplot(by='Type', ax=axes)
plt.show()
Run Code Online (Sandbox Code Playgroud)

或者不subplots通过函数调用直接传递参数:

axes = df_plots.groupby('Group').boxplot(by='Type', figsize=(8, 6),
                                         layout=(1, 2), sharey=False)
plt.show()
Run Code Online (Sandbox Code Playgroud)

阴谋


数据和导入:

import pandas as pd
from matplotlib import pyplot as plt

df_plots = pd.DataFrame({
    'Group': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'],
    'Type': ['X', 'X', 'X', 'Y', 'Y', 'Y', 'X', 'X', 'X', 'Y', 'Y', 'Y'],
    'Value': [1, 1.2, 1.4, 1.3, 1.8, 1.5, 15, 19, 18, 17, 12, 13]
})
Run Code Online (Sandbox Code Playgroud)

  • 我很惊讶 `by='Type'` 似乎无法与 `df_plots.groupby('Group').plot(kind='box', by='Type', Figsize=(8, 6) 正常工作, 布局=(1, 2), sharey=False)` (2认同)
  • 在我的快速(并且绝不是对某些源代码的全面阅读)中,“by”似乎被传递给“matplotlib.pyplot.boxplot”,它不处理“by”,而“groupby.boxplot” ` 传递给 `DataFrame.boxplot`,后者处理 `by` 并将剩余值传递给 `matplotlib.pyplot.boxplot`。 (2认同)