本期我们试着使用Python-geopandas包绘制空间地图,主要的知识点如下:geopandas 绘制中国地图

matplotlib add_axes()添加南海小地图

绘图文件分享

geopandas 读取中国地图文件

geopandas提供了非常方便的read_file()方法用于读取geojson文件,我们直接进行默认投影(WGS84)的绘制,代码如下:file = r"中国省级地图GS(2019)1719号.geojson"

nine = r"九段线GS(2019)1719号.geojson"

china_main = gpd.read_file(file)

china_nine = gpd.read_file(nine)

fig, ax = plt.subplots(figsize=(12, 8),dpi=80)

ax = china_main.plot(ax=ax)

ax = china_nine.plot(ax=ax)

可视化结果如下:

我们进行投影转换(epsg=2343)和进行一些简单的设置,代码如下:fig, ax = plt.subplots(figsize=(12, 8),dpi=80)

ax = china_main.geometry.to_crs(epsg=2343).plot(fc="white",ec="black",ax=ax)

ax = china_nine.geometry.to_crs(epsg=2343).plot(ec="black",ax=ax)

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

绘图数据操作

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

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

scatter, geometry=gpd.points_from_xy(scatter.lon, scatter.lat),

crs="EPSG:4326")

scattergdf.head()

结果如下:

接下来再将其转换成 epsg=2343 投影下的数据:scattergdf_2343 = scattergdf.to_crs(epsg=2343, inplace=True)

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

地图可视化绘制

直接给出绘图代码,然后再进行解释。主要代码如下:fig, ax = plt.subplots(figsize=(8,5),dpi=200,)

plt.rcParams['font.family'] = ['Times New Roman']

ax = china_main.geometry.to_crs(epsg=2343).plot(fc="white",ec="black",linewidth=.8,ax=ax)

ax = china_nine.geometry.to_crs(epsg=2343).plot(color="gray",linewidth=.9,ax=ax)

for loc, size,class_name in zip(scattergdf_2343.geometry.representative_point(),\

scattergdf_2343["data"],scattergdf_2343["class"]):

ax.scatter(loc.x,loc.y,s=10*size,fc=class_color[class_name],ec="black",lw=.5,zorder=2)

#添加刻度线

for spine in ['top','left',"bottom","right"]:

ax.spines[spine].set_color("none")

ax.set_xlim(china_nine_2343.geometry[0].x-500000, china_nine_2343.geometry[1].x)

ax.set_ylim(china_nine_2343.geometry[0].y, china_nine_2343.geometry[1].y)

ax.set_xticks([])

ax.set_yticks([])

#单独绘制图例散点

ax.scatter([], [], c='#E21C21', s=30,  label='cluster1',ec="black",lw=.5)

ax.scatter([], [], c='#3A7CB5', s=30,  label='cluster2',ec="black",lw=.5)

ax.scatter([], [], c='#51AE4F', s=30,  label='cluster3',ec="black",lw=.5)

ax.scatter([], [], c='white', s=1*10,label='1', edgecolor='black',lw=.5)

ax.scatter([], [], c='white', s=2*10,label='2', edgecolor='black',lw=.5)

ax.scatter([], [], c='white', s=3*10,label='3', edgecolor='black',lw=.5)

ax.scatter([], [], c='white', s=4*10,label='4', edgecolor='black',lw=.5)

ax.scatter([], [], c='white', s=5*10,label='5', edgecolor='black',lw=.5)

ax.legend(frameon=False,ncol=8,loc="upper center",

fontsize=9,columnspacing=.2)

ax.text(.91,-0.02,'\nVisualization by DataCharm',transform = ax.transAxes,

ha='center', va='center',fontsize = 6,color='black')

#添加南海小地图

ax_child = fig.add_axes([0.688, 0.125, 0.2, 0.2])

ax_child = china_main.geometry.to_crs(epsg=2343).plot(ax=ax_child,

fc="white",

ec="black",)

ax_child = china_nine.geometry.to_crs(epsg=2343).plot(ax=ax_child,

color="gray",

linewidth=.9,

)

