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


数据集介绍

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)
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值