如何在基础绘图中添加带特定数值的垂直散点标记?
问题:如何在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
相关产品推荐
相关产品推荐

