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

如何在Matplotlib中实现渐变填充与颜色过渡效果?

实现指定区域的平滑黄橙渐变过渡

没问题!你想要的这种跨两个未着色区域的横向颜色渐变,用单纯的fill_between确实没法直接做到,但我们可以通过定义目标区域的闭合边界,再结合渐变填充+裁剪的方式轻松实现。

下面是修改后的完整代码,我会一步步拆解思路:

核心思路

首先得明确我们要填充的区域:它是由下方的y_1曲线、上方的y_2+y_3曲线,以及左右的x轴边界(0到8)围成的闭合区域。我们需要先把这个区域的边界点整理成闭合多边形,再给这个多边形添加横向的黄到橙渐变。

完整实现代码

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

matplotlib.rcParams['font.sans-serif'] = "Arial"
matplotlib.rcParams['font.family'] = "sans-serif"

# 原始数据点
x_1=[0.00,1.00,2.00,3.00,4.00,5.00,6.00,6.50]
y_1=[3.00,2.80,2.40,2.20,1.80,1.00,0.20,0.00]
x_2 = [0.00,1.00,2.00,2.80]
y_2 = [7.00,8.00,9.00,10.00]
x_3=[2.80,2.80,3.00,4.00]
y_3=[10.00,6.00,4.00,1.80]

# 创建画布和坐标轴
f=plt.figure(figsize=(5,5))
ax=plt.gca()

# 绘制原始线条
plt.plot(x_1,y_1,'o',linestyle='-', color='k',linewidth=0.7)
plt.plot(x_2,y_2,'s',linestyle='-',color='k',linewidth=0.7)
plt.plot(x_3,y_3,'^',linestyle='--',color='k',linewidth=0.7)

# 设置轴范围
ax.set_xlim(0,8)
ax.set_ylim(0,10)

# 保留你原来的两个填充区域
ax.fill_between(x_1, y_1, 0, where=y_1 >= 0, facecolor='tab:cyan', interpolate=True,alpha=0.6)
ax.fill_between(x_2, y_2, 10, where=y_2 <= 10, facecolor='green', interpolate=True,alpha=0.4)

# --------------------------
# 关键:实现渐变填充的核心代码
# --------------------------
# 1. 构建目标区域的闭合多边形边界
# 上方边界:拼接x2和x3(去掉重复的起始点),再延伸到x=8
upper_x = x_2 + x_3[1:]
upper_y = y_2 + y_3[1:]
upper_x.append(8.0)
upper_y.append(1.8)  # 和x3最后一个点的y值保持一致,保证边界连贯
# 下方边界:从x=8反向拼接y1的点,回到x=0
lower_x = [8.0] + x_1[::-1]
lower_y = [0.0] + y_1[::-1]
# 合并成闭合多边形的坐标点
poly_coords = np.column_stack((upper_x + lower_x, upper_y + lower_y))
poly = Polygon(poly_coords, closed=True)

# 2. 自定义黄到橙的渐变色彩映射
# 你可以调整颜色值来改变渐变的深浅/色调
cmap = LinearSegmentedColormap.from_list('yellow_orange', ['#ffff00', '#ff7f00'])

# 3. 创建覆盖整个坐标轴的渐变背景
gradient = np.linspace(0, 1, 256).reshape(1, -1)  # 生成横向渐变的数值数组
ax.imshow(gradient, extent=[0,8,0,10], aspect='auto', cmap=cmap, alpha=0.7)

# 4. 用多边形裁剪渐变,只保留目标区域的渐变效果
ax.add_patch(poly)
ax.set_clip_path(poly)

# 调整刻度大小
ax.tick_params(labelsize=15)

plt.show()

代码细节说明

  • 闭合多边形构建:我们把目标区域的上下边界完整拼接,延伸到x=8再闭合,确保渐变区域完全覆盖你说的两个未着色部分。
  • 自定义渐变:通过LinearSegmentedColormap可以精准控制渐变的起始和结束颜色,如果你想要更柔和的过渡,还可以添加中间色(比如['#ffff00', '#ffcc00', '#ff7f00'])。
  • 渐变裁剪:先创建一个覆盖整个图表的渐变层,再用多边形裁剪掉不需要的部分,这样渐变就只会显示在我们定义的区域内,完美贴合线条边界。
  • 透明度调整:通过alpha参数可以控制渐变层和下方原有填充的叠加效果,让整体视觉更和谐。

这样就能实现从左到右从黄色平滑过渡到橙色的效果啦!


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:04:15