Добавление меток значений на картографическую картографическую карту

Я создаю несколько картограмм, используя картографию, и хотел бы добавить дополнительную функцию: метки с числовыми значениями, связанными с картограммой для каждой страны/региона.

Вот пример того, что я получаю.

И вот пример того, что я хотел бы иметь (метки со значениями для каждого региона) .

Я думаю, я мог бы вручную добавлять каждую метку одну за другой в нужные координаты, но я уверен, что есть более быстрый, более общий и более масштабируемый способ сделать это. Я потратил довольно много времени на исследования, но не нашел подходящего решения, поэтому любая помощь будет очень признательна.

Это функция, которую я использую для построения картограммы:

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)       

person Ignacio    schedule 02.01.2019    source источник
comment
Сразу после ax.add_feature() используйте ax.annotate(). Вам нужно будет получить центроид c.geometry в качестве параметра аннотации.   -  person swatchai    schedule 02.01.2019
comment
@swatchai, пожалуйста, превратите свой комментарий в ответ :)   -  person bugmenot123    schedule 15.08.2019
comment
@ bugmenot123 Спасибо за запрос. Надеюсь, мой ответ будет полезен всем читателям.   -  person swatchai    schedule 15.08.2019


Ответы (1)


В: Как добавить ярлык для каждой страны?

Короткий ответ: сразу после ax.add_feature() используйте ax.annotate(). Вам нужно будет получить центроид c.geometry в качестве параметра аннотации.

Ответ: в вашем коде отсутствует правильная команда для построения меток. Наиболее подходящим в данном случае является ax.annotate(), который следует ставить после ax.add_feature(). Необходимые параметры включают в себя:

  • CRS данных (crs из вашего кода)
  • Оси CRS (не отображаются в вашем коде)

Вот фрагмент кода, который должен добавить метки к позициям центроидов каждой страны:

# ... other lines of code above here
ax.add_feature(sp)  # existing code

# my code follows
pnt = c.geometry.centroid
anno = c.attributes['ISO_A2']  # 'name' is also possible
# `Axes CRS` is taken from: ax.projection
# `Data CRS` is taken as `crs`
ax.annotate(anno, ax.projection.transform_point(pnt.x, pnt.y, crs))
person swatchai    schedule 15.08.2019