Как отобразить цветовую полосу для базовой карты

У меня есть shapefile и последовательность, подобная этой:

UF
Acre                     261
Alagoas                  657
Amazonas                 793
Amapá                    162
Bahia                   1867
Ceará                   5657
Distrito Federal         430
Espírito Santo          1734
Goiás                   4110
Maranhão                1421
Minas Gerais           11812
Mato Grosso do Sul      1006
Mato Grosso             1391
Pará                    1889
Paraíba                 1575
Pernambuco              4019
Piauí                   1665
Paraná                  3745
Rio de Janeiro          1613
Rio Grande do Norte     1998
Rondônia                3102
Roraima                  237
Rio Grande do Sul       5643
Santa Catarina          5372
Sergipe                  413
São Paulo               8237
Tocantins                771
Name: 0, dtype: int64

Где UF — это имя штата, представленное в шейп-файле, а значения серии — это значения, которые я хочу использовать для генерации цветов для заполнения базовой карты. Это то, что я получил до сих пор:

import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from mpl_toolkits.basemap import Basemap
import matplotlib.cm as cm
import matplotlib as mpl
from matplotlib.collections import PatchCollection


def make_map(ax):
    m = Basemap(projection='merc', llcrnrlat=-35, urcrnrlat=7,
                llcrnrlon=-77, urcrnrlon=-32, resolution='i', ax=ax)
    m.fillcontinents()
    return m

def drawstates(fig, ax, data, shapefile='../BRA_adm_shp/BRA_adm1'):
    shp = m.readshapefile(shapefile, 'states', drawbounds=False)

    norm = mpl.colors.Normalize(vmin=data.min(), vmax=data.max())
    cmap = cm.hot
    sm = cm.ScalarMappable(norm=norm, cmap=cmap)
    colors = []
    patches = []

    for nshape, seg in enumerate(m.states):
        uf = m.states_info[nshape]['NAME_1']
        color  = sm.to_rgba(data[uf])
        poly = Polygon(seg, facecolor=color, edgecolor='white')
        ax.add_patch(poly)
        patches.append(poly)
        colors.append(color)

    p = PatchCollection(patches, cmap=cmap)
    p.set_array(np.array(colors))
    cb = fig.colorbar(p, ax=ax, orientation='horizontal')

fig, axes = plt.subplots(1, 2, figsize=(20, 10))
m = make_map(axes[0])
drawstates(fig, m.ax, m1)

Что приводит к:

введите здесь описание изображения

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


person pceccon    schedule 29.09.2017    source источник


Ответы (1)


Полигоны раскрашены в соответствии со ScalaMappable sm. Следовательно, этот ScalarMappable - это тот, который вы хотите указать в качестве аргумента для цветовой карты.

sm = cm.ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([]) # can be an empty list, only needed for matplotlib < 3.1
# ...
cb = fig.colorbar(sm, ax=ax, orientation='horizontal')

Отступ между осями и цветовой полосой можно установить с помощью аргумента pad. По умолчанию должно быть pad=0.15, и вам нужно будет найти хорошее значение самостоятельно.

person ImportanceOfBeingErnest    schedule 29.09.2017
comment
Pass sm был моей первой попыткой. но это приводит к ошибке: объект Colormap ‹matplotlib.cm.ScalarMappable по адресу 0x0000016B31C5FD30› не распознан. Возможные значения: Accent, Accent_r, Blues и т. д. - person pceccon; 29.09.2017
comment
Хм? Где именно вы прошли sm? - person ImportanceOfBeingErnest; 29.09.2017
comment
У меня есть реальная проблема, полагая, что передача scalarMappable в fig.colorbar может даже создать это сообщение. Могло ли оно исходить из другой линии заранее? Вы уверены, что ваш код точно такой же, как в вопросе? - person ImportanceOfBeingErnest; 29.09.2017