python 彩色曲线图绘制
本文使用的各类软件库版本为:
python 3.12.7
numpy 1.26.4
matplotlib 3.9.2
使用matplotlib
库可以非常方便地绘制出各类的数学或统计学图表。一个典型的函数曲线绘制代码如下所示
import numpy as np
import matplotlib.pyplot as plt
# 生成曲线
omega_n = 1 # 固有频率
omega_d = 2 * np.pi # 震荡频率
zeta = 0.6 # 阻尼系数
t = np.arange(0, 10, 0.01) # 时间量
f = 1 - np.exp(-zeta * omega_n * t) / np.sqrt(1 - zeta ** 2) * np.sin(omega_d * t + np.pi / 2) # 欠阻尼系统阶跃响应
# 显示图片
fig, ax = plt.subplots()
ax.plot(t, f) # 选择绘制的数据
ax.set_xlabel("t/s") # 设置坐标轴标签
ax.set_ylabel("f")
plt.show()
上面这段代码使用了pyplot
子库中的plot()
函数,绘制出了如下图所示的二阶系统阶跃响应的函数图像。
类似于二维的热力图,想用颜色来表示函数值的大小。同时,使用彩色曲线可以让图片更加美观。
matplotlib
使用colormap
来构建色彩映射。
可以使用官方预设的colormap
也可以根据自己收集的色卡生成自定义的colormap
。
但是函数plot()
并没有用于设置colormap
的cmap
属性,只有color
属性。
因此,无法使用该函数绘制彩色曲线。
collections
类提供了一个子类LineCollection
,他可以将一系列线段绘制在同一图中。
绘制彩色曲线的核心思想在于,将曲线分成多个线段,并将这个线段根据不同的曲线范围赋予不同的颜色。
理论上,我们也可以将曲线分割好后,使用循环的结构利用plot()
函数来分段绘制。
显然这样做非常不优雅,而使用LineCollection
类就非常方便了。
具体的代码如下:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
# 生成曲线
omega_n = 1 # 固有频率
omega_d = 2 * np.pi # 震荡频率
zeta = 0.6 # 阻尼系数
t = np.arange(0, 10, 0.01) # 时间量
f = 1 - np.exp(-zeta * omega_n * t) / np.sqrt(1 - zeta ** 2) * np.sin(omega_d * t + np.pi / 2) # 欠阻尼系统阶跃响应
# 线段组拆分
points = np.array([t, f]).T.reshape(-1, 1, 2) # 生成点集
segments = np.concatenate([points[:-1], points[1:]], axis=1) # 生成线段组
# 显示图片
fig, ax = plt.subplots()
lc = LineCollection(segments, linewidths=3,cmap='coolwarm') # 设置曲线
lc.set_array(f) # 设置函数值映射的颜色
line = ax.add_collection(lc) # 将曲线组加入图像中
fig.colorbar(line, ax=ax) # 创建颜色条
ax.set_xlim(min(t) - 0.2, max(t) + 0.2) # 设置坐标轴范围,
ax.set_ylim(min(f) - 0.2, max(f) + 0.2)
ax.set_xlabel("t/s") # 设置坐标轴标签
ax.set_ylabel("f")
plt.show()
当然,选择使用LineCollection
类进行绘图时,pyplot
不会自动调整坐标范围,需要使用set_xlim()
和set_ylim()
方法进行设置,上述代码的最终生成的图片如下