Python-geopandas 中国地图绘制

上一期的地图可视化推文教程R-ggplot2 标准中国地图制作中,我们详细介绍了使用R-ggplot2 包完美绘制中国标准地图,本期推文我们则试着使用Python-geopandas包绘制空间地图,主要的知识点如下:

  • geopandas 绘制中国地图

  • matplotlib add_axes()添加南海小地图

  • 绘图文件分享

geopandas 读取中国地图文件

geopandas提供了非常方便的read_file()方法用于读取geojson文件,我们直接进行默认投影(WGS84)的绘制,代码如下:

1file = r"中国省级地图GS(2019)1719号.geojson" 2nine = r"九段线GS(2019)1719号.geojson" 3china_main = gpd.read_file(file) 4china_nine = gpd.read_file(nine) 5fig, ax = plt.subplots(figsize=(12, 8),dpi=80) 6ax = china_main.plot(ax=ax) 7ax = china_nine.plot(ax=ax) 8

可视化结果如下:

我们进行投影转换(epsg=2343)和进行一些简单的设置,代码如下:

1`fig, ax = plt.subplots(figsize=(12, 8),dpi=80) 2ax = china_main.geometry.to_crs(epsg=2343).plot(fc="white",ec="black",ax=ax) 3ax = china_nine.geometry.to_crs(epsg=2343).plot(ec="black",ax=ax) 4`

这里注意to_crs(epsg=2343) 就可以进行投影转换了。

绘图数据操作

接下来,我们将我们要绘制的数据读取、转换并绘制在地图上,数据预览如下:

我们使用如下代码将其转换成具有地理信息的geopandas 格式数据:

1scattergdf = gpd.GeoDataFrame( 2    scatter, geometry=gpd.points_from_xy(scatter.lon, scatter.lat), 3    crs="EPSG:4326") 4scattergdf.head() 5

结果如下:

接下来再将其转换成 epsg=2343 投影下的数据:

1scattergdf_2343 = scattergdf.to_crs(epsg=2343, inplace=True) 2

以上就完成的数据的处理操作了

地图可视化绘制

直接给出绘图代码,然后再进行解释。主要代码如下:

1fig, ax = plt.subplots(figsize=(8,5),dpi=200,) 2plt.rcParams['font.family'] = ['Times New Roman'] 3 4ax = china_main.geometry.to_crs(epsg=2343).plot(fc="white",ec="black",linewidth=.8,ax=ax) 5ax = china_nine.geometry.to_crs(epsg=2343).plot(color="gray",linewidth=.9,ax=ax) 6 7for loc, size,class_name in zip(scattergdf_2343.geometry.representative_point(),\ 8                                scattergdf_2343["data"],scattergdf_2343["class"]): 9    ax.scatter(loc.x,loc.y,s=10*size,fc=class_color[class_name],ec="black",lw=.5,zorder=2)  10#添加刻度线 11for spine in ['top','left',"bottom","right"]: 12    ax.spines[spine].set_color("none") 13 14ax.set_xlim(china_nine_2343.geometry[0].x-500000, china_nine_2343.geometry[1].x) 15ax.set_ylim(china_nine_2343.geometry[0].y, china_nine_2343.geometry[1].y) 16ax.set_xticks([]) 17ax.set_yticks([]) 18#单独绘制图例散点 19ax.scatter([], [], c='#E21C21', s=30,  label='cluster1',ec="black",lw=.5)  20ax.scatter([], [], c='#3A7CB5', s=30,  label='cluster2',ec="black",lw=.5) 21ax.scatter([], [], c='#51AE4F', s=30,  label='cluster3',ec="black",lw=.5) 22 23ax.scatter([], [], c='white', s=1*10,label='1', edgecolor='black',lw=.5) 24ax.scatter([], [], c='white', s=2*10,label='2', edgecolor='black',lw=.5) 25ax.scatter([], [], c='white', s=3*10,label='3', edgecolor='black',lw=.5) 26ax.scatter([], [], c='white', s=4*10,label='4', edgecolor='black',lw=.5) 27ax.scatter([], [], c='white', s=5*10,label='5', edgecolor='black',lw=.5) 28 29ax.legend(frameon=False,ncol=8,loc="upper center", 30         fontsize=9,columnspacing=.2) 31 32ax.text(.91,-0.02,'\nVisualization by DataCharm',transform = ax.transAxes, 33        ha='center', va='center',fontsize = 6,color='black') 34 35#添加南海小地图 36ax_child = fig.add_axes([0.688, 0.125, 0.2, 0.2]) 37ax_child = china_main.geometry.to_crs(epsg=2343).plot(ax=ax_child, 38                                                        fc="white", 39                                                        ec="black",) 40ax_child = china_nine.geometry.to_crs(epsg=2343).plot(ax=ax_child, 41                                                        color="gray", 42                                                        linewidth=.9, 43                                                        ) 44 45for loc, size,class_name in zip(scattergdf_2343.geometry.representative_point(),\ 46                                scattergdf_2343["data"],scattergdf_2343["class"]): 47    ax_child.scatter(loc.x,loc.y,s=10*size,fc=class_color[class_name],ec="black",lw=.5,zorder=2) 48 49ax_child.set_xlim(china_nine_2343.geometry[2].x, china_nine_2343.geometry[3].x) 50ax_child.set_ylim(china_nine_2343.geometry[2].y, china_nine_2343.geometry[3].y) 51# 移除子图坐标轴刻度, 52ax_child.set_xticks([]) 53ax_child.set_yticks([]) 54
  • add_axes() 添加南海小地图
