如何在Matplotlib的PatchCollection中循环使用颜色?
解决PatchCollection自动分配colormap颜色的问题
你的代码里有两个关键问题导致所有圆圈颜色一致:
match_original=True会强制PatchCollection沿用每个Patch创建时的默认颜色(均为蓝色),完全忽略你设置的colormap。- 没有给每个Patch分配用于映射颜色的数值,matplotlib无法确定如何从colormap中提取不同颜色。
修改后的代码如下:
from matplotlib.collections import PatchCollection import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots(figsize=(5,5)) coords = [ (0, 0), (1, 2), (1, 3), (2, 2), ] patches = [plt.Circle(coords[i], 0.1) for i in range(len(coords))] # 生成与Patch数量匹配的索引数组,作为颜色映射的基准值 color_values = np.arange(len(patches)) # 移除match_original参数,添加array关联颜色映射值 patch_collection = PatchCollection(patches, cmap='tab20', array=color_values) ax.add_collection(patch_collection) # 可选:添加颜色条展示颜色与数值的对应关系 plt.colorbar(patch_collection, ax=ax) ax.set_xlim(-1, 3) ax.set_ylim(-1, 4) plt.axis('equal') plt.show()
关键修改说明:
- 移除
match_original=True:让PatchCollection优先使用你指定的colormap,而非Patch的原始默认颜色。 - 添加
array参数:传入长度与Patch数量一致的数组(这里用0到3的连续索引),每个元素对应一个Patch的颜色映射基准,matplotlib会自动根据这个数组从tab20色表中提取对应颜色。 - 若需自定义颜色映射的数值范围,可配合
norm参数和Normalize类调整,例如norm=plt.Normalize(vmin=0, vmax=10)。
内容的提问来源于stack exchange,提问作者gameveloster
相关产品推荐
相关产品推荐

