Python 数据可视化(二):多曲线对比、局部放大框(附源码)

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 的汇报时,我们会面临两种截然不同的场景:

  1. 白纸黑字写论文:此时你需要一张带白色实心背景的常规图表,干干净净,对比度高。
  2. 做精美 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):
# 1. 加载无表头的数据 (header=None 是关键,告诉 Pandas 里面全是纯数字)
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))

# 2. 学术论文风格配置
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) # dpi=300 保证高清

# 3. 绘制曲线
ax.plot(cycles, actual, color=color, linewidth=2, label=f'Original Capacity ({dataset_name})')

# 4. 图表修饰 (坐标轴、网格、图例)
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

# ... (数据读取部分省略,核心展示画图逻辑) ...

# 1. 学术标准配置
fig, ax = plt.subplots(figsize=(10, 6), dpi=300)

# 【核心修改:背景透明化】
fig.patch.set_alpha(0.0) # 总画布背景透明
ax.patch.set_alpha(0.0) # 主图背景透明

# 2. 绘制多条曲线 (真实值与多个预测模型对比)
ax.plot(cycles, actual, label='True Capacity', color='black', linewidth=2.5, zorder=10)
# ... (通过循环绘制其他几条预测曲线,并设置不同线型和颜色) ...

# 3. 图例透明背景
legend = ax.legend(loc='upper right', frameon=True, edgecolor='black', fontsize=11)
legend.get_frame().set_alpha(0.0) # 图例框透明

# 4. 【高阶操作】添加局部放大框 (放置在 inset_bbox 指定位置)
axins = ax.inset_axes([0.05, 0.05, 0.4, 0.35])
axins.patch.set_alpha(0.0) # 放大框背景也要透明
# ... (在放大框内再次绘制需要放大的曲线段) ...

# 用阴影线连接主图和放大框 (loc1 和 loc2 控制连线的角)
mark_inset(ax, axins, loc1=3, loc2=4, fc="none", ec="black", lw=1, alpha=0.5)

plt.tight_layout()
# 【关键:保存时设置 transparent=True】
plt.savefig('Prediction_Transparent.png', transparent=True, bbox_inches='tight')
plt.show()

图 4:进阶代码生成的成果!包含了多模型预测曲线对比、精准的局部细节放大框,以及最核心的“透明化”处理(在黑色阅图器下完美显现极客质感)。


结语

从一行简单的 pd.read_csv,到最后用 inset_axes 玩转空间布局,Python 赋予了我们科研绘图无限的自由度。有了这两段代码作为模板,以后再遇到什么新的数据集,你只需要改改文件名、换换颜色,3 秒钟就能出一张神图!

如果你觉得这篇教程对你的论文写作有帮助,别忘了点个赞 👍、点个收藏 ⭐ 支持一下博主哦!如果代码运行遇到任何问题,随时在评论区找我!我们下期再见!