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

