如何在matplotlib同一画布上并排绘制多组字典数据的箱线图
双算法并排箱线图实现方案
核心逻辑是在原有2行2列子图框架不变的基础上,对同一参数b的位置做偏移,让两个算法的箱线左右并排,通过填充色区分算法类别,调整x轴刻度到两组箱线的居中位置即可。
具体修改点
- 固定箱线宽度为0.35,给两个算法分配不同的填充色,保证视觉区分度
- 每个b参数对应的基准x轴位置为1、2、3、4,自研算法箱线位置左移半宽,基线算法箱线位置右移半宽,避免重叠
- 分别绘制两组箱线后,将x轴刻度设置在两组箱线的中间点,标签保持原有b参数命名,不会出现错位
- 整张图添加统一图例说明颜色对应的算法类型
可直接运行的修改后代码
import matplotlib.pyplot as plt import numpy as np def plotComparisonResults(results_own, results_baseline, keys, own_name="自研算法", baseline_name="基线算法"): # 可自定义调整的样式参数 box_width = 0.35 color_own = "#2E86AB" # 自研算法箱线填充色 color_baseline = "#F24C4C" # 基线算法箱线填充色 fig, axs = plt.subplots(2, 2, figsize=(12, 10)) # 统一初始化所有子图坐标轴 for ax in axs.flat: ax.set_ylim(0, 1) ax.grid(axis='y', linestyle='--', alpha=0.6) ax.set_ylabel("F Score") count = 0 for i in (0, 1): for j in (0, 1): # 读取当前子图对应的a参数值,设置标题 current_a_val = str(keys[count][0][0:2]).strip('x,') axs[i, j].set_title(f'mean shift: {current_a_val}, iters={iterations}', fontweight="bold") # 过滤出两个算法都存在的参数键,避免键不匹配报错 current_b_keys = [k for k in keys[count] if k in results_own and k in results_baseline] b_count = len(current_b_keys) # 计算两组箱线的偏移位置,实现并排效果 pos_own = np.arange(1, b_count + 1) - box_width / 2 pos_baseline = np.arange(1, b_count + 1) + box_width / 2 # 提取两组算法的对应数据 data_own = [results_own[k] for k in current_b_keys] data_baseline = [results_baseline[k] for k in current_b_keys] # 分别绘制箱线 bp_own = axs[i, j].boxplot( data_own, positions=pos_own, widths=box_width, showfliers=False, patch_artist=True ) bp_baseline = axs[i, j].boxplot( data_baseline, positions=pos_baseline, widths=box_width, showfliers=False, patch_artist=True ) # 给箱线设置填充色 for patch in bp_own['boxes']: patch.set_facecolor(color_own) patch.set_alpha(0.75) for patch in bp_baseline['boxes']: patch.set_facecolor(color_baseline) patch.set_alpha(0.75) # 设置x轴刻度居中对齐每组并排箱线 axs[i, j].set_xticks(np.arange(1, b_count + 1)) axs[i, j].set_xticklabels(current_b_keys) count += 1 # 添加全局图例 fig.legend( [bp_own["boxes"][0], bp_baseline["boxes"][0]], [own_name, baseline_name], loc='upper right', bbox_to_anchor=(0.95, 0.95) ) plt.tight_layout() plt.show()
调用方式
直接传入两个算法的结果字典和原有键集合即可,和之前单算法绘图的传参逻辑基本一致:
plotComparisonResults(resultsOwnAlgorithm, resultsBaseline, keys)
注意:请保证两个结果字典的键命名规则完全一致,代码会自动过滤仅在单个字典中存在的键,避免因参数不匹配触发绘图报错。如果需要调整箱线宽度、配色,直接修改函数开头的三个样式参数即可。
内容的提问来源于stack exchange,提问作者user14471901
相关产品推荐
相关产品推荐

