如何基于Y值的最大最小值为Matplotlib折线图设置渐变色?
基于Matplotlib实现随Y值渐变的折线图
要实现折线颜色随Y值(最大值对应一种颜色,最小值对应另一种,中间渐变)变化的效果,Matplotlib默认的plot函数无法直接完成,因为折线是单一连续对象。我们可以将折线拆分为多个微小线段,为每个线段分配对应Y值的渐变颜色,具体实现如下:
完整代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.cm import ScalarMappable from matplotlib.colors import Normalize x = np.linspace(0, 4.*np.pi, 1000) y = np.sin(x) def hex_to_RGB(hex_str): """ #FFFFFF -> [255,255,255]""" #Pass 16 to the integer function for change of base return [int(hex_str[i:i+2], 16) for i in range(1,6,2)] def get_color_gradient(c1, c2, n): """ Given two hex colors, returns a color gradient with n colors. """ assert n > 1 c1_rgb = np.array(hex_to_RGB(c1))/255 c2_rgb = np.array(hex_to_RGB(c2))/255 mix_pcts = [x/(n-1) for x in range(n)] rgb_colors = [((1-mix)*c1_rgb + (mix*c2_rgb)) for mix in mix_pcts] return ["#" + "".join([format(int(round(val*255)), "02x") for val in item]) for item in rgb_colors] color1 = "#EB1410" # Y最小值对应颜色 color2 = "#080606" # Y最大值对应颜色 # 归一化Y值,映射到0-1范围用于匹配颜色索引 y_norm = (y - y.min()) / (y.max() - y.min()) # 生成与数据点数量一致的渐变颜色列表 colors = get_color_gradient(color1, color2, len(y)) # 创建绘图对象 fig, ax = plt.subplots(figsize=(12,7)) # 拆分折线为多个小线段,逐个绘制并分配对应颜色 for i in range(len(x)-1): # 根据当前线段起点的Y值获取对应颜色 color_idx = int(round(y_norm[i] * (len(colors)-1))) ax.plot(x[i:i+2], y[i:i+2], color=colors[color_idx], linewidth=2) # 添加颜色条,展示Y值与颜色的对应关系 norm = Normalize(vmin=y.min(), vmax=y.max()) sm = ScalarMappable(norm=norm, cmap=plt.cm.colors.ListedColormap(colors)) sm.set_array([]) fig.colorbar(sm, ax=ax, label='Y值') plt.show()
关键步骤说明
- 颜色渐变生成:复用你原有的
get_color_gradient函数,生成从color1到color2的渐变颜色列表,数量与数据点一致。 - Y值归一化:将Y值转换为0-1范围的归一化值,用于精准匹配渐变颜色的索引。
- 拆分绘制线段:遍历每个相邻数据点对,绘制单个小线段,并根据对应Y值选择渐变颜色。这里使用线段起点的Y值对应颜色,你也可以改为两端Y值的平均值,效果差异极小。
- 添加颜色条:通过
ScalarMappable创建颜色映射,添加颜色条让Y值与颜色的对应关系更直观。
内容的提问来源于stack exchange,提问作者ankush jamthikar
相关产品推荐
相关产品推荐

