美文网首页
利用Python制作中国GDP分布图和动态演示

利用Python制作中国GDP分布图和动态演示

作者: 任源_c4d5 | 来源:发表于2021-02-01 05:42 被阅读0次

    利用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()
    
    GDP,可能有错误,方法重要
    data = pd.read_excel('中国各省GDP.xlsx')
    data.shape
    
    维度
    data.head()
    
    
    近两年GDP

    数据连接

    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)
    
    中国2020年各省级行政单位GDP分布图

    批量出图

    为了出图方便、可控、美观,所以有所简略。

    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)
    
    中1994年GDP分布图,数据有缺失值和不精确 批量出图
    ## 绘制子图
    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)
    
    中国GDP演变图.png

    制作动图

    ## 创建文件夹夹
    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-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是播放速度,数值越小,速度越快
    
    中国GDP动态演示

    问题和总结

    PicGO的gitee不太支持太大文件的传输,CSDN也只支持5MB以内,但是简书可以超过5MB,我这次这个动图就是使用的简书。

    还有就是shp文件的坐标的问题,要投影正确,图才能叠到一起。

    第三就是这个GDP数据有所错误或者缺失的地方,大家谅解。

    相关文章

      网友评论

          本文标题:利用Python制作中国GDP分布图和动态演示

          本文链接:https://www.haomeiwen.com/subject/caodtltx.html