Добавление панели цветов matplotlib из коллекции патчей
Я преобразую фигурный Мультиполигон в коллекцию патчей и сначала окрашиваю каждый полигон следующим образом:
# ldn_mp is a MultiPolygon
cm = plt.get_cmap('RdBu')
num_colours = len(ldn_mp)
fig = plt.figure()
ax = fig.add_subplot(111)
minx, miny, maxx, maxy = ldn_mp.bounds
w, h = maxx - minx, maxy - miny
ax.set_xlim(minx - 0.2 * w, maxx + 0.2 * w)
ax.set_ylim(miny - 0.2 * h, maxy + 0.2 * h)
ax.set_aspect(1)
patches = []
for poly in ldn_mp:
colour = cm(1. * len(filter(poly.contains, points)) / num_colours)
patches.append(PolygonPatch(poly, fc=colour, ec='#555555', lw=0.2, alpha=1., zorder=1))
pc = PatchCollection(patches, match_original=True)
ax.add_collection(pc)
ax.set_xticks([])
ax.set_yticks([])
plt.title("Density of NO$^2$ Sensors by Borough")
plt.tight_layout()
plt.show()
Но я хотел бы добавить цветовую панель к моему сюжету, основанному на цветах PatchCollection. Я не знаю, как это сделать; передаю ли я ключевое слово cmap при создании pc? Как мне тогда вызвать set_array() с помощью цветов, которые я использовал?
2 ответов:
У меня была такая же проблема некоторое время назад. Для каждого полигона я сохранил соответствующий цвет в списке с именем mycolors:
mycolors=[] ... mycolors.append(SSTvalue) path_patch = patches.PathPatch(mypath, lw=1) mypatches.append(path_patch)Я прошелся по серии мультиполигонов, хранящихся в Шейп-файле, и сохранил каждый патч в коллекции. После этого я построил полигоны, используя информацию о цвете, которую я сохранил в списке, который в конечном итоге был преобразован в массив, и добавил панель цветов:
p = PatchCollection(mypatches, cmap=plt.get_cmap('RdYlBu_r'), alpha=1.0) p.set_array(array(mycolors)) p.set_clim([np.ma.min(mycolors),np.ma.max(mycolors)]) plt.colorbar(p,shrink=0.5)Полный сценарий, который я использовал для построения значений температуры с цветами и цветовой панелью для здесь можно найти крупные морские экосистемы мира, представленные полигонами . Надеюсь, это поможет. Ура, Тронд
Нет необходимости создавать дополнительный список. Предположим, вы работаете в панд или numpy массивов.
Например:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib.collections import PatchCollection from matplotlib import cm fig, ax = plt.subplots() for c_l ,patches in dict_mapindex_mpl_polygon.items(): color = df_map_elements.loc[c_l, 'stress_level'] p = PatchCollection(patches,color=cm.Set2(color),lw=.3,edgecolor='k') ax.add_collection(p) ax.autoscale_view() p.set(array=df_map_elements['stress_level'].values, cmap='Set2') fig.colorbar(p, label="Stress (index)") plt.show()
Comments