在Matplotlib/Cartopy中制作色条图例

7

我用cartopy和matplotlib制作了一个地理热力图,显示了我的应用程序用户数量的分布情况,但是添加颜色条例的过程中遇到了问题:

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)

这将生成enter image description here

我想添加一个颜色条图例。对于简单的matplotlib绘图,有文档可以这样做,但我不确定如何通过cartopy来完成,因为轴是GeoAxesSubplot。如果您能帮忙添加图例就太好了。

我也希望得到提示,哪个库最适合这些地理热力图。我接下来必须制作一个美国用户的热力图,cartopy似乎不是最佳选择。谢谢!

1个回答

8
我认为add_geometries()返回的是一个FeatureArtist,而不是可以传递给colorbar()的Matplotlib可映射对象。我能想到的最简单的解决方案是创建自己的可映射对象,并使用该对象创建色条图。请尝试在您的country循环之后添加以下代码:
sm = plt.cm.ScalarMappable(cmap=cmap,norm=plt.Normalize(0,1))
sm._A = []
plt.colorbar(sm,ax=ax)

带有色条的区域热力图

顺便提一下,这种地理热力图被称为区域热力图


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接