如何将Pandas分组箱线图作为子图合并并设置独立Y轴
将分组箱线图合并为同一画布的子图
我来帮你搞定这个问题!要把每个特征的分组箱线图整合到同一个画布的子图里,只需要结合matplotlib的子图功能和pandas的boxplot方法就能轻松实现,具体操作如下:
完整实现步骤
- 导入必要的库:除了你已经用到的
pandas和random,还需要导入matplotlib.pyplot来管理画布和子图。 - 创建画布与子图:根据特征数量(这里是A、B、C三个特征),创建对应数量的子图布局。
- 循环绘制子图:遍历每个特征,在对应的子图上绘制分组箱线图,通过
ax参数指定绘制的子图位置。 - 优化布局与样式:调整子图间距、标题等,避免元素重叠,提升图表可读性。
完整代码示例
import pandas as pd import random import matplotlib.pyplot as plt # 构造数据(适配Python3:xrange已改为range) df = pd.DataFrame(data={ 'A': random.sample(range(60, 100), 10), 'B': random.sample(range(20, 40), 10), 'C': random.sample(range(2000, 3010), 10), 'type': list(3*'K') + list(3*'L') + list(4*'M') }) # 创建画布和子图:1行3列,设置合适的画布大小 fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15, 6)) # 遍历每个特征,在对应子图绘制箱线图 for i, el in enumerate(df.columns[:-1]): # 指定ax参数,将箱线图绑定到对应子图 df.boxplot(column=el, by='type', ax=axes[i]) # 自定义子图标题,替换默认标题 axes[i].set_title(f'Boxplot of {el} by type') # 移除pandas自动添加的全局顶部标题 axes[i].get_figure().suptitle('') # 自动调整子图间距,避免标签重叠 plt.tight_layout() # 显示最终图表 plt.show()
关键细节说明
subplots参数:nrows和ncols控制子图的行列数,这里因为有3个特征,设置为1行3列;figsize可根据需求调整画布宽高。ax参数:这是实现多子图整合的核心,通过它指定当前箱线图要绘制到哪个子图上,确保所有图表都在同一个画布内。- 标题调整:pandas的
boxplot默认会添加重复的全局标题,通过set_title()自定义子图标题,suptitle('')清空全局标题,让图表逻辑更清晰。
内容的提问来源于stack exchange,提问作者mati
相关产品推荐
相关产品推荐