1#添加南海小地图 2ax_child = fig.add_axes([0.688, 0.125, 0.2, 0.2]) 3ax_child = china_main.geometry.to_crs(epsg=2343).plot(ax=ax_child, 4                                                        fc="white", 5                                                        ec="black",) 6ax_child = china_nine.geometry.to_crs(epsg=2343).plot(ax=ax_child, 7                                                        color="gray", 8                                                        linewidth=.9, 9                                                        ) 10 11for loc, size,class_name in zip(scattergdf_2343.geometry.representative_point(),\ 12                                scattergdf_2343["data"],scattergdf_2343["class"]): 13    ax_child.scatter(loc.x,loc.y,s=10*size,fc=class_color[class_name],ec="black",lw=.5,zorder=2) 14 15ax_child.set_xlim(china_nine_2343.geometry[2].x, china_nine_2343.geometry[3].x) 16ax_child.set_ylim(china_nine_2343.geometry[2].y, china_nine_2343.geometry[3].y) 17# 移除子图坐标轴刻度, 18ax_child.set_xticks([]) 19ax_child.set_yticks([]) 20

可以发现,除了显示范围的不同外,其他的和绘制主题部分的代码一致。

  • 单独添加图例
1#单独绘制图例散点 2ax.scatter([], [], c='#E21C21', s=30,  label='cluster1',ec="black",lw=.5)  3ax.scatter([], [], c='#3A7CB5', s=30,  label='cluster2',ec="black",lw=.5) 4ax.scatter([], [], c='#51AE4F', s=30,  label='cluster3',ec="black",lw=.5) 5 6ax.scatter([], [], c='white', s=1*10,label='1', edgecolor='black',lw=.5) 7ax.scatter([], [], c='white', s=2*10,label='2', edgecolor='black',lw=.5) 8ax.scatter([], [], c='white', s=3*10,label='3', edgecolor='black',lw=.5) 9ax.scatter([], [], c='white', s=4*10,label='4', edgecolor='black',lw=.5) 10ax.scatter([], [], c='white', s=5*10,label='5', edgecolor='black',lw=.5) 11 12ax.legend(frameon=False,ncol=8,loc="upper center", 13         fontsize=9,columnspacing=.2) 14

这部分还是为了更好的定制化图例,希望大家可以掌握。

最终,我们的可视化效果如下:

注:该数据只限于练习交流,请勿用于科研、出版使用**。**

总结

本期推文使用了Python-geopandas进行了中国地图的绘制,讲解了数据标记,投影转换等内容。但需指出的是:

  1. geopandas 的安装较为麻烦,建议使用 conda install --channel conda-forge geopandas 进行安装。

  2. Python 绘制空间可视化还是存在部分问题(无法较容易的添加如比例尺、指北针等空间绘图元素),也在进一步完善过程中。

-------------------********************************** End **********-------------**-----********-**********************************

往期精彩文章推荐:

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/kxcqyeya2TT0vhxWW3d_fQ,如有侵权,请联系删除。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

vue + echart 实现中国地图 和 省市地图(可切换省份)

一.中国地图1.先导入echarts,然后再main.js里引入echarts//引入echartsimportechartsfrom'echarts'Vue.prototype.$echartsecharts//还要特别引入china.json,这样中国地图才会出现,不然只会出现右下角的南海诸岛importchinafr

python数据分析——pyecharts柱状图全解(小白必看)

一、pyecharts简介pyecharts主要基于Web浏览器进行显示,绘制的图形比较多,包括折线图、柱状图、饼图、漏斗图地图和极坐标图等。使用pyecharts绘图代码量很少,但绘制的图形比较美观。pyecharts分为v0.5.X和v1两个大版本,v0.5.X和v1间不兼容,v1是一个全新的版本v0.5.X支持Python2

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

OpenCV检测轮廓极点(Python C++)

    今天分享一个OpenCV检测轮廓极点实例,原图如下,我们需要检测出地图中最大轮廓的上下左右四个极点,并进行标注显示。!(https://oscimg.oschina.net/oscnet/ae374a72c5404b00b0e976e499eedf36.png)    第一步:阈值处理分割出地图轮廓!(ht