利用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, height
GDP.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=0
for num in range(8):
name = str(num) + \'.png\'#将0-8选出来
if name in os.listdir(path):#取出文件名数字部分是18倍数的文件
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数据有所错误或者缺失的地方,大家谅解。
版权声明:本文为truggling-zx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。