You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Matplotlib对DataFrame分组后绘制并排箱线图

问题核心原因

代码出现箱线图叠加的根本原因:每次循环调用plt.boxplot时,未指定独立的绘图坐标轴,所有箱线图都默认绘制在同一个坐标轴的x=1位置,因此会完全重叠,无法形成并排排布效果。

两种实现并排箱线图的方案

方案1:独立子图水平并排(适配原有分组循环逻辑)

提前创建1行2列的水平子图网格,循环绘制时为每个分组分配对应的独立坐标轴,完全避免叠加。生成的两个箱线图是独立的绘图面板,左右排布,各自可单独调整样式。

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

df = pd.DataFrame(np.random.rand(10,1), columns=['A'])
df['B'] = [1, 2, 1, 1, 1, 2, 1, 2, 2, 1]

# 创建1行2列的水平并排子图,设置画布总尺寸
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 4))
# 遍历每个分组,匹配对应索引的子图轴绘图
for idx, (group_val, grp_df) in enumerate(df.groupby('B')):
    axes[idx].boxplot(x=grp_df['A'])
    axes[idx].set_title(f'B列分组取值:{group_val}')
# 自动调整子图间距,避免标题/坐标标签重叠
plt.tight_layout()
plt.show()

方案2:单绘图区同框并排箱线

如果不需要拆分独立子图,仅希望两个分组的箱线图在同一绘图区域内左右相邻排列,可以将所有分组的数值整理为嵌套列表,一次性传入boxplot方法,无需循环绘制。生成的两个箱线图共享同一套坐标轴,更方便直接对比两组的数据分布差异。

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

df = pd.DataFrame(np.random.rand(10,1), columns=['A'])
df['B'] = [1, 2, 1, 1, 1, 2, 1, 2, 2, 1]

# 按B列分组,提取每个分组的A列数值组成列表
group_value_list = [grp['A'].values for _, grp in df.groupby('B')]
group_labels = [f'B列分组:{val}' for val, _ in df.groupby('B')]
# 一次传入所有分组数据,直接生成并排的箱线图
plt.boxplot(group_value_list, labels=group_labels)

plt.show()

两种方案的适配场景差异:

  • 独立子图方案适合需要对单个分组做单独样式调整、隐藏部分坐标信息的展示场景
  • 单绘图区同框方案适合需要严格对齐坐标、直接对比两组数据分位数差异的分析场景

内容的提问来源于stack exchange,提问作者Python_newbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 09:24:01