社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用 Python 绘制中国地图(下)

编程派 • 7 年前 • 631 次点击  

作者:张京

来源:https://segmentfault.com/a/1190000010900212

在上一篇文章《 用Python画一个中国地图 》中,我们简单描述了一下如何用 Python 快速画出一个中国地图的轮廓,似乎没有什么实用价值,这一次我们用实际数据填充它,使它看上去更有意义。

上色

延续上一次的代码,我们这次还是只增加 5 行代码:

  1. from matplotlib.patches import Polygon

  2. ax = plt.gca()

  3. for nshape, seg in enumerate(m.states):

  4.    poly = Polygon(seg, facecolor='r')

  5.    ax.add_patch(poly)

在展示结果之前,稍微解释一下。第 2 行 plt.gca ,函数名看上去很诡异,是因为 Python 里大量使用了缩写,这个 gca 就是 Get Current Axes 的缩写,实际上就是要获得当前图形的座标轴。然后我们开始一个循环,把图形文件中各个省的多边形取出来,给它一个颜色,在这里我们统一放上红色,也就是 Red 的缩写 r ,然后把这个多边形放在我们图形的座标轴上,然后就得到了下图:

糟糕,怎么能少了台湾呢?在此郑重声明:  台湾是中华人民共和国不可分割的领土! 加入台湾的 Shape 文件,然后循环一下:

  1. m.readshapefile('TWN_adm_shp/TWN_adm0', 'taiwan', drawbounds=True)

  2. for nshape, seg in enumerate(m.taiwan):

  3.    poly = Polygon(seg, facecolor='r')

  4.    ax.add_patch(poly)

好了,这下祖国山河一片红,看上去正确多了。

接下来,你还可以把各个省的名字打出来看一下,具体代码就不解释了:

  1. for shapedict in m.states_info:

  2.    statename = shapedict['NL_NAME_1']

  3.    p = statename.split('|')

  4.    if len(p) > 1:

  5.        s = p[1]

  6.    else:

  7.        s = p[0]

  8.    print(s)

  9. for shapedict in m.taiwan_info:

  10.    s = shapedict['NAME_CHINE']

  11.    print(s)

结果如下:

  1. 安徽

  2. 北京

  3. 重庆

  4. 福建

  5. 福建

  6. 福建

  7. ...

数据

接下来我们去国家统计局搞点 数据 ,第六次全国人口普查数据可以直接下载 Excel 文件,略作修改,导出成 csv 文件,用我们上一课讲的方法,一句话读取进来:

  1. df = pd.read_csv('chnpop.csv')

直接输出,大概是下面这个样子:

渲染

好了,数据也有了,我们终于要开始做一些激动人心的事情了。我们希望根据各省人口的多少用深浅不同的颜色为各个省份染色,那么首先第一步,我们需要选择一个调色板,也就是色彩映射表 colormap ,为此, matplotlib 为你准备了 数不胜数的选择 ,我们随便选择一款国旗色红黄色调的吧:

  1. cmap = plt.cm.YlOrRd

然后我们把每个省的数据映射到 colormap 上:

  1. colors[s] = cmap(np.sqrt((pop - vmin) / (vmax - vmin)))[:3]

最后,我们把各个省的颜色描在地图上:

  1. color = rgb2hex(colors[statenames[nshape]])

  2. poly = Polygon(seg, facecolor=color, edgecolor=color)

哒哒,我们的全国人口数量热力图就完成了!可以看到河南、四川、广东、山东几个省的颜色比较深,说明这几个省的人口总数最多,而西藏颜色最浅,代表这里的人口总数最少。

这里只是简单地举了一个例子,你还可以把各省的人口总数除以面积,得到人口密度数据,你还可以把各省的经济总量画在图上,总之,有了这个入门的方法,一切就都简单了呢。

最后,附上完整的代码供大家参考。

  1. import matplotlib.pyplot as plt

  2. from mpl_toolkits.basemap import Basemap

  3. from matplotlib.patches import Polygon

  4. from matplotlib.colors import rgb2hex

  5. plt.figure(figsize=(16,8))

  6. m = Basemap(

  7.    llcrnrlon=77,

  8.    llcrnrlat=14,

  9.    urcrnrlon=140,

  10.    urcrnrlat=51 ,

  11.    projection='lcc',

  12.    lat_1=33,

  13.    lat_2=45,

  14.    lon_0=100

  15. )

  16. m.drawcountries(linewidth=1.5)

  17. m.drawcoastlines()

  18. m.readshapefile('CHN_adm_shp/CHN_adm1', 'states', drawbounds=True)

  19. df = pd.read_csv('chnpop.csv')

  20. df['省名'] = df.地区.str[:2]

  21. df.set_index('省名', inplace=True)

  22. statenames=[]

  23. colors={}

  24. cmap = plt.cm.YlOrRd

  25. vmax = 100000000

  26. vmin = 3000000

  27. for shapedict in m.states_info:

  28.    statename = shapedict['NL_NAME_1']

  29.    p = statename.split('|')

  30.    if len(p) > 1:

  31.        s = p[1]

  32.    else:

  33.        s = p[0]

  34.    s = s[:2]

  35.    if s == '黑龍':

  36.        s = '黑龙'

  37.    statenames.append(s)

  38.    pop = df['人口数'][s]

  39.    colors[s] = cmap(np.sqrt((pop - vmin) / (vmax - vmin)))[:3]

  40. ax = plt.gca()

  41. for nshape, seg in enumerate(m.states):

  42.    color = rgb2hex(colors[statenames[nshape]])

  43.    poly = Polygon(seg, facecolor=color, edgecolor=color)

  44.    ax.add_patch(poly)

  45. plt.show()


题图:pexels,CC0 授权。

点击阅读原文,查看更多 Python 教程和资源。


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/Irvx7pHfXV
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/13192
 
631 次点击