matplotlib:如何将崎岖的折线图画成光滑的曲线图

诸神缄默不语-个人优快云博文目录

我例子是用jupyter notebook写的,为了正常显示图片,尤其是正常显示中文,需要先:

%matplotlib inline
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

数据是:

import random
acc1=[random.uniform(0.5,0.6) for _ in range(10)]
acc2=[random.uniform(0.4,0.5) for _ in range(10)]

1. 绘制原始折线图

示例图:
在这里插入图片描述
代码:

plt.title('示例图片:模拟模型双accuracy绘图')
plt.plot(acc1, label="训练集acc")
plt.plot(acc2, label="验证集acc")
plt.legend()
plt.show()
plt.close()

2. 通过插值绘制光滑的曲线图

示例图:
在这里插入图片描述

插值一般用的是SciPy的包:https://docs.scipy.org/doc/scipy-1.15.0/reference/interpolate.html
可以根据你的数据的具体模式来选择插值算法,在这里我用的是https://docs.scipy.org/doc/scipy-1.15.0/reference/generated/scipy.interpolate.make_interp_spline.html,根据给定的点绘制出曲线B样条,然后用这个B样条就可以生成足够多的数据,使得折线图显得足够光滑,以至于像一条曲线图。
至于“什么是B样条”这个问题,我也没看懂什么是B样条,我只能说,反正能用。

代码:

import numpy as np
from scipy.interpolate import make_interp_spline

plt.title('示例图片:插值后 - 模拟模型双accuracy绘图')

acc1_interpolate_function=make_interp_spline(x=list(range(10)),y=acc1)
acc1_interpolated=acc1_interpolate_function(np.arange(0,9,0.1).tolist())
plt.plot(acc1_interpolated, label="训练集acc")

acc2_interpolate_function=make_interp_spline(x=list(range(10)),y=acc2)
acc2_interpolated=acc2_interpolate_function(np.arange(0,9,0.1).tolist())
plt.plot(acc2_interpolated, label="验证集acc")
plt.legend()
plt.show()
plt.close()

在这里插入图片描述

<think>好的,用户想要比较不同模型在每个轮次验证结果上的差异,并询问使用哪种图表合适。首先,我需要确定用户的具体需求是什么。他们可能在机器学习或数据分析项目中,需要跟踪多个模型在训练过程中的表现,比如准确率、损失值等指标随轮次的变化情况。 接下来,用户提到的是每个轮次的验证结果,这意味着数据是时间序列或按训练轮次排列的。常见的模型对比图需要能清晰展示不同模型随着轮次变化的趋势,同时方便比较它们之间的差异。这时候,线形图(折线图)应该是最直接的选择,因为它能很好地显示随时间变化的趋势,不同模型的曲线可以用不同颜色或线型区分。 不过,用户可能还有其他考虑,比如是否需要显示误差范围、置信区间,或者是否有多指标需要同时对比。这时候可能需要组合图,比如折线图加上误差带,或者分面图(Facet Grid)来展示不同指标。此外,如果模型数量较多,简单的折线图可能会显得混乱,这时候可以考虑用小提琴图或箱线图在关键轮次(如每10轮)进行分布比较,但这样可能会丢失部分趋势信息。 另外,用户可能需要交互式图表,特别是当轮次很多或模型数量较大时,交互功能如缩放、悬停提示数据点会提升可读性。但如果是静态报告,可能需要确保图表在静态形式下依然清晰,比如使用清晰的图例、适当的线型和颜色对比。 还要考虑是否需要突出特定模型或关键轮次,比如标注最佳性能点或过拟合发生的轮次。这时候在图中添加标记或注释会有所帮助。此外,如果验证结果的波动较大,平滑处理(如移动平均)后的曲线可能更易观察趋势。 总结下来,线形图是基础且有效的选择,但根据具体情况可能需要调整或添加其他元素。需要建议用户根据数据量、模型数量、展示场景(如论文、报告或交互式看板)选择合适的图表类型,并注意图表的可读性和信息传达的准确性。</think>在对比不同模型在每个轮次(epoch)验证结果时,建议采用以下图表类型及实现步骤: --- ### **1. 线形图(折线图)** **适用场景**:最直观展示模型性能随轮次变化的趋势对比 **优势**:清晰反映收敛速度、过拟合/欠拟合现象、稳定性 **实现建议**: - **横轴**:训练轮次(Epoch) - **纵轴**:验证指标(如准确率、F1值、损失值等) - **多线条**:每条线代表一个模型,用不同颜色/线型区分 - **关键标注**:标注最佳表现点或关键转折轮次 **示例**: $$ \text{验证准确率} = \frac{\text{正确预测数}}{\text{总样本数}} $$ --- ### **2. 带误差带的折线图** **适用场景**:需要展示模型表现的波动性(如多次实验的方差) **优势**:同时反映均值和稳定性 **实现建议**: - 主线条表示均值 - 半透明色带表示标准差或置信区间 - 适合对比随机性较强的模型(如不同随机种子) --- ### **3. 分面网格图(Facet Grid)** **适用场景**:需同时对比多个指标(如准确率+损失值) **优势**:多维度对比,避免图表重叠 **实现建议**: - 每个子图对应一个评估指标 - 保持坐标轴范围一致以便横向对比 --- ### **4. 热力图(Heatmap)** **适用场景**:需对比多模型在关键轮次的性能差异 **优势**:突出阶段性对比(如每10个epoch) **实现建议**: - 横轴为轮次区间,纵轴为模型名称 - 颜色深浅表示指标高低 - 适合模型数量较多时的快速筛选 --- ### **5. 箱线图(Boxplot)** **适用场景**:需分析模型性能的分布特性 **优势**:展示中位数、四分位数、离群值 **实现建议**: - 横轴为模型名称 - 纵轴为某固定轮次(如最终epoch)的指标分布 - 适合对比模型鲁棒性 --- ### **工具推荐** | 工具 | 特点 | 适用场景 | |-------------|-----------------------------|----------------------| | **Matplotlib** | 高度定制化,适合生论文级图表 | 静态报告、学术论文 | | **Seaborn** | 简洁语法,内置统计可视化功能 | 快速探索性分析 | | **Plotly** | 交互式图表,支持缩放/悬停查看数值 | 网页展示、动态演示 | --- ### **注意事项** 1. **标准化坐标轴**:不同模型的指标范围差异较大时,可考虑归一化处理 2. **标注关键点**:用箭头或文字标注过拟合起始轮次、最佳收敛点 3. **简化图例**:模型超过5个时建议使用缩写或编号,避免图例遮挡数据 --- **示例代码框架(Python + Matplotlib)**: ```python import matplotlib.pyplot as plt epochs = range(1, 101) model_A_acc = [0.7 + 0.002*i for i in epochs] # 模拟数据 model_B_acc = [0.6 + 0.003*i for i in epochs] plt.figure(figsize=(10,6)) plt.plot(epochs, model_A_acc, 'b-', label='Model A') plt.plot(epochs, model_B_acc, 'r--', label='Model B') plt.xlabel('Training Epoch') plt.ylabel('Validation Accuracy') plt.legend() plt.title('Model Comparison by Epoch') plt.grid(True) plt.show() ``` 通过上述图表组合,可系统性分析模型在训练动态中的差异,建议优先使用**折线图+误差带**作为基础方案,再根据具体需求叠加其他可视化形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸神缄默不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值