利用Python制作中国GDP分布图和动态演示
利用Python制作中国GDP分布图和动态演示
数据读取
## 导入相关模块
import pandas as pd
import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import Point
import matplotlib.patches as mpatches
from mpl_toolkits.basemap import Basemap
from matplotlib_scalebar.scalebar import ScaleBar
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']# 替换sans-serif字体为黑体
plt.rcParams['axes.unicode_minus'] = False # 解决坐标轴负数的负号显示问题
regibns = gpd.GeoDataFrame.from_file("F:\ArcGIS\ArcGIS文件\全国\中国地图\省级行政区.shp")
regibns.plot()
## 查看坐标系
regibns.crs
## 绘制国界线
nine_lines = gpd.read_file('F:\ArcGIS\ArcGIS文件\全国\中国地图\国界线.shp')
nine_lines.plot()
## 经纬网
jingwei = gpd.GeoDataFrame.from_file('F:\ArcGIS\ArcGIS文件\全国\中国地图\经纬网.shp')
fig = plt.figure(figsize=(8,8)) #设置画布大小
ax = plt.gca()
regibns.plot(ax=ax)
jingwei.plot(ax=ax)
nine_lines.plot(ax=ax)
taiwan = gpd.GeoDataFrame.from_file("F:\ArcGIS\ArcGIS文件\全国\中国地图\省级行政区.shp")
taiwan = taiwan[regibns['NAME'].isin(['台湾'])]
taiwan.plot()
数据清洗
regibns = regibns[['GDP_1994(','GDP_1997(','GDP_1998(','GDP_1999(','GDP_2000(','NAME',
'geometry']]
regibns = regibns.rename(columns={'GDP_1994(':'GDP_1994','GDP_1997(':'GDP_1997','GDP_1998(':'GDP_1998','GDP_1999(':'GDP_1999','GDP_2000(':'GDP_2000'})
regibns.head()
data = pd.read_excel('中国各省GDP.xlsx')
data.shape
data.head()
数据连接
GDP = pd.merge(regibns,data,on='NAME') ## 连接
GDP.head()
绘图
## 绘制中国2020年GDP分布图
fig = plt.figure(figsize=(12,12)) #设置画布大小
ax = plt.gca()
ax.set_title("中国2020年各省级行政单位GDP分布图(单位:亿元)",fontsize=24,loc='center')regibns['coords'] = regibns['geometry'].apply(lambda x: x.representative_point().coords[0])
for n, i in enumerate(regibns['coords']):plt.text(i[0], i[1], regibns['NAME'][n], size=12)# 主图绘制
GDP.plot(ax=ax,column='GDP_2020',scheme='quantiles',legend=True,linewidth=0.5,cmap='Reds',edgecolor='k',
legend_kwds={'loc': 'lower left','title': '图例','shadow': True,'fontsize':12,'frameon':True,'prop':{'family': 'Times New Roman', 'weight': 'normal', 'size': 12}})
jingwei.plot(ax=ax,linewidth=2,alpha=0.5,edgecolor='black')
nine_lines.plot(ax=ax,edgecolor='black',linewidth=2,alpha=0.5)
taiwan.plot(ax=ax,hatch= "",label= "缺失值",facecolor='lightgrey')# 副图框绘制
ax_child = fig.add_axes([0.72, 0.20, 0.15, 0.15]) # left, bottom, width, heightGDP.plot(ax=ax_child,color='#E24A33',edgecolor='grey',linewidth=0.5)
GDP.plot(ax=ax_child,color='#348ABD',edgecolor='grey',linewidth=0.5)ax_child = nine_lines.geometry.plot(ax=ax_child,edgecolor='black',linewidth=2,alpha=0.5)
taiwan.plot(ax=ax_child,hatch= "",label= "缺失值",facecolor='lightgrey')ax_child.set(xlim=(0*10**6,2*10**6),ylim=(0*10**6,2.8*10**6))ax_child.set_xticks([])
ax_child.set_yticks([])# 额外图例绘制
p1=gpd.GeoDataFrame({'geometry':[Point(-1.60*10**6,-0.1*10**6)]})
p1.plot(ax=ax,markersize=100,facecolor='lightgrey',hatch= "")
ax.text(-1.54*10**6,-0.15*10**6, "NoData",{'family': 'Times New Roman', 'weight': 'normal', 'size': 12})# 添加比例尺
scalebar = ScaleBar(dx=1*10**-3,units='km',length_fraction=0.1,font_properties={'family': 'Times New Roman', 'weight': 'normal', 'size': 12},location=8,sep=1,frameon=False)
ax.add_artist(scalebar)# 添加指北针
x, y, arrow_length = 0.42, 0.09, 0.07
ax.annotate('N', xy=(x, y), xytext=(x, y-arrow_length),arrowprops=dict(facecolor='black', width=4, headwidth=7),ha='center', va='center', fontsize=10,xycoords=ax.transAxes)# plt.savefig('中国2020年各省级行政单位GDP分布图.png',dpi=300)
批量出图
为了出图方便、可控、美观,所以有所简略。
reg = GDP.copy() ##好习惯,数据不干扰
## 列表表达式
data_plot = [('GDP_1994','中国1994年GDP分布图(单位:亿元)'),
('GDP_1997','中国1997年GDP分布图(单位:亿元)'),
('GDP_1998','中国1998年GDP分布图(单位:亿元)'),
('GDP_1999','中国1999年GDP分布图(单位:亿元)'),
('GDP_2000','中国2000年GDP分布图(单位:亿元)'),
('GDP_2010','中国2010年GDP分布图(单位:亿元)'),
('GDP_2019','中国2019年GDP分布图(单位:亿元)'),
('GDP_2020','中国2020年GDP分布图(单位:亿元)'),]
## 批量出图,不要忘记台湾
for m, cal in enumerate(data_plot):reg['coords'] = reg['geometry'].apply(lambda x: x.representative_point().coords[0])ax = reg.plot(figsize=(10, 10), column=cal[0], scheme='quantiles', legend=True, cmap='Reds', edgecolor='k')taiwan.plot(ax=ax,hatch= "",label= "缺失值",facecolor='lightgrey')for n, i in enumerate(regibns['coords']):plt.text(i[0], i[1], regibns['NAME'][n], size=12)plt.title(cal[1],size=20)plt.grid(True, alpha=0.3)# plt.savefig(str(m)+'.png',dpi=300)
## 绘制子图
fig=plt.figure(figsize=(15,30))
for m, cal in enumerate(data_plot):reg['coords'] = reg['geometry'].apply(lambda x: x.representative_point().coords[0])ax = reg.plot(ax=plt.subplot(4,2,m+1),column=cal[0],figsize = (10,10), scheme='quantiles', legend=True, cmap='Reds', edgecolor='k')taiwan.plot(ax=ax,hatch= "",label= "缺失值",facecolor='lightgrey')for n, i in enumerate(regibns['coords']):plt.text(i[0], i[1], regibns['NAME'][n], size=12)#plt.subplots_adjust(bottom=0.1, right=0.6, top=0.5)plt.title(cal[1],size=20)plt.grid(True, alpha=0.3)
plt.savefig('中国GDP演变图2.png',dpi=300)
制作动图
## 创建文件夹夹
def mkdir(path):folder = os.path.exists(path)if not folder: # 判断是否存在文件夹如果不存在则创建为文件夹os.makedirs(path) # makedirs 创建文件时如果路径不存在会创建这个路径print("--- new folder... ---")print("--- OK ---")else:print("--- There is this folder! ---")file = r'F:\ArcGIS\ArcGIS文件\全国\中国地图ArcGIS练习数据\代码\photo'
mkdir(file) # 调用函数
## 复制文件
import shutil
array = np.arange(9)
ls=list(array)
rs=map(str,ls)
path=r'F:\ArcGIS\ArcGIS文件\全国\中国地图ArcGIS练习数据\代码' #待读取的文件夹
root = 'F:\ArcGIS\ArcGIS文件\全国\中国地图ArcGIS练习数据\代码\photo'num=0for num in range(8):name = str(num) + '.png'#将0-7选出来if name in os.listdir(path):#取出文件名数字部分是0-7的文件sourcefile = os.path.join(path, name) # 拼路径print(sourcefile)shutil.copy(sourcefile, root)# 将指定的文件复制到root的文件夹里面else:print("no")
## 制作动图
# _*_ coding:utf-8 _*_
import matplotlib.pyplot as plt
import imageio
from PIL import Image, ImageSequence
__author__ = 'admin'GIF=[]
filepath = r'F:\ArcGIS\ArcGIS文件\全国\中国地图ArcGIS练习数据\代码\photo'#文件路径
filenames=os.listdir(filepath)
for filename in os.listdir(filepath):GIF.append(imageio.imread(filepath+"\\"+filename))
imageio.mimsave(filepath+"\\"+'result.gif',GIF,duration=1)#这个duration是播放速度,数值越小,速度越快
问题和总结
PicGO的gitee不太支持太大文件的传输,CSDN也只支持5MB以内,但是简书可以超过5MB,我这次这个动图就是使用的简书。
还有就是shp文件的坐标的问题,要投影正确,图才能叠到一起。
第三就是这个GDP数据有所错误或者缺失的地方,大家谅解。
利用Python制作中国GDP分布图和动态演示相关推荐
- python动态演示数据gdp_利用Python制作中国GDP分布图和动态演示
利用Python制作中国GDP分布图和动态演示 数据读取 ## 导入相关模块import pandas as pdimport geopandas as gpdimport numpy as np i ...
- 利用Python制作王者荣耀出装小助手,引来了老板的注意!
导语 T_T并不玩这些游戏... 单纯来蹭个热点... 大概是因为蹭热点需要的技术含量比较低? 就这样吧~~~ 利用Python制作命令行版的王者荣耀出装小助手. Let's Go! 开发工具 Pyt ...
- 小哥哥你有98K吗?利用Python制作一款多功能变声器!
前言 好吧,关于这句小哥哥你有98K吗?出自别人口中经常说的玩笑话,我也略懂一些游戏嘛.不过不常玩,废话不多说,开始咱们今天的教程,非常简单! 利用Python制作一款多功能变声器! 咱们首先登陆百度 ...
- python如何制作一个工程软件_如何利用python制作一个解压缩软件-Go语言中文社区...
如何利用python制作一个解压缩软件 python实现解压缩的重要模块就是--zipfile,其次是os 安装zipfile模块 首先得安装zipfile模块,打开cmd输入一下命令即可安装 pip ...
- python拼图_利用python制作拼图小游戏的全过程
开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 关注公众号:Python学习指南,回复"拼图"即可获取源码 环境搭建 安装P ...
- 用python做头像_如何利用python制作微信好友头像照片墙?
这个不难,主要用到itchat和pillow这2个库,其中itchat用于获取微信好友头像照片,pillow用于拼接头像生成一个照片墙,下面我简单介绍一下实现过程,代码量不多,也很好理解,实验环境wi ...
- 利用Python制作第一人称射击小游戏 含源代码
大家好 我是毕加锁 (锁!) 今天教大家利用Python制作第一人称小游戏 涉及知识点 1.sprites 2.pygame混音器 3.图章 4.python基础语法 .代码 1发射声 from ...
- 利用python制作转盘
利用python制作转盘 pip install threading(pip一定要为最新版本,不然容易出错) pip install tkinter pip install pyinstaller将t ...
- 利用Python制作微信机器人(三)实现爬取JD商品价格
从前两篇的博客来看,目前已经实现了机器人单向给微信发消息,和与机器人进行交互式发消息,详情如下: 利用Python制作微信机器人(一)机器人单向发消息 利用Python制作微信机器人(二)与机器人进行 ...
最新文章
- Java的字符串常量池
- excel行转列_excel统计函数:应用广泛的动态统计之王OFFSET(上)
- [xsy2880]取石子游戏
- java常见异常总结---自己工作中经常遇到的一些异常
- 怎么调试内存溢出的c++代码_【C/C++】内存对齐 到底怎么回事?
- 【渝粤题库】国家开放大学2021春1026西方经济学(本)题目
- mysql 连接 监控_mysql监控优化(一)连接数和缓存
- [emacs] Python代码补全的各种方法介绍以及对比
- 【转载】2008年世界最大50家石油公司综合排名(按六项指标综合测算)
- RHEL7.0时间同步设置
- ubuntu16.04 apt-get update出错:由于没有公钥,无法验证下列签名
- cocos 发布android 返回值2,用cocos creator打包发布的时候,编译失败是怎么回事?执行命令出错,返回值:1。...
- windows cl命令行编译和nmake
- 无线测温传感器、无线测温装置在项目上的应用—安科瑞 孙斌
- 卡西欧计算机设置参数,【卡西欧 fx-991CN X 中文函数计算器使用总结】参数|功能|显示|计算_摘要频道_什么值得买...
- 第07课:项目实战——自己动手写一个神经网络模型
- iMX6ul开发指导
- 重心法-判断一点是否在三角形内
- Bose SoundLink Revolve或者Bose SoundLink Revolve+ AUX音频播放一会没有声音
- github上三个不错的开源框架