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

如何在基础绘图中添加带特定数值的垂直散点标记?

问题:如何在Matplotlib中添加带最值的垂直线段标记

我尝试复现一篇论文中的图表,该图表展示了五次运行的平均准确率,垂直线段表示准确率的最小值和最大值。请问如何在现有绘图中添加这类带有特定数值的垂直散点标记?

以下是我当前的代码:

def plot_losses(losses: Dict[float, Dict[float, List[float]]]) -> None:
    """
    Plot the evolution of the loss regarding the sparsity level and iteration step

    Args:
        losses (Dict[float, Dict[float, List[float]]]): Dict containing the losses regarding the sparsity level and iteration step
    """

    plt.clf()

    plt.figure(figsize=(20, 10))
    plt.tight_layout()

    sparsity_levels = [round(sparsity_level, 2) for sparsity_level in losses.keys()]

    for sparsity_level, key in zip(sparsity_levels, losses.keys()):
        plt.plot(list(losses[key].keys()), list(losses[key].values()), '+--', label=f"{100 - sparsity_level:.2f}%")

    plt.show()

解决方案

你的数据结构losses按稀疏度层级存储,每个层级下的迭代步骤对应一组多次运行的数值列表。要实现目标效果,需要先计算每个迭代步骤的均值、最小值和最大值,再绘制均值曲线,最后添加连接最值的垂直线段(可选标注数值)。

修改后的代码如下:

import matplotlib.pyplot as plt
from typing import Dict, List
import numpy as np

def plot_losses(losses: Dict[float, Dict[float, List[float]]]) -> None:
    """
    绘制不同稀疏度下损失值/准确率随迭代步骤的变化,添加最值垂直线段和均值曲线
    """
    plt.clf()
    plt.figure(figsize=(20, 10))
    plt.tight_layout()

    sparsity_levels = [round(sparsity_level, 2) for sparsity_level in losses.keys()]

    for sparsity_level, key in zip(sparsity_levels, losses.keys()):
        # 获取当前稀疏度对应的迭代步骤和多次运行的数值列表
        steps = list(losses[key].keys())
        run_values = list(losses[key].values())
        
        # 计算每个步骤的均值、最小值、最大值
        mean_vals = [np.mean(vals) for vals in run_values]
        min_vals = [np.min(vals) for vals in run_values]
        max_vals = [np.max(vals) for vals in run_values]
        
        # 绘制均值曲线(对应论文中的平均准确率线)
        plt.plot(steps, mean_vals, '+--', label=f"{100 - sparsity_level:.2f}%")
        
        # 绘制垂直线段:每个x位置连接最小值和最大值
        current_color = plt.gca().lines[-1].get_color()
        for x, y_min, y_max in zip(steps, min_vals, max_vals):
            plt.plot([x, x], [y_min, y_max], color=current_color, linewidth=2)
            
            # 可选:添加最值数值标记,避免遮挡
            plt.text(x, y_min, f"{y_min:.2f}", ha='center', va='top', fontsize=8)
            plt.text(x, y_max, f"{y_max:.2f}", ha='center', va='bottom', fontsize=8)

    # 完善图表标注
    plt.xlabel("迭代步骤")
    plt.ylabel("准确率/损失值")
    plt.legend(title="保留密度")
    plt.grid(True, alpha=0.3)
    plt.show()

关键说明

  • 统计值计算:借助numpy的统计函数,快速得到每个迭代步骤下多次运行的均值、最小值和最大值。
  • 垂直线段绘制:遍历每个迭代步骤,在相同x坐标处绘制垂直线段,颜色和对应均值曲线保持一致,保证视觉统一性。
  • 数值标记(可选):用plt.text在垂直线两端标注具体数值,通过调整对齐方式避免遮挡曲线。

注意事项

  • 确保losses中每个迭代步骤对应的List[float]是多次运行的结果(比如五次运行的数值)。
  • 若不需要数值标记,直接删除plt.text相关代码即可。
  • 可根据需求调整线段粗细、颜色透明度等样式,优化图表美观度。

内容的提问来源于stack exchange,提问作者Thytu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:50:31