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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:42:15