利用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)
批量出圖
爲了出圖方便、可控、美觀,因此有所簡略。python
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,我此次這個動圖就是使用的簡書。git
還有就是shp文件的座標的問題,要投影正確,圖才能疊到一塊兒。app
第三就是這個GDP數據有所錯誤或者缺失的地方,你們諒解。函數