如何将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
相关产品推荐
相关产品推荐

