Shade states of a country according to dictionary values with Basemap

▼魔方 西西 提交于 2020-01-02 18:52:47

问题


I want to plot the map of Mexico and shade the states accordingly to a the values of a dictionary. I used the following code suggested in previous question (Easiest way to plot data on country map with python), so far it plots the country and states, but when I try to define the shading I get an error. Below the code:

import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.collections import PatchCollection
    from mpl_toolkits.basemap import Basemap
    %matplotlib inline
    from shapely.geometry import Polygon

mexican_states_people = {'AGS': 20,'BC': 57, 'BCS': 562, 'CAMP': 594,'CHIH': 442,'CHIS': 69,'COAH': 100,'COL': 237,'DF': 7323,'DGO': 689,'GRO': 40,'GTO': 295,'HGO': 1134,'JAL': 875,'MEX': 1,'MICH': 393, 'MOR': 301,'NAY': 404,'NL': 327,'OAX': 391,'PUE': 670,'QRO': 270,'QROO': 156,'SIN': 63,'SLP': 689,'SON': 291,'TAB': 306,'TAMPS': 59,'TLAX': 108,'VER': 17,'YUC': 35,'ZAC': 890}

m = Basemap(llcrnrlon=-115,llcrnrlat=5,urcrnrlon=-80,urcrnrlat=35,
            resolution='i',projection='tmerc',lon_0=-99,lat_0=19)
m.readshapefile("MEX_adm1", "mexican_states")

max_people = np.max(mexican_states_people.values())

for coordinates, state in zip(m.mexican_states, m.mexican_states_info):
    print state
    if state["State_name"] in mexican_states_people.keys():
        shade = mexican_states_people[state["State_name"]]/max_people


m.drawcoastlines()
m.fillcontinents(color='coral',lake_color='aqua')
m.drawparallels(np.arange(-40,61.,2.))
m.drawmeridians(np.arange(-20.,21.,2.))
m.drawmapboundary(fill_color='aqua')
plt.title("Mexico")
plt.show()

I get error: KeyError: 'State_name'. The print state command gave the following information:

{'NAME_0': 'Mexico', 'NAME_1': 'Aguascalientes', 'TYPE_1': 'Estado', 'CCA_1': '                                                                                                                                                                                                                                                              ', 'VARNAME_1': '                                                                                                                                                      ', 'ENGTYPE_1': 'State', 'HASC_1': 'MX.AG', 'RINGNUM': 1, 'ID_0': 145, 'ID_1': 1, 'ISO': 'MEX', 'NL_NAME_1': '                                                  ', 'CCN_1': 0, 'SHAPENUM': 1}

The shapefile "MEX_adm1" was downloaded from http://www.gadm.org/


回答1:


You copied too directly from my previous answer :)

This should work if you replace if state["State_name"] with if state["NAME_1"], as the key for names in the shapefile is NAME_1 - however there will be a different problem, as apparently your mexican_states_people dict uses a different naming convention than the shapefile, in your dict the state is abbreviated as "AGS", while in the shapefile it is called "Aguascalientes".

If there are not too many states, you could change your dict by hand, otherwise you will have to find some other mapping between abbreviations and names.



来源:https://stackoverflow.com/questions/36118998/shade-states-of-a-country-according-to-dictionary-values-with-basemap

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!