Python 数据可视化(二):多曲线对比、局部放大框(附源码)
在上一篇博客中,我们成功配置了所向披靡的 VS Code + Conda 数据可视化环境。环境有了,画笔就位了,今天我们就来动真格的——手把手写代码,把数据变成能放进报告或论文的高清图!
步骤 0:画图前的准备——什么是 CSV?
很多小白一提到“数据导入”就头疼。其实,无论你用 Python 画什么神仙图表,核心逻辑只有一步:喂给 Python 数据,Python 还你一张图。
最常用的数据格式就是 CSV(逗号分隔值,Comma-Separated Values)。
你可以把它理解为“扒了衣服的 Excel 表格”。它没有任何字体、颜色或边框格式,纯粹用逗号把数据隔开,体积小,读取极快,是所有编程语言的“通用普通话”。
注:除了 CSV,Python 的 pandas 库同样可以轻松秒读 .xlsx (Excel)、.txt 甚至 .json 格式的数据。只要你的数据整理好了,画图就成功了 80%!
步骤 1:背景的魔法——普通白底图 vs 透明背景图
在写论文或做 PPT 的汇报时,我们会面临两种截然不同的场景:
- 白纸黑字写论文:此时你需要一张带白色实心背景的常规图表,干干净净,对比度高。
- 做精美 PPT 或嵌套流程图:如果你想把折线图无缝嵌到一个有颜色的 PPT 背景里,或者放进一张复杂的 Visio 架构图中,白底图就会像一块难看的“狗皮膏药”。这时候,你需要的就是透明背景图!
看看下面这两张图的区别,你就全明白了:
图 1:透明背景图。无论放在什么颜色的 PPT 模板上,都能完美融入,没有突兀的白边。(注意看图中的灰色棋盘格,代表背景是完全透明的)
图 2:常规白底图。适合直接插入 Word 文档或作为标准配图,干净清爽。
接下来,我们就用实际代码,教你把这两种图都画出来!
步骤 2:实战演练!基础篇 vs 进阶篇代码解析
1. 基础篇:绘制标准白底折线图(以原容量数据为例)
这端代码非常适合刚上手的小白,它的目标很明确:把 CSV 里的单列数据读出来,画成一条学术风的折线。
核心知识点:
- 使用
header=None 告诉 Python 表格里全是纯数字,没有表头名字。
- 设置全局字体为
Times New Roman,符合国际学术规范。
bbox_inches='tight' 让保存的图片自动裁剪多余空白。
💻 基础版 Python 源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import pandas as pd import numpy as np import matplotlib.pyplot as plt
def plot_full_original_capacity(dataset_name, start_cycle, y_label, color, file_path): try: df = pd.read_csv(file_path, header=None) except FileNotFoundError: print(f"❌ 错误:未找到文件 {file_path},请检查文件是否在当前文件夹下!") return
actual = df.iloc[:, 0].values cycles = np.arange(start_cycle, start_cycle + len(actual)) plt.rcParams['font.family'] = 'serif' plt.rcParams['font.serif'] = ['Times New Roman'] plt.rcParams['axes.linewidth'] = 1.2 fig, ax = plt.subplots(figsize=(10, 5), dpi=300) ax.plot(cycles, actual, color=color, linewidth=2, label=f'Original Capacity ({dataset_name})') ax.set_xlabel('Cycle Number', fontweight='bold', fontsize=12) ax.set_ylabel(y_label, fontweight='bold', fontsize=12) ax.set_title(f'Original Battery Capacity Data - {dataset_name}', fontweight='bold', fontsize=14) ax.grid(True, linestyle=':', alpha=0.6) ax.legend(loc='upper right', frameon=True, edgecolor='black', fontsize=10) plt.tight_layout() output_png = f'{dataset_name}_Full_Original_Capacity.png' plt.savefig(output_png, bbox_inches='tight') plt.close() print(f"🎉 成功生成并保存了图片: {output_png}")
plot_full_original_capacity('NASA_B0005', 1, 'Capacity (Ah)', '#1f77b4', 'B5.csv')
|
图 3:基础代码生成的 NASA_B0005 容量数据图,学术感拉满。
2. 进阶篇:多模型对比 + 局部放大框 + 透明背景图
如果你的导师要求“把咱们预测的模型和别人的模型放在一张图里对比,再加个局部放大框看细节”,怎么办?别慌,下面这段进阶代码直接帮你封神!
核心知识点(高能预警):
- 背景透明术:使用
fig.patch.set_alpha(0.0) 和 plt.savefig(..., transparent=True) 联合魔法,榨干最后一滴背景色。
- 局部放大镜:使用
ax.inset_axes 在大图中嵌套一个小图表,用 mark_inset 画出阴影连线,逼格极高!
💻 进阶版 Python 源码(局部):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import pandas as pd import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1.inset_locator import inset_axes, mark_inset
fig, ax = plt.subplots(figsize=(10, 6), dpi=300)
fig.patch.set_alpha(0.0) ax.patch.set_alpha(0.0)
ax.plot(cycles, actual, label='True Capacity', color='black', linewidth=2.5, zorder=10)
legend = ax.legend(loc='upper right', frameon=True, edgecolor='black', fontsize=11) legend.get_frame().set_alpha(0.0)
axins = ax.inset_axes([0.05, 0.05, 0.4, 0.35]) axins.patch.set_alpha(0.0)
mark_inset(ax, axins, loc1=3, loc2=4, fc="none", ec="black", lw=1, alpha=0.5)
plt.tight_layout()
plt.savefig('Prediction_Transparent.png', transparent=True, bbox_inches='tight') plt.show()
|
图 4:进阶代码生成的成果!包含了多模型预测曲线对比、精准的局部细节放大框,以及最核心的“透明化”处理(在黑色阅图器下完美显现极客质感)。
结语
从一行简单的 pd.read_csv,到最后用 inset_axes 玩转空间布局,Python 赋予了我们科研绘图无限的自由度。有了这两段代码作为模板,以后再遇到什么新的数据集,你只需要改改文件名、换换颜色,3 秒钟就能出一张神图!
如果你觉得这篇教程对你的论文写作有帮助,别忘了点个赞 👍、点个收藏 ⭐ 支持一下博主哦!如果代码运行遇到任何问题,随时在评论区找我!我们下期再见!