2016-12-22 15 views
6

Zrobiłem mapę cieplną geograficzną używając cartopy i matplotlib, liczby użytkowników mojej aplikacji, ale mam problemy z dodaniem legendę colorbar:Producent colorbar legendy w matplotlib/Cartopy

import cartopy.crs as ccrs 
import cartopy.io.shapereader as shpreader 
import matplotlib.pyplot as plt 
import matplotlib as mpl 
import numpy as np 

cmap = mpl.cm.Blues 
# Countries is a dictionary of {"country_name": number of users}, for example 
countries = {"United States": 100, "Canada": 50, "China": 10} 

max_users = float(max(countries.values())) 
shapename = 'admin_0_countries' 
countries_shp = shpreader.natural_earth(resolution='110m', category='cultural', name=shapename) 
ax = plt.axes(projection=ccrs.Robinson()) 
for country in shpreader.Reader(countries_shp).records(): 
    name = country.attributes['name_long'] 
    num_users = countries[name] 
    ax.add_geometries(country.geometry, ccrs.PlateCarree(), 
       facecolor=cmap(num_users/max_users, 1)) 

plt.savefig('iOS_heatmap.png', transparent=True, dpi=900) 

która produkuje enter image description here

Chcę dodać legendę paska kolorów. Jest na to dokumentacja dla prostej fabuły matplotlib, ale nie jestem pewien, jak to zrobić przez kartoptię, gdzie oś jest GeoAxesSubplot. Każda pomoc przy dodawaniu legendy byłaby doceniona.

Chciałbym również docenić wskazówki, która biblioteka jest najlepsza dla tego rodzaju geograficznych map ciepła. W dalszej kolejności muszę zrobić mapę użytkowników w USA, a kartopia nie wydaje się najlepszą opcją. Dzięki!

Odpowiedz

4

Myślę, że add_geometries() zwraca raczej FeatureArtist niż niektóre obiekty Matapotlib, które można przypisać do colorbar(). Najprostszym rozwiązaniem, jakie mogę sobie wyobrazić, jest stworzenie własnego mappable i użycie go do stworzenia paska kolorów. Spróbuj umieścić te linie po pętli country:

sm = plt.cm.ScalarMappable(cmap=cmap,norm=plt.Normalize(0,1)) 
sm._A = [] 
plt.colorbar(sm,ax=ax) 

choropleth with colorbar

Incidently tego rodzaju mapę cieplną geograficznej nazywana jest choropleth map.