用Pandas和Folium做一个新冠数据可视化

目录

  • 数据集介绍
  • 可视化步骤
    • 1. 导入pandas等需要的库
    • 2. 读取数据,查看基本情况
    • 3. 读取城市坐标数据
    • 4. 按省份统计人数
    • 5. 合并城市坐标数据 与 省份数据
    • 6. 绘制地图写入HTML文件,并用浏览器打开
  • 完整代码


数据集介绍

1.100000_full.json (地理位置数据集,用于绘制地理边界)
2.china_coordinates.csv (全国城市位置数据集,用于定位每个城市位置)
3.DXYArea.csv (2020-2-9全国新冠数据集)
数据集

数据集下载链接:https://download.csdn.net/download/Cristiano272/12351183

可视化步骤

1. 导入pandas等需要的库

import numpy as np
import pandas as pd
import warnings
import folium
import webbrowser as wb

2. 读取数据,查看基本情况

def df():
    df = pd.read_csv("data/DXYArea.csv")
    # df.info()
    # print(df.head())
    return df

3. 读取城市坐标数据

def coord():
    coord = pd.read_csv('data/china_coordinates.csv', names=['postcode', 'city', 'lon', 'lat'])
    # print(coord.head())
    return coord

4. 按省份统计人数

def pc():
    pc = df.groupby('provinceName').province_confirmedCount.agg('max')
    # print(province_confirmedCount)
    return pc

5. 合并城市坐标数据 与 省份数据

def merge(coord, pc):
    coord['confirm'] = coord['city']
    coord['confirm'] = coord['confirm'].map(pc.to_dict())
    # print(coord.head())
    return coord

6. 绘制地图写入HTML文件,并用浏览器打开

def map(df_prov):
    # 绘制地图:location 地图中心位置坐标(纬度lat,经度lon), zoom_start 地图放大系数
    map = folium.Map(location=[39.929986, 116.395645], zoom_start=4)
    # 取对数解决色彩条不均衡问题
    df_prov['logconfirm'] = np.log(df_prov['confirm'])
    folium.Choropleth(
        name='热图',  # 名称
        geo_data=open('data/100000_full.json', 'r', encoding='UTF-8').read(),  # 数据文件
        data=df_prov.set_index(df_prov.city),  # 数据集
        columns=['city', 'logconfirm'],  # 列名称
        key_on='feature.properties.name',  # 匹配geo_data 中的属性值
        fill_color='Reds',  # 色彩配置
        # bins = [0, 100, 500, 1000, 10000, 30000] # 数据区间范围
    ).add_to(map)

    # 将人数增加到地图上
    for d in df_prov.itertuples():
        folium.Marker(
            location=[d.lat, d.lon],
            icon=folium.Icon(color='red') if d.confirm > 1000 else (
                folium.Icon(color='orange') if d.confirm > 100 else folium.Icon(color='blue')),
            tooltip="{} 确诊 {} 例".format(d.city, int(d.confirm))
        ).add_to(map)
	
	# 存入html文件里,并用浏览器打开
    map.save('map/map.html')
    wb.get("D:/Google/Chrome/Application/chrome.exe %s").open('map/map.html') # wb.get(浏览器地址)

完整代码

# 导入pandas等需要的库
import numpy as np
import pandas as pd
import warnings
import folium
import webbrowser as wb


def df():
    # 读取数据,查看基本情况
    df = pd.read_csv("data/DXYArea.csv")
    # df.info()
    # print(df.head())
    return df


def coord():
    # 读取城市坐标数据
    coord = pd.read_csv('data/china_coordinates.csv', names=['postcode', 'city', 'lon', 'lat'])
    # print(coord.head())
    return coord


def pc():
    # 按省份统计人数
    pc = df.groupby('provinceName').province_confirmedCount.agg('max')
    # print(province_confirmedCount)
    return pc


def merge(coord, pc):
    # 合并城市坐标数据 与 省份数据
    coord['confirm'] = coord['city']
    coord['confirm'] = coord['confirm'].map(pc.to_dict())
    # print(coord.head())
    return coord


def map(df_prov):
    # 绘制地图:location 地图中心位置坐标(纬度lat,经度lon), zoom_start 地图放大系数
    map = folium.Map(location=[39.929986, 116.395645], zoom_start=4)
    # 取对数解决色彩条不均衡问题
    df_prov['logconfirm'] = np.log(df_prov['confirm'])
    folium.Choropleth(
        name='热图',  # 名称
        geo_data=open('data/100000_full.json', 'r', encoding='UTF-8').read(),  # 数据文件
        data=df_prov.set_index(df_prov.city),  # 数据集
        columns=['city', 'logconfirm'],  # 列名称
        key_on='feature.properties.name',  # 匹配geo_data 中的属性值
        fill_color='Reds',  # 色彩配置
        # bins = [0, 100, 500, 1000, 10000, 30000] # 数据区间范围
    ).add_to(map)

    # 将人数增加到地图上
    for d in df_prov.itertuples():
        folium.Marker(
            location=[d.lat, d.lon],
            icon=folium.Icon(color='red') if d.confirm > 1000 else (
                folium.Icon(color='orange') if d.confirm > 100 else folium.Icon(color='blue')),
            tooltip="{} 确诊 {} 例".format(d.city, int(d.confirm))
        ).add_to(map)

    # 存入html文件里,并用浏览器打开
    map.save('map/map.html')
    wb.get("D:/Google/Chrome/Application/chrome.exe %s").open('map/map.html') # wb.get(浏览器地址)


if __name__ == "__main__":
    # 忽略警告信息
    warnings.filterwarnings('ignore')

    df = df()
    coord = coord()
    province_confirmedCount = pc()

    coord = merge(coord, province_confirmedCount)

    df_prov = coord.dropna()
    # print(df_prov)

    map(df_prov)

你可能感兴趣的:(Python)