如何使用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
相关产品推荐
相关产品推荐

