Python中为合并数据后的分组箱线图添加两类图例
箱线图分组图例实现方案
直接合并DataFrame后绘制箱线图时,每列会自动生成单独的图例项,无法直接按原DataFrame分组显示图例。以下是两种可行的解决思路:
方法一:手动构建自定义图例
先绘制完整箱线图,为两组箱线设置对应颜色,再用matplotlib的Patch创建分组图例:
import matplotlib.pyplot as plt import pandas as pd import numpy as np from matplotlib.patches import Patch # 模拟数据(替换为你的真实数据) df1 = pd.DataFrame(np.random.randn(60, 20)) df2 = pd.DataFrame(np.random.randn(60, 20)) df_combined = pd.concat([df1, df2], axis=1) # 绘制箱线图,开启patch_artist以支持填充色 box_plot = plt.boxplot(df_combined.values, patch_artist=True) # 为df1对应列(前20个)设置红色填充,df2对应列(后20个)设置金色填充 for patch in box_plot['boxes'][:20]: patch.set_facecolor('red') for patch in box_plot['boxes'][20:]: patch.set_facecolor('gold') # 创建自定义图例元素,仅保留分组标签 legend_elements = [ Patch(facecolor='red', label='A'), Patch(facecolor='gold', label='B') ] plt.legend(handles=legend_elements) plt.show()
方法二:拆分DataFrame分别绘制
将两个原DataFrame分开绘制箱线图,指定位置避免重叠,直接用每组的第一个箱线元素生成图例:
import matplotlib.pyplot as plt import pandas as pd import numpy as np # 模拟数据(替换为你的真实数据) df1 = pd.DataFrame(np.random.randn(60, 20)) df2 = pd.DataFrame(np.random.randn(60, 20)) # 设置两组箱线的位置,确保不重叠 positions_df1 = np.arange(1, 21) positions_df2 = np.arange(21, 41) # 绘制df1的箱线图,红色填充 box1 = plt.boxplot( df1.values, positions=positions_df1, patch_artist=True, labels=[f'col_{i}' for i in range(1, 21)] ) for patch in box1['boxes']: patch.set_facecolor('red') # 绘制df2的箱线图,金色填充 box2 = plt.boxplot( df2.values, positions=positions_df2, patch_artist=True, labels=[f'col_{i}' for i in range(21, 41)] ) for patch in box2['boxes']: patch.set_facecolor('gold') # 用两组的第一个箱线元素创建图例 plt.legend([box1['boxes'][0], box2['boxes'][0]], ['A', 'B']) plt.xticks(rotation=45) # 可选:旋转x轴标签避免重叠 plt.show()
两种方案对比:
- 方法一更适合已合并DataFrame的场景,无需调整位置,代码简洁。
- 方法二更灵活,可单独控制两组箱线的样式和位置,适合需要对两组做差异化设置的场景。
内容的提问来源于stack exchange,提问作者Mohsen Ali
相关产品推荐
相关产品推荐

