python可视化地图

环境安装:

  Anaconda版本 conda 4.8.2

  Python版本 Python 3.7.1

conda install basemap
conda install -c conda-forge basemap-data-hires

 安装其他库

pip install jsonpath
# -*- coding:utf-8 -*-
'''
from province_data_analysis import ProvinceData
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from matplotlib.patches import Polygon

def distribution_map():

    # 显示中文和显示负号
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    # 获取省份名称列表及确认病例列表原始数据,按照人数多到少排列
    province_name, province_total_confirm = ProvinceData().province_total_data()
    province_confirm_dict = dict(zip(province_name, province_total_confirm))

    # 设置图形大小
    fig=plt.figure(facecolor='#f4f4f4',figsize=(10, 10), dpi=300)
    # 新建区域
    # 标签颜色和文本    
    legend_handles = [
                matplotlib.patches.Patch(color='#ffefd7', alpha=1, linewidth=0),
                matplotlib.patches.Patch(color='#d2af86', alpha=1, linewidth=0),
                matplotlib.patches.Patch(color='#fe8664', alpha=1, linewidth=0),
                matplotlib.patches.Patch(color='#af3936', alpha=1, linewidth=0),
                matplotlib.patches.Patch(color='#c91014', alpha=1, linewidth=0),
                matplotlib.patches.Patch(color='#9c0a0d', alpha=1, linewidth=0),
    ]
    legend_labels = ['1-9人', '10-99人', '100-499人', '500-999人', '1000-9999人','>10000人']
    axes = fig.add_axes((0.1, 0.1, 0.8, 0.8))
    axes.legend(legend_handles, legend_labels, bbox_to_anchor=(0.5, -0.11), loc='lower center', ncol=6)  # prop=font
    # 设置中国的经纬度范围
    lon_min, lon_max = 77, 142
    lat_min, lat_max = 14, 51

    # 绘制中国地图,设置经度纬度范围,使用兰伯特投影
    map = Basemap(llcrnrlon=lon_min, llcrnrlat=lat_min, urcrnrlon=lon_max, urcrnrlat=lat_max, projection='lcc',
                  lat_1=33, lat_2=45, lon_0=100, ax=axes)
    #os.path.join(os.getcwd())
    map.readshapefile('./china_shapfiles/china-shapefiles-simple-version/china', 'province', drawbounds=True)
    map.readshapefile('./china_shapfiles/china-shapefiles-simple-version/china_nine_dotted_line', 'china_nine',
                    drawbounds=True)

    # 读取各省份省委城市的经纬度数据
    posi = pd.read_excel('data.xlsx')
    province_list = list(posi['province'])
    lat_list = np.array(posi["lat"][0:34])
    lon_list = np.array(posi["lon"][0:34])
    confirm_origin = list(posi["confirm"][0:34])
    province_dict = dict(zip(province_list,confirm_origin))

    # 进行重新排序后的省份疫情表,省份排序与本地的经纬度表一致
    new_province_confirm= data_merge(province_dict, province_confirm_dict)
    confirm_list = np.array(list(new_province_confirm.values()))
    # 计算每个省份确诊人数的比例,乘以一个值进行离散化数据
    #size = (confirm_list/np.max(confirm_list))*3000
    #print(new_province_confirm)

    for info, shape in zip(map.province_info, map.province):
        pname = info['OWNER'].strip('\x00')
        fcname = info['FCNAME'].strip('\x00')#去掉空格
        if pname != fcname: # 不绘制海岛
            continue
        for prov_name in new_province_confirm.keys():
            if prov_name in pname:
                
                if new_province_confirm[prov_name] <10:
                    color = '#ffefd7'
                elif new_province_confirm[prov_name] < 100:
                    color = '#d2af86'
                elif new_province_confirm[prov_name] < 500:
                    color = '#fe8664'
                elif new_province_confirm[prov_name] < 1000:
                    color = '#af3936'
                elif  new_province_confirm[prov_name] < 10000:
                    color = '#c91014'
                else:
                    color = '#9c0a0d'
                break
        poly = Polygon(shape, facecolor=color, edgecolor=color)
        axes.add_patch(poly)
    # 绘制经度纬度线
    parallels = np.arange(0., 90, 10.)
    map.drawparallels(parallels, labels=[1, 0, 0, 0], fontsize=10)  # 绘制纬线
    meridians = np.arange(80., 140., 10.)
    map.drawmeridians(meridians, labels=[0, 0, 0, 1], fontsize=10)  # 绘制经线

    x, y = map(lon_list, lat_list)
    #map.scatter(x, y, s=size, c='red')
    # 设置标注
    for i in range(0, 34):
        plt.text(x[i], y[i],province_list[i],ha='left',va='center',c='k')

    plt.title('2019-nCoV疫情分布地图', fontsize=16)
    plt.savefig('2019-nCoV疫情分布地图.png')
    plt.show()

# 由于原始疫情数据是按确诊人数排列的,与本地经纬度表排序不一致
# 我们将省份相同的名称对应的confirm(初始confirm都是0)值相加,得到重新排序后的确诊人数列表
def data_merge(A, B):
    C = dict()
    for key in A:
        if B.get(key):
            C[key] = A[key] + B[key]
        else:
            C[key] = A[key]
    for key in B:
        if not A.get(key):
            C[key] = B[key]
    return C

if __name__ == '__main__':
    distribution_map()

 各省标注数据data.xls

province,lat,lon,confirm
新疆,41.0225983,85.8501968,0
西藏,31.6832008,87.1588974,0
青海,35.7282982,95.1300964,0
四川,30.1128006,102.2679977,0
云南,24.3069,101.0790024,0
贵州,26.7101002,106.6940002,0
广西,23.4979,108.7289963,0
广东,23.2479992,113.4400024,0
湖南,27.6737995,111.5130005,0
江西,27.6023998,115.6169968,0
福建,25.9249001,118.0439987,0
浙江,29.2443008,120.0070038,0
安徽,31.7784004,117.1880035,0
湖北,30.9932003,112.5479965,0
陕西,33.919899,108.7289963,0
河南,33.8128014,113.6900024,0
江苏,32.8492012,119.9000015,0
山东,36.3470001,117.8300018,0
河北,38.4528008,115.2959976,0
山西,37.5247993,112.3690033,0
宁夏,37.3106003,106.1949997,0
甘肃,35.0976982,104.2669983,0
内蒙古,41.3557014,110.7630005,0
海南,19.0720997,109.6340027,0
黑龙江,46.8582001,128.6929932,0
吉林,43.6102982,126.1949997,0
辽宁,41.2902985,122.9110031,0
北京,40.2593994,116.4540024,0
天津,39.1885986,117.3700027,0
台湾,23.8621006,120.9929962,0
香港,22.2971992,114.2539978,0
澳门,22.0948009,113.4820023,0
上海,31.0734005,121.4680023,0
重庆,29.8883991,107.7310028,0

参考:

1、Python 实现 2019 新型冠状病毒疫情地图可视化 (basemap + matplotlib)

2、Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图

发布了40 篇原创文章 · 获赞 6 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/mrbaolong/article/details/104212918