根据带有底图的字典值对一个国家/地区的状态进行着色
Shade states of a country according to dictionary values with Basemap
我想绘制墨西哥地图并根据字典的值对各州进行阴影处理。我使用了上一个问题 (Easiest way to plot data on country map with python) 中建议的以下代码,到目前为止它绘制了国家和州,但是当我尝试定义阴影时出现错误。代码下方:
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()
我收到错误:KeyError: 'State_name'
。
print state
命令给出了以下信息:
{'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}
shapefile "MEX_adm1" 是从 http://www.gadm.org/
下载的
你抄的太直接了我之前的回答:)
如果将 if state["State_name"]
替换为 if state["NAME_1"]
,这应该有效,因为 shapefile 中名称的键是 NAME_1
- 但是会有不同的问题,显然你的 mexican_states_people
dict 使用与 shapefile 不同的命名约定,在你的 dict 中状态缩写为 "AGS",而在 shapefile 中它被称为 "Aguascalientes".
如果状态不是太多,你可以手动更改你的字典,否则你将不得不找到一些其他缩写和名称之间的映射。
我想绘制墨西哥地图并根据字典的值对各州进行阴影处理。我使用了上一个问题 (Easiest way to plot data on country map with python) 中建议的以下代码,到目前为止它绘制了国家和州,但是当我尝试定义阴影时出现错误。代码下方:
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()
我收到错误:KeyError: 'State_name'
。
print state
命令给出了以下信息:
{'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}
shapefile "MEX_adm1" 是从 http://www.gadm.org/
下载的你抄的太直接了我之前的回答:)
如果将 if state["State_name"]
替换为 if state["NAME_1"]
,这应该有效,因为 shapefile 中名称的键是 NAME_1
- 但是会有不同的问题,显然你的 mexican_states_people
dict 使用与 shapefile 不同的命名约定,在你的 dict 中状态缩写为 "AGS",而在 shapefile 中它被称为 "Aguascalientes".
如果状态不是太多,你可以手动更改你的字典,否则你将不得不找到一些其他缩写和名称之间的映射。