You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在matplotlib中为垂直/水平线段设置渐变色彩

matplotlib 垂直线段y轴方向渐变实现方案

现有方案的局限性

你当前使用的循环叠加多层vlines+控制z序的方案可以实现效果,但存在两个明显问题:

  • 循环调用绘图接口性能较低,当需要绘制多根渐变线时会明显拖慢渲染速度
  • 多层线段叠加容易出现边缘衔接瑕疵,z序设置不当也会出现显示层级错误

推荐方案:使用LineCollection实现

LineCollection本身支持为每一段线段单独设置颜色,只需将单根垂直线拆分为多段连续的短线段,每段颜色匹配对应y轴高度的颜色映射值即可,适配成本极低。

完整实现代码

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

# 基础参数定义
x_val = 2  # 垂直线的x坐标
y_min = 0
y_max = 5  # 垂直线的y区间
n_segments = 100  # 拆分的线段数,数值越大渐变越平滑,100足够日常使用
cmap = plt.cm.OrRd  # 你使用的橙红色映射

# 1. 生成拆分后的线段坐标
y_points = np.linspace(y_min, y_max, n_segments + 1)
segments = []
for i in range(n_segments):
    # 每一段的两个端点:(x_val, y_i) 和 (x_val, y_{i+1})
    segments.append([(x_val, y_points[i]), (x_val, y_points[i+1])])

# 2. 生成每段对应的颜色值:按y值高度归一化映射到colormap
norm = plt.Normalize(y_min, y_max)
colors = cmap(norm(y_points[:-1]))  # 取每段的起始y值作为颜色映射依据

# 3. 创建LineCollection并添加到画布
lc = LineCollection(segments, colors=colors, linewidth=7)
fig, ax = plt.subplots()
ax.add_collection(lc)

# 手动设置坐标轴范围(LineCollection不会自动适配范围)
ax.set_xlim(0, 4)
ax.set_ylim(y_min, y_max)
plt.show()

你也可以将上述逻辑封装为工具函数,调用方式和原生vlines几乎一致:

def gradient_vlines(x, ymin, ymax, cmap=plt.cm.OrRd, linewidth=7, ax=None, n_segments=100):
    if ax is None:
        ax = plt.gca()
    y_points = np.linspace(ymin, ymax, n_segments + 1)
    segments = [[(x, y_points[i]), (x, y_points[i+1])] for i in range(n_segments)]
    norm = plt.Normalize(ymin, ymax)
    colors = cmap(norm(y_points[:-1]))
    lc = LineCollection(segments, colors=colors, linewidth=linewidth)
    ax.add_collection(lc)
    # 返回LineCollection对象方便后续调整属性
    return lc

调用示例:

plt.figure()
gradient_vlines(xVal, 0, maxY, cmap=plt.cm.OrRd, linewidth=7)
plt.xlim(0, 4)
plt.ylim(0, maxY)
plt.show()

批量绘制扩展

如果需要一次性绘制多根渐变垂直线,只需在生成segments时循环所有x坐标即可,不需要重复创建LineCollection对象,性能远高于循环调用vlines。


内容的提问来源于stack exchange,提问作者kalle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 21:24:03