for loc, size,class_name in zip(scattergdf_2343.geometry.representative_point(),\

scattergdf_2343["data"],scattergdf_2343["class"]):

ax_child.scatter(loc.x,loc.y,s=10*size,fc=class_color[class_name],ec="black",lw=.5,zorder=2)

ax_child.set_xlim(china_nine_2343.geometry[2].x, china_nine_2343.geometry[3].x)

ax_child.set_ylim(china_nine_2343.geometry[2].y, china_nine_2343.geometry[3].y)

# 移除子图坐标轴刻度,

ax_child.set_xticks([])

ax_child.set_yticks([])add_axes() 添加南海小地图#添加南海小地图

ax_child = fig.add_axes([0.688, 0.125, 0.2, 0.2])

ax_child = china_main.geometry.to_crs(epsg=2343).plot(ax=ax_child,

fc="white",

ec="black",)

ax_child = china_nine.geometry.to_crs(epsg=2343).plot(ax=ax_child,

color="gray",

linewidth=.9,

)

for loc, size,class_name in zip(scattergdf_2343.geometry.representative_point(),\

scattergdf_2343["data"],scattergdf_2343["class"]):

ax_child.scatter(loc.x,loc.y,s=10*size,fc=class_color[class_name],ec="black",lw=.5,zorder=2)

ax_child.set_xlim(china_nine_2343.geometry[2].x, china_nine_2343.geometry[3].x)

ax_child.set_ylim(china_nine_2343.geometry[2].y, china_nine_2343.geometry[3].y)

# 移除子图坐标轴刻度,

ax_child.set_xticks([])

ax_child.set_yticks([])

可以发现,除了显示范围的不同外,其他的和绘制主题部分的代码一致。单独添加图例#单独绘制图例散点

ax.scatter([], [], c='#E21C21', s=30,  label='cluster1',ec="black",lw=.5)

ax.scatter([], [], c='#3A7CB5', s=30,  label='cluster2',ec="black",lw=.5)

ax.scatter([], [], c='#51AE4F', s=30,  label='cluster3',ec="black",lw=.5)

ax.scatter([], [], c='white', s=1*10,label='1', edgecolor='black',lw=.5)

ax.scatter([], [], c='white', s=2*10,label='2', edgecolor='black',lw=.5)

ax.scatter([], [], c='white', s=3*10,label='3', edgecolor='black',lw=.5)

ax.scatter([], [], c='white', s=4*10,label='4', edgecolor='black',lw=.5)

ax.scatter([], [], c='white', s=5*10,label='5', edgecolor='black',lw=.5)

ax.legend(frameon=False,ncol=8,loc="upper center",

fontsize=9,columnspacing=.2)

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

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

数据文件

下载链接:https://pan.baidu.com/s/1-J1OzIGWaDcBPRKFovWP7Q 提取码:1hfz

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

总结

本期推文使用了Python-geopandas进行了中国地图的绘制,讲解了数据标记,投影转换等内容。但需指出的是:geopandas 的安装较为麻烦,建议使用 conda install --channel conda-forge geopandas 进行安装。

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

数据文件

下载链接:https://pan.baidu.com/s/1-J1OzIGWaDcBPRKFovWP7Q 提取码:1hfz

