在Carropy Choropleth地图上添加值标签

时间:2019-01-02 11:33:26

标签: python matplotlib choropleth map-projections cartopy

我正在使用cartopy创建一些choropleth贴图,并希望添加一个附加功能:每个国家/地区具有与choropleth关联的数值的标签。

Here is an example我得到的输出。

还有here is an example我想要的(每个区域带有值的标签)。

我想我可以在正确的坐标上手动一个接一个地添加每个标签,但是我敢肯定,有一种更快,更通用,更可扩展的方式来实现。我已经花了很多时间进行研究,但是还没有找到任何方便的解决方案,因此我们将不胜感激。

这是我用来绘制choropleth贴图的函数:

def choropleth(ax, countries, geo_dict, cmap_name):
    """
    Plots a choropleth map of selected countries using the values in geo_dict
    as a base for the colormap

    ax: matplotlib axes on which the cloropleth is drawn
    countries: a list of records extracted from a shp file representing the
               regions to be mapped
    geo_dict: a dictionary in which the keys are ISO alpha-2 country codes and
              the values the relevant data for the choropleth
    cmap_name: a string with the name of the colormap to be used
    """

    # value normalization for the color map
    values = [geo_dict[[c.attributes['ISO_A2']][0]] for c in countries]
    norm = Normalize(vmin=min(values), vmax=max(values))

    cmap = plt.cm.get_cmap(cmap_name) # add ',n' to limit choropleth categories

    for c in countries:
        v = geo_dict[c.attributes['ISO_A2']]
        sp = ShapelyFeature(c.geometry, crs,
                            edgecolor='k',
                            linewidth=0.3,
                            zorder = 2,
                            facecolor=cmap(norm(v)))
        ax.add_feature(sp)       

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

1 个答案:

答案 0 :(得分:1)

:如何为每个国家/地区添加标签?

简短答案:在 label_df.insert(column=0, value=label_values.transpose(), allow_duplicates=True) TypeError: insert() missing 1 required positional argument: 'loc' 之后,使用ax.add_feature()。您需要获取c.geometry的质心作为anateate的参数。

答案:您的代码缺少绘制标签的正确命令。在这种情况下,最合适的是ax.annotate(),应放在ax.annotate()之后。所需的参数包括:

  • 数据CRS(您代码中的ax.add_feature()
  • 轴CRS(未出现在您的代码中)

以下是应在每个国家/地区的质心位置添加标签的代码段:

crs