一、效果演示

我用python开发了一个动态疫情地图,首先看下效果:

如图所示,地图根据实时数据通过时间线轮播的方式,动态展示数据的变化。随着时间的推移,疫情确诊数量的增多,地图各个省份颜色逐渐加深,可以很明显地看到动态可视化效果。

这个动态疫情地图,是通过python的第三方库pyecharts制作完成的。数据来源是github上的一位大神:

https://github.com/BlankerL/DXY-COVID-19-Data

在此,感谢github作者整理的数据来源,方便我们数据分析人员使用。

针对此数据源,我还开发了一个定时自动下载疫情数据的python脚本,有兴趣的小伙伴可以滴滴我。

二、代码分解

下面,通过python代码(部分核心代码)逐一分解,这个动态疫情地图是怎样实现的:

首先,导入需要的库:

import pandas as pd  # 用于读取excel文件
from pyecharts import options as opts # 可视化选项
from pyecharts.charts import Timeline, Map # 时间线、地图
from pyecharts.globals import ThemeType # 图表主题

然后,定义好数据源文件,并做一些初始的数据清洗、数据预处理工作:

# 数据源文件
src_file = 'DXYArea_0214.xls'
# 中间文件
mid_file = 'to_csv4.csv'
# 疫情地图所用颜色
list_color = ['#F4AD8B', '#EF826F', '#EE806E', '#BD3932', '#801D17']
# 读取数据
df = pd.read_excel(io=src_file, usecols=['provinceName',
'province_confirmedCount',
'updateTime'],
) # 读取数据源
df['updateTime'] = df['updateTime'].astype(str).str[0:10]
df2 = df.groupby(['provinceName', 'updateTime']).apply(
lambda t: t[t.province_confirmedCount == t.province_confirmedCount.max()]) # 按省份日期分组统计确诊数量
df2 = df2[['provinceName', 'province_confirmedCount', 'updateTime']]
df2 = df2.drop_duplicates() # 删除重复值
df2 = df2.reset_index(drop=True) # 重置索引
df2.to_csv(mid_file, index=False) # 保存csv
df3 = pd.read_csv(mid_file)

筛选出指定日期的数据,并做一定的数据处理,供后续可视化代码读取调用:

# 筛选出指定日期的数据
df_20200201 = df3[df3['updateTime'].str.contains("2020-02-01")]
df_20200202 = df3[df3['updateTime'].str.contains("2020-02-02")]
df_20200203 = df3[df3['updateTime'].str.contains("2020-02-03")]
df_20200204 = df3[df3['updateTime'].str.contains("2020-02-04")]
df_20200205 = df3[df3['updateTime'].str.contains("2020-02-05")]
df_20200206 = df3[df3['updateTime'].str.contains("2020-02-06")]
df_20200207 = df3[df3['updateTime'].str.contains("2020-02-07")]
df_20200208 = df3[df3['updateTime'].str.contains("2020-02-08")]
df_20200209 = df3[df3['updateTime'].str.contains("2020-02-09")]
df_20200210 = df3[df3['updateTime'].str.contains("2020-02-10")]
df_20200211 = df3[df3['updateTime'].str.contains("2020-02-11")]
df_20200212 = df3[df3['updateTime'].str.contains("2020-02-12")]
df_20200213 = df3[df3['updateTime'].str.contains("2020-02-13")]

最后,也是最关键的代码,可视化地图部分:

def timeline_map() -> Timeline:
tl = Timeline(init_opts=opts.InitOpts(page_title="疫情地图4",
theme=ThemeType.CHALK,
width="1000px", height="620px"),
)
for idx in range(0, 13):
provinces = []
confirm_value = []
for item_pv in df_list[idx]['provinceName']:
provinces.append(item_pv)
for item_pc in df_list[idx]['province_confirmedCount']:
confirm_value.append(item_pc)
zipped = zip(provinces, confirm_value)
f_map = (
Map(init_opts=opts.InitOpts(width="900px",
height="500px",
page_title="疫情地图4",
bg_color=None))
.add(series_name="确诊数量",
data_pair=[list(z) for z in zipped],
maptype="china",
is_map_symbol_show=False)
.set_global_opts(
title_opts=opts.TitleOpts(title="2月全国疫情地图",
subtitle="2月{}日-当天数据\n"
"数据源:https://github.com/BlankerL/DXY-COVID-19-Data\n"
"注:仅限个人研究使用,请勿用作商业用途!".format(
idx + 1),
pos_left="center", ),
legend_opts=opts.LegendOpts(is_show=True, pos_top="40px", pos_right="30px"),
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True, range_text=['高', '低'], pieces=[
{"min": 10000, "color": "#751d0d"},
{"min": 1000, "max": 9999, "color": "#ae2a23"},
{"min": 500, "max": 999, "color": "#d6564c"},
{"min": 100, "max": 499, "color": "#f19178"},
{"min": 10, "max": 99, "color": "#f7d3a6"},
{"min": 1, "max": 9, "color": "#fdf2d3"},
{"min": 0, "max": 0, "color": "#FFFFFF"}
]),
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=True),
markpoint_opts=opts.MarkPointOpts(
symbol_size=[90, 90], symbol='circle'),
effect_opts=opts.EffectOpts(is_show='True', )
)
)
tl.add(f_map, "{}日".format(idx + 1))
tl.add_schema(is_timeline_show=True, # 是否显示
play_interval=800, # 播放间隔
symbol=None, # 图标
is_loop_play=True # 循环播放
)
return tl

