如何用Matplotlib绘制带渐变透明度的曲线?
Matplotlib实现曲线从起点到终点透明度渐变的方法
plt.plot()本身不支持单条曲线的渐变透明度,要实现起点透明、终点不透明的效果,得用LineCollection组件,它能给曲线的每个线段单独设置透明度参数。
具体实现步骤
- 先导入所需库:
import matplotlib.pyplot as plt import numpy as np from matplotlib.collections import LineCollection - 处理单条/多条曲线:
- 把曲线的坐标点转换成线段集合:将x轴数组
r和y轴数组l配对成点集,再拆分成长度为2的线段数组(每个元素对应曲线的一小段)。 - 生成渐变alpha数组:从0(完全透明)到1(完全不透明)线性生成,长度和线段数一致,对应每段的透明度。
- 用
LineCollection绘制线段,并添加到坐标轴上;最后手动设置坐标轴范围(LineCollection不会自动适配轴范围)。
- 把曲线的坐标点转换成线段集合:将x轴数组
完整示例代码
import matplotlib.pyplot as plt import numpy as np from matplotlib.collections import LineCollection # 模拟3条符合需求的曲线:起点右上角,终点趋近(0.86, 0.5) np.random.seed(42) num_curves = 3 num_points = 50 curves = [] for _ in range(num_curves): # 生成带微小噪声的曲线数据,模拟实际场景 r = np.linspace(1.0, 0.86, num_points) + np.random.normal(0, 0.01, num_points) l = np.linspace(0.9, 0.5, num_points) + np.random.normal(0, 0.01, num_points) curves.append((r, l)) fig, ax = plt.subplots() # 循环绘制每条渐变透明度的曲线 colors = ['#1f77b4', '#ff7f0e', '#2ca02c'] for idx, (r, l) in enumerate(curves): # 转换为线段集合 points = np.column_stack([r, l]) segments = np.array([points[i:i+2] for i in range(len(points)-1)]) # 生成从0到1的渐变alpha alphas = np.linspace(0, 1, len(segments)) # 创建LineCollection并添加到轴上 lc = LineCollection(segments, colors=colors[idx], alpha=alphas, linewidth=2) ax.add_collection(lc) # 设置轴范围,聚焦终点区域 ax.set_xlim(0.85, 1.01) ax.set_ylim(0.49, 0.91) plt.show()
说明
- 代码中每条曲线的线段透明度从起点的0逐步升到终点的1,终点区域的曲线会清晰区分,起点几乎透明不会干扰视线。
- 如果需要反向渐变(起点不透明、终点透明),只需把
np.linspace(0, 1, len(segments))改成np.linspace(1, 0, len(segments))即可。
内容的提问来源于stack exchange,提问作者narsonalin
相关产品推荐
相关产品推荐

