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

如何在两条竖线间实现从左到右的红蓝水平颜色渐变?

问题

我想在绘图的两条竖线之间制作红-蓝颜色渐变,渐变方向为水平。我的两条线包含x(d180)和y(剖面高度)数据:

x1              y1
0  -0.828533           -51.0
3  -0.545964           -16.0
5  -0.761425           -20.0
6  -0.580972            -3.0
8  -0.854383          -162.0
12 -1.364880          -251.0
13 -1.244032          -261.0
18 -0.748652          -305.0
38 -1.300000          -600.0
39 -1.742075          -932.0

and 

          x2              y2
1  -1.309039           -51.0
2  -0.582214           -16.0
4  -1.129269           -20.0
7  -0.974811            -3.0
9  -0.957930          -162.0
10 -1.418976          -251.0
14 -1.664210          -261.0
20 -2.530322          -315.0
37 -1.630000          -600.0
41 -2.291032          -932.0

我尝试使用fill_betweenx创建空多边形并填充,但渐变方向为垂直而非水平,代码如下:

cm1 = LinearSegmentedColormap.from_list('Temperature Map', ['blue', 'red'])
polygon = plt.fill_betweenx(y2,x1,x2, lw=0, color='none')

verts = np.vstack([p.vertices for p in polygon.get_paths()])
gradient = plt.imshow(np.linspace(0, 1, 256).reshape(-1, 1), cmap=cm1, aspect='auto', origin='upper',
                      extent=[verts[:, 0].min(), verts[:, 0].max(), verts[:, 1].min(), verts[:, 1].max()])
gradient.set_clip_path(polygon.get_paths()[0], transform=plt.gca().transData)

请问如何让渐变方向改为从左到右?

解决方案

问题出在渐变数组的形状上——np.linspace(0,1,256).reshape(-1,1)是垂直方向的一维数组,导致imshow渲染出垂直渐变。要改成水平渐变,只需将数组调整为水平形状,也就是reshape(1, -1),这样渐变会沿x轴从左到右(从0到1)映射。

修改后的完整代码如下:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

# 假设x1、y1、x2、y2数据已加载完成
cm1 = LinearSegmentedColormap.from_list('Temperature Map', ['blue', 'red'])
polygon = plt.fill_betweenx(y2, x1, x2, lw=0, color='none')

verts = np.vstack([p.vertices for p in polygon.get_paths()])
# 关键修改:将渐变数组改为水平形状(1, 256)
gradient_array = np.linspace(0, 1, 256).reshape(1, -1)
gradient = plt.imshow(gradient_array, cmap=cm1, aspect='auto', origin='upper',
                      extent=[verts[:, 0].min(), verts[:, 0].max(), verts[:, 1].min(), verts[:, 1].max()])
gradient.set_clip_path(polygon.get_paths()[0], transform=plt.gca().transData)

plt.gca().invert_yaxis()  # 可选:如果y轴数值向下增大,反转后更符合剖面绘图的视觉习惯
plt.show()

额外补充两点:

  • 若你的y轴数值随高度增加而向下增大(比如从-51到-932),添加plt.gca().invert_yaxis()可让高度从上到下递减,符合常规剖面展示逻辑。
  • 若渐变方向与预期相反(比如红在左蓝在右),只需调换['blue', 'red']的顺序即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:15:02