核心代码就是这些,执行成功之后,就是这样的效果啦:


首发公号文章:

https://mp.weixin.qq.com/s?__biz=MzU5MjQ2MzI0Nw==&mid=2247484584&idx=1&sn=9d41a5efea81d4b95a9b140a85733e64&chksm=fe1e1048c969995e96830f8affd9bfdce27ae554fba6cd70a3e92a00d0651f023f090214aded&payreadticket=HNX8rqPS1qQNF8HEZhyWNTfIrT5zodFL_C0RG3tb1iJ8CCDaGaWQmRBPhsc0VXsSzGT6VNw#rd

【python疫情可视化】用pyecharts开发全国疫情动态地图,效果酷炫!的更多相关文章

  1. 【python可视化系列】python数据可视化利器--pyecharts

    学可视化就跟学弹吉他一样,刚开始你会觉得自己弹出来的是噪音,也就有了在使用python可视化的时候,总说,我擦,为啥别人画的图那么溜: [python可视化系列]python数据可视化利器--pyec ...

  2. python数据可视化:pyecharts

    发现了一个做数据可视化非常好的库:pyecharts.非常便捷好用,大力推荐!! 官方介绍:pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 ...

  3. Python数据可视化实战:实时更新海外疫情数据,实现数据可视化

    前言 我国的疫情已经得到了科学的控制,开始了全面的复工复产,但是国外的疫情却“停不下来”.国外现在可谓就是处于水深火热当中啊,病毒极强的传染性,导致了许多的人都“中招”了,我国已经全面复工复产了,人大 ...

  4. 【疫情动态条形图】用Python开发全球疫情排名动态条形图bar_chart_race

    一.开发背景 你好,我是 @马哥python说 ,这是我用Python开发的全球疫情动态条形图,演示效果: https://www.zhihu.com/zvideo/15603276220259696 ...

  5. Codevs 1218 疫情控制 2012年NOIP全国联赛提高组

    1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...

  6. 如何使用Python快速制作可视化报表----pyecharts

    如何使用Python快速制作可视化报表   数据可视化能力已经越来越成为各岗位的基础技能.领英的数据报告显示,数据可视化技能在2017年中国最热门技能中排名第一. 就数据分析而言,可视化探索几乎是你正 ...

  7. (数据科学学习手札108)Python+Dash快速web应用开发——静态部件篇(上)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  8. (数据科学学习手札121)Python+Dash快速web应用开发——项目结构篇

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  9. Python数据可视化编程实战pdf

    Python数据可视化编程实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1vAvKwCry4P4QeofW-RqZ_A 提取码:9pcd 复制这段内容后打开百度 ...

随机推荐

  1. memcached 与 redis 的区别?

    1.Redis 不仅仅支持简单的 k/v 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储.而 memcache 只支持简单数据类型,需要客户端自己处理复 杂对象 2.R ...

  2. IOC 的优点是什么?

    IOC 或 依赖注入把应用的代码量降到最低.它使应用容易测试,单元测试不再需 要单例和 JNDI 查找机制.最小的代价和最小的侵入性使松散耦合得以实现.IOC 容器支持加载服务时的饿汉式初始化和懒加载 ...

  3. Linux运维最常用150个命令

    线上查询及帮助命令(2个) man 查看命令帮助,命令的词典,更复杂的还有info,但不常用. help 查看Linux内置命令的帮助,比如cd命令. 文件和目录操作命令(18个) ls 全拼list ...

  4. js--事件循环机制

    前言 我们知道JavaScript 是单线程的编程语言,只能同一时间内做一件事,按顺序来处理事件,但是在遇到异步事件的时候,js线程并没有阻塞,还会继续执行,这又是为什么呢?本文来总结一下js 的事件 ...

  5. 6_稳定性_李雅普诺夫_Lyapunov

    李雅普诺夫方法参考  

  6. Python3通过字符串访问与修改局部变量

    技术背景 在Python中定义一个函数时,就会把变量空间划分为全局变量(global)与局部变量(local),如果是定义在一个类的成员函数中,那么就还有额外的成员变量(self)空间.那么,如果在实 ...

  7. 要多简单就有多简单的H5拍照加水印

    来一个简单粗暴的gif演示图 先来html 内容 <video id="video" width="320" height="240" ...

  8. 【Android开发】URL 转义与反转义

    1,转义 @org.junit.Test public void testEncode(){ String url="http://192.168.0.19:8888/cas/login&q ...

  9. Photoshop之用“色彩范围”命令抠像

    1. 打开一个文件.执行"选择>色彩范围",勾选"本地化颜色族",然后在任务背景上单击取样. 2. 取好样以后点击确定,图片如下所示,执行"选择 ...

  10. 微信h5支付/jsapi支付/小程序支付

    一. 介绍------------------------------------------------------------------ 微信支付官方开发文档:  https://pay.wei ...