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

如何将Matplotlib图例2D线条改为显示colormap色彩范围

修改图例为色阶线段/补丁形式

要实现图例中展示viridis_r色阶的色彩范围,替代原来的单一颜色线条,这里提供两种可行方案:


方案1:多段线段拼接成渐变图例

通过创建对应每个半径颜色的短线条,拼接成一条水平渐变线段作为图例项,代码如下:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.legend_handler import HandlerLineCollection

fig, ax = plt.subplots() 

radii = [1,2,3,4,5]
angle = np.linspace(0, 2 * np.pi, 150)  

cmap = plt.get_cmap('viridis_r')
norm = plt.Normalize(radii[0], radii[-1])    
m = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
m.set_array(radii)

# 绘制同心圆
for radius in radii: 
    x = radius * np.cos(angle) 
    y = radius * np.sin(angle)  
    ax.plot(x, y, color=cmap(norm(radius))) 

# 创建色阶渐变线段
num_segments = len(radii)
legend_segments = []
for i in range(num_segments):
    x_start = i / num_segments
    x_end = (i+1) / num_segments
    line = plt.Line2D([x_start, x_end], [0, 0], color=cmap(norm(radii[i])), linewidth=2)
    legend_segments.append(line)

# 绑定线段集合到图例
ax.legend([legend_segments], ['Radius'], loc='best', handler_map={list: HandlerLineCollection(numpoints=1)})

ax.set_aspect(1) 
fig.colorbar(m).set_label('Radius', size=15) 
plt.show() 

核心逻辑

  • 按半径数量拆分水平线段,每个子线段对应viridis_r色阶中的一种颜色
  • 用HandlerLineCollection处理线段集合,让图例正确渲染多段线条的组合效果

方案2:补丁色块展示渐变

通过添加小坐标轴绘制水平渐变条,作为图例的色阶展示,代码如下:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots() 

radii = [1,2,3,4,5]
angle = np.linspace(0, 2 * np.pi, 150)  

cmap = plt.get_cmap('viridis_r')
norm = plt.Normalize(radii[0], radii[-1])    
m = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
m.set_array(radii)

# 绘制同心圆
for radius in radii: 
    x = radius * np.cos(angle) 
    y = radius * np.sin(angle)  
    ax.plot(x, y, color=cmap(norm(radius))) 

# 创建渐变补丁式图例
# 添加小坐标轴放置渐变条(参数为[左, 下, 宽, 高],基于整个画布的比例)
legend_ax = fig.add_axes([0.7, 0.8, 0.2, 0.03])
# 绘制水平渐变条
legend_ax.imshow(np.linspace(0,1,100).reshape(1,-1), cmap=cmap, norm=norm, aspect='auto')
# 隐藏坐标轴刻度
legend_ax.set_xticks([])
legend_ax.set_yticks([])
# 添加图例标签
fig.text(0.8, 0.83, 'Radius', ha='center', fontsize=12)

ax.set_aspect(1) 
fig.colorbar(m).set_label('Radius', size=15) 
plt.show() 

核心逻辑

  • 通过add_axes创建独立小坐标轴,用imshow渲染水平色阶渐变
  • 调整坐标轴参数可灵活控制渐变条的位置、大小

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:09:23