Skip to main content
 首页 » 编程设计

python之如何显示 basemap 的颜色条

2024年10月01日38jpfss

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

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 之间缩放颜色条,以及如何防止这个大的距离在 map 和它的颜色条之间。

请您参考如下方法:

多边形根据 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,您需要自己找到合适的值。