python绘制中国_Python-Geopandas 教你绘制中国地图相关推荐

  1. python 三维数据绘制等高线_python密度与等高线绘制,Python,和,轮廓图,Matplotlib,详解...

    密度和轮廓图 有些情况下,我们需要在二维图表中使用轮廓或颜色区域来展示三维的数据(可以设想等高线地图或温度分布图).Matplotlib 提供了三个有用的函数来处理这项任务: plt.contour绘 ...

  2. python画指北针_python如何画出漂亮的地图?

    python如何画出漂亮的地图? 要画一张好看的地图,数据量的多少.底图的支持程度与选择乃至个人的美学素养是一张好看的地图重要的因素.目前python也有很多能够实现地图可视化的包,这里给大家推荐最基 ...

  3. python画国际象棋_python图形工具turtle绘制国际象棋棋盘

    本文实例为大家分享了python图形工具turtle绘制国际象棋棋盘的具体代码,供大家参考,具体内容如下 #编写程序绘制一个国际象棋的棋盘 import turtle turtle.speed(30) ...

  4. python plot 时间_python – 在matplotlib中绘制时间与日期

    我有一个.csv文件,其中只有两列,日期和时间: 04-02-15,11:15 04-03-15,09:35 04-04-15,09:10 04-05-15,18:05 04-06-15,10:30 ...

  5. python用函数绘制椭圆_Python学习笔记——opencv绘制椭圆

    在Python环境下使用opencv绘制椭圆,需要用到cv2.ellipse() 函数. 下面一段示例程序就是用该函数在黑色背景下,绘制一个圆心在(260,240).长轴170.短轴130.线宽为3的 ...

  6. python绘制蟒蛇_Python实现七彩蟒蛇绘制实例代码

    本文主要研究的是Python编程turtle的实例,绘制一个七彩蟒蛇..具体如下. 第2周的课后练习里,有一道题目,要求修改"蟒蛇绘制"程序,对Python 蟒蛇的每个部分采用不同 ...

  7. python彩色蟒蛇绘制程序_Python实现七彩蟒蛇绘制实例代码

    本文主要研究的是Python编程turtle的实例,绘制一个七彩蟒蛇..具体如下. 第2周的课后练习里,有一道题目,要求修改"蟒蛇绘制"程序,对Python 蟒蛇的每个部分采用不同 ...

  8. python绘制汉字_Python.在图片上绘制文字

    如下 from PIL import Image,ImageDraw,ImageFont import time import os sourceimg = "/Users/a1/Deskt ...

  9. python 并列条形图_python – 熊猫:如何绘制两个类别和四个系列的条形图?

    我有以下数据框,其中pd.concat已用于对列进行分组: a b C1 C2 C3 C4 C5 C6 C7 C8 0 15 37 17 10 8 11 19 86 1 39 84 11 5 5 13 ...

  10. python七段数码管绘制学号_python七段数码管绘制

    import turtle,time def drawGap(): #绘制数码管间隔 turtle.penup() turtle.fd(5) def drawLine(draw): #绘制单段数码管 ...

最新文章

  1. Web前端开发规范手册
  2. [渝粤教育] 中国地质大学 微积分(一) 复习题 (2)
  3. Centos7中安装ElasticSearch7.2_亲测可用_坑很多---ElasticSearch工作笔记026
  4. Linux的文件压缩与解压缩
  5. javascrip执行字符串里面的函数
  6. axios基于常见业务场景的二次封装
  7. caffe 连接 matlab2016b
  8. Anaconda安装Pyserial
  9. 解决IDEA启动失败 Improperly specified VM option...问题
  10. STC单片机程序下载 STC-ISP软件 和 普中ISP软件 介绍以及使用,图文解释
  11. H264解码器源码(vc6版)H264Decoder_vc6.rar
  12. COMSOL中场路耦合(电路接口与电磁场接口)
  13. vue绑定类名 禁用样式
  14. 【Vue项目笔记心得】Swiper插件用于轮播图
  15. 放大电路的静态工作点
  16. Object-Oriented JavaScript
  17. 我也有了BLOG,欢迎交流
  18. Non local means图像去噪算法及其实现
  19. win7 + vmware下安装mac os
  20. 【最小demo】JMX (Java Management Extensions)演示最小Demo

热门文章

  1. 手把手教你搭建一个属于自己的网站-适合零基础小白,文末附网站模板
  2. MAC小技巧|Mac屏幕截图去除窗口阴影
  3. AES对称加密原理及服务
  4. android 音乐扬声器,android安插耳机状态使用扬声器外放音乐
  5. OI中常见的数学符号
  6. Android 录屏(录像)录制视频自定义输出视频分辨率,设置最合适尺寸;Android Mediacodec 录屏输出视频被缩小,Android 录屏全屏,录屏自定义尺寸,录屏录像黑边
  7. matlab latex 表格,latex表格绘制及对齐
  8. Mac 下拷贝文件到移动硬盘
  9. android button 点击没有音效
  10. java swing 圆形图标_java swing 圆形按钮