创建Colorbar并设置Polygon Patch Collection Matplotlib的edgecolor

时间:2017-02-28 14:43:38

标签: python matplotlib plot

我有许多多边形坐标,每个多边形区域都与一个分数值相关联。我试图通过类似热图的2D图来可视化这些多边形及其相关分数。我的代码能够绘制这样的东西,但是,我无法根据我为PatchCollection设置的颜色来计算如何显示色彩图。另外,我为Polygon对象指定了一个edgecolor,但它没有显示出来。我用于绘图的数据附有here

import shapely
import pickle as pkl 
tiles = pkl.load(open("polygons.pkl",'r'))
area_lst=[]
for tile in tiles:
    area_lst.append(shapely.geometry.Polygon(tile).area)
sorted_ascend_tile_by_size= list(np.array(tiles)[np.argsort(area_lst)[::-1]])
gammas=np.random.random(len(tiles))
from matplotlib.collections import PatchCollection
from matplotlib.patches import Polygon

fig,ax = plt.subplots(1)
patches = []
cmap = plt.get_cmap('cool')
colors = cmap(gammas)

for tile_idx in range(len(tiles)):
    polygon = Polygon(sorted_ascend_tile_by_size[tile_idx],closed=True,alpha=0.8,linewidth=1,edgecolor='black',fill=False,zorder=1)
    patches.append(polygon)

collection = PatchCollection(patches)
pcollection = ax.add_collection(collection)
collection.set_color(colors)

ax.autoscale_view()

这是代码输出的图:

enter image description here

我已尝试使用ScalarMappable对象添加颜色栏,但收到错误TypeError: You must first set_array for mappable

sm = plt.cm.ScalarMappable(cmap=cmap, norm=plt.Normalize(vmin=0, vmax=1))
plt.colorbar(sm)

1 个答案:

答案 0 :(得分:0)

听起来很有趣,但错误信息实际上已经告诉你解决方案。只需使用ScalarMappable方法将数组设置为set_array即可。该数组可以为空。

import matplotlib.pyplot as plt
sm = plt.cm.ScalarMappable(cmap="jet", norm=plt.Normalize(vmin=0, vmax=1))
sm.set_array([])
plt.colorbar(sm)
plt.show()