如何显示底图的颜色栏

时间:2017-09-29 19:41:42

标签: python matplotlib matplotlib-basemap colorbar

我有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是shapefile中显示的州名,而系列值是我想用来生成颜色以填充底图的值。这是我到目前为止所得到的:

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)

导致:

enter image description here

我不确定这是否是正确的做法,但我想知道如何保留输入值的比例,即不在0和1之间缩放颜色条,以及如何防止这个大距离地图和它的颜色条之间。

1 个答案:

答案 0 :(得分:2)

根据ScalaMappable sm对多边形进行着色。因此,此ScalarMappable是您要作为colormap

的参数提供的
sm = cm.ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([]) # can be an empty list
# ...
cb = fig.colorbar(sm, ax=ax, orientation='horizontal')

可以使用pad参数设置轴和颜色条之间的填充。默认值应为pad=0.15,您需要自己找到一个好的值。