我想用python 画中国和美国的地图,刚刚学会了画美国地图,特做一个记录。
当然首先是用google 找网上资料。
找到下面的链接:https://stackoverflow.com/questions/42463200/draw-state-abbreviations-in-matplotlib-basemap
下面的代码基本来自这里的回答2,就是标记为答案的回答。
直接运行,发现缺省地形文件,在这里找到了:https://github.com/matplotlib/basemap/tree/master/examples
这里还顺便找了一个画美国地图的文件,名字是:fillstates.py,大家可以去下载。
先把我上面的代码,并修改调试好了的列出来:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap as Basemap
from matplotlib.patches import Polygon
plt.figure(figsize=(18,9))
short_state_names = {
'AK': 'Alaska',
'AL': 'Alabama',
'AR': 'Arkansas',
'AS': 'American Samoa',
'AZ': 'Arizona',
'CA': 'California',
'CO': 'Colorado',
'CT': 'Connecticut',
'DC': 'District of Columbia',
'DE': 'Delaware',
'FL': 'Florida',
'GA': 'Georgia',
'GU': 'Guam',
'HI': 'Hawaii',
'IA': 'Iowa',
'ID': 'Idaho',
'IL': 'Illinois',
'IN': 'Indiana',
'KS': 'Kansas',
'KY': 'Kentucky',
'LA': 'Louisiana',
'MA': 'Massachusetts',
'MD': 'Maryland',
'ME': 'Maine',
'MI': 'Michigan',
'MN': 'Minnesota',
'MO': 'Missouri',
'MP': 'Northern Mariana Islands',
'MS': 'Mississippi',
'MT': 'Montana',
'NA': 'National',
'NC': 'North Carolina',
'ND': 'North Dakota',
'NE': 'Nebraska',
'NH': 'New Hampshire',
'NJ': 'New Jersey',
'NM': 'New Mexico',
'NV': 'Nevada',
'NY': 'New York',
'OH': 'Ohio',
'OK': 'Oklahoma',
'OR': 'Oregon',
'PA': 'Pennsylvania',
'PR': 'Puerto Rico',
'RI': 'Rhode Island',
'SC': 'South Carolina',
'SD': 'South Dakota',
'TN': 'Tennessee',
'TX': 'Texas',
'UT': 'Utah',
'VA': 'Virginia',
'VI': 'Virgin Islands',
'VT': 'Vermont',
'WA': 'Washington',
'WI': 'Wisconsin',
'WV': 'West Virginia',
'WY': 'Wyoming'
}
m = Basemap(llcrnrlon=-119,llcrnrlat=22,urcrnrlon=-64,urcrnrlat=49,
projection='lcc',lat_1=33,lat_2=45,lon_0=-95)
# data from U.S Census Bureau
# http://www.census.gov/geo/www/cob/st2000.html
shp_info = m.readshapefile('st99_d00','states',drawbounds=True)
printed_names = ['HI','AK']
for shapedict,state in zip(m.states_info, m.states):
short_name = list(short_state_names.keys())[list(short_state_names.values()).index(shapedict['NAME'])]
if short_name in printed_names: continue
# center of polygon
x, y = np.array(state).mean(axis=0)
# You have to align x,y manually to avoid overlapping for little states
plt.text(x+.1, y, short_name, ha="center")
printed_names += [short_name,]
#print(x,y,short_name)
m.drawparallels(np.arange(25,65,20),labels=[1,0,0,0])
m.drawmeridians(np.arange(-120,-40,20),labels=[0,0,0,1])
plt.title('The United States of North America')
plt.show()
我对原来的代码做了一点修改,开始的时候总是报错。
short_name = short_state_names.keys()[short_state_names.values().index(shapedict['NAME'])]
修改为:
short_name = list(short_state_names.keys())[list(short_state_names.values()).index(shapedict['NAME'])]
就是加了2个list, 我一个朋友(海鹰)帮我修改的,在此感谢他。
开始的时候地图比较小,添加了
plt.figure(figsize=(18,9))
这样地图大了一点。还有AK,HI 离美国本地太远,后来去掉了这2个的标记,printed_names初始加了这2个。
#print(x,y,short_name) 开始测试用了,现在也注释掉了。
最后地图结果是这样的:
我运行fillstates.py ,结果是这样的,彩色的,颜色标示人口密度,但没有标注州名:
还没有找到中国地图的数据,下一步画出中国地图来。