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

PatchCollection颜色图例不匹配问题:图例颜色与标量色块不符

解决Matplotlib PatchCollection图例颜色不匹配的问题

你的问题出在颜色映射的归一化处理上,我来给你拆解清楚:

当你给PatchCollection调用set_array(np.array(cvect))时,Matplotlib会自动对cvect里的数值做归一化——也就是把数组中的最小值和最大值映射到颜色映射(cmap)的[0,1]区间,再根据这个归一化后的数值取色。但你创建图例手柄的时候,直接用cmap(col),这里的col是原始整数,相当于直接把整数当作cmap的索引(比如默认jet cmap有256个颜色档位),这就和PatchCollection实际用的颜色逻辑完全不一致了,自然颜色对不上。

修复方案

你需要复用PatchCollection使用的归一化规则,具体来说就是用pc.norm(PatchCollection自动生成的归一化器)把原始整数转换成归一化后的数值,再传入cmap取色。

修改后的代码如下,关键改动我标了注释:

import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
import numpy as np

fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111)
patches = []
cvect = []

for kx in range(10):
    for ky in range(10):
        patches.append(Polygon([(kx,ky),(kx,ky+1),(kx+1,ky+1),(kx+1,ky)]))
        cvect.append(((kx*ky)%6))

cmap = plt.cm.get_cmap('jet')
pc = PatchCollection(patches,edgecolors='none',cmap=cmap)
pc.set_array(np.array(cvect))
ax.add_collection(pc)

clist = list(set(cvect))
handles = []
# 关键改动:使用PatchCollection的归一化器pc.norm来转换数值
for col in clist:
    # 先归一化col,再传入cmap取色
    color = cmap(pc.norm(col))
    handles.append(Polygon([(0,0),(10,0),(0,-10)], color=color, label=f'Material {col}'))

plt.legend(handles=handles)
ax.set_xlim([0,10])
ax.set_ylim([0,10])
fig.savefig('fig')
plt.close(fig)

额外优化建议

其实用来做图例的Patch不需要画那么大的多边形,用matplotlib.patches.Rectangle会更简洁,比如:

from matplotlib.patches import Rectangle
# ... 其他代码不变
handles.append(Rectangle((0,0), 1, 1, color=color, label=f'Material {col}'))

这样图例的标记会更小巧美观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:32:23