升级版,用Python来进行多条曲线动态演示全球疫情变化

Python读取文本绘制动态速度曲线(多图同步显示) 由于需要分析机械加工过程中各个轴的速度,于是用软件导出了数据,写了这个python脚本来显示速度曲线。 效果图如下: 源代码: import numpy as np from matplotlib import pyplot as plt from matplotlib import animation path = "Nccut_TraceFile.log" file = open( 阅读详情

作者:Lemon

出品:Python数据之道


用 Python 动态曲线图来对全球疫情进行演示

大家好,我是 Lemon 。

最近一段时间,我写了几篇用 Python 的交互式可视化工具 Plotly 来演示全球疫情情况的文章,如下:

如今(截至3月31日),全球确诊数量将近80万人,美国确诊数量已超过16万人,成为目前人数最多的国家,美国疫情的快速发展也给全球增添了更大的不确定性。

今天,Lemon 继续来分享用 Plotly 对疫情情况进行可视化。 作为上次文章内容的升级版,本次我们用 Plotly 来实现多条曲线的动态演示。先来看最终的效果:

数据来源

本次我们主要使用动态曲线来可视化分析疫情的发展情况,疫情的数据来源于开源项目 Akshare 。为了代码和演示情况能够复现,这里我提供了保存好的数据供大家练习使用,本文的完整代码及数据文件在文末提供了获取方式。

准备工作

照例,还是先介绍下我运行的环境。

  • Mac 系统

  • Anaconda(Python 3.7)

  • Jupyter Notebook

我是在 Jupyter Notebook 中运行代码的,本次使用到的 Python 库包括 akshare, pandas, plotly 等,首先我们需要将这些工具进行导入。

接着,我们读取已获得的数据(已保存的数据是截至3月31日)。

# 从 akshare 获取数据
# df_all_history = ak.epidemic_history()
# 从csv文件获取数据,这个数据文件的数据截止到3月31日
df_all_history = pd.read_csv('epidemic_all_20200331.csv',index_col=0)
df_all_history

获取数据后,根据本次数据分析和可视化的目的,Lemon 对数据进行了初步整理

# 整理数据
# 将数据复制一份
df_all = df_all_history
# 将字符串格式的日期 另保存为一列
# df_all['dates'] = df_all_history['date']
# 将字符串格式的日期转换为 日期格式
df_all['date'] = pd.to_datetime(df_all['date'])
# 将时间格式转为字符串格式的日期,以 YYYY-mm-dd 的形式保存
df_all['dates'] = df_all['date'].apply(lambda x:x.strftime('%Y-%m-%d'))
# 添加现存确诊列
df_all['current'] = df_all['confirmed'] - df_all['cured'] - df_all['dead']
df_all.fillna('', inplace=True)
print(df_all.info())
df_all

获取国外和国内的疫情数据

上面的数据,是全球的数据,其中也包括国内各个省市的数据。我们可以将数据进行整理,分别提取出中国和海外国家的数据。

# 国内总计数量
df_china_total = df_all.query("country=='中国' and province==''") 
df_china_total = df_china_total.sort_values('date',ascending=False)
# df_china_total
# 国外,按国家统计
df_oversea = df_all.query("country!='中国'") 
df_oversea.fillna(value="", inplace=True)
# df_oversea
# # 全球总计
df_global =  df_china_total.append(df_oversea)
df_global = df_global.sort_values(['country','date'])
df_global

进一步,我们可以梳理出海外国家的总计概况,同时,将国内的数据也提取出相应的字段。

df_oversea_total = df_oversea.groupby(['date','dates'])['confirmed','cured','dead','current'].sum()
df_oversea_total.reset_index(level=1,inplace=True)
df_oversea_total['district'] = 'oversea'
# df_oversea_total
df_china_sum = df_china_total[['date','dates','confirmed','cured','dead','current']]
df_china_sum.set_index('date',inplace=True)
df_china_sum['district'] = 'China'
# df_china_sum
df_total = df_oversea_total.append(df_china_sum)
df_total.sort_index(ascending=True,inplace=True)
df_total

由于国外从1月16日起,才开始有统计数据,因此我们的可视化从这个日期开始。

# 国外从 1月16日起,才开始有统计数据
df_total_analysis = df_total['20200116':]
df_total_analysis

疫情可视化

我们先来用 plotly express 对海外国家 和 国内情况的发展来做一个总的概览。

fig_total = px.line(df_total_analysis, x='dates', y='confirmed', line_group='district', 
                      color='district', color_discrete_sequence=px.colors.qualitative.D3,
                      hover_name='district',template='plotly_white',
                    width=500,height=600,
                    title=dict(text='Covid-19-trend',
                               font=dict(size=16,color='#0071c1'),
                              x=0.5)
                     )
fig_total.show()

从上面的趋势来看,国内基本趋稳了,而海外国家作为总体来看,还在快速发展。

这里仅仅是做简单的可视化,至于将中国和海外国家总体做对比分析,是否合理,这里只是个示例,不做进一步阐述。

上图中的曲线,并不能动态的演示变化过程,在 px.line 中,Lemon 也研究了下,暂时没有实现将曲线进行动态可视化的功能。

下面,Lemon 将用 Plotly 原生的功能来实现多条曲线的动态可视化。

动态曲线演示疫情情况

在 Plotly 中,将曲线(Line)进行动态演示,需要通过几个步骤来实现

  1. 对初始状态进行可视化,每条曲线将起始的两个点绘制成曲线;

  2. 通过构造字典的形式,在 frames 中实现曲线的动态变化;

  3. 添加演示按钮,

多条曲线的动态可视化,关键是如何便捷的添加多条曲线,尤其考虑有时曲线数量较多,有时数量经常发生变化。

针对上述情况,我们需要将程序设计的相对灵活些,这里介绍的方法,主要是将 dataframe 以 value 的形式装入到字典里。

至于曲线的多少,可以将元素包含在列表 list 中,这样就可以灵活的实现曲线数量的变化。

多条曲线动态演示的代码如下:

# 日期
m = df_global_latest.iloc[0]['date'].month
d = df_global_latest.iloc[0]['date'].day
text_today = f'数据统计截止{m}月{d}日'
df_compare = df_global.set_index('date')
df_compare = df_compare['20200220':]
list_countries = ["美国","英国","意大利","德国","西班牙","伊朗","瑞士","法国","中国","韩国"]
n_countries = len(list_countries)
n_list = [i for i in range(n_countries)] # 曲线数量编号
# print(n_list)
n_frame={}
for country_i in list_countries:
    df_i = df_compare.query('country==@country_i') # @ 代表变量
    df_i = df_i.sort_index(ascending=True)
    n_frame[country_i] = df_i
# 计算 最大的确诊人数
# 初始值为0
y_max = 0
for country_i in list_countries:
    y_max_i = n_frame[country_i]['confirmed'].max()
    y_max = max(y_max,y_max_i)
df_01 = n_frame[list_countries[0]] # 第一个国家
# print(df_01)
traces = [go.Scatter(
                    x = value.index[:2],   # value 是 国家的数据,dataframe
                    y = value['confirmed'][:2],
                    mode='lines', # markers+lines
                    name=key,  # key 是国家名称
                    line=dict(width=1.5)
                    ) for key,value in n_frame.items()
         ]
frames = [dict(data= [dict(type='scatter',
                           x=value.index[:k+1],
                           y=value['confirmed'][:k+1]) for key,value in n_frame.items()
                     ],
               traces= n_list,  
              )for k  in  range(1, len(n_frame[list_countries[0]]))] 
layout = go.Layout(width=500,
                   height=700,
                   showlegend=True,
                   template='plotly_dark',
                   hovermode='closest',
                   updatemenus=[dict(type='buttons', showactive=False,
                                y=1.10,
                                x=1.15,
                                xanchor='right',
                                yanchor='top',
                                pad=dict(t=0, r=10),
                                buttons=[dict(label='Play',
                                              method='animate',
                                              args=[None, 
                                                    dict(frame=dict(duration=100, 
                                                                    redraw=False),
                                                         transition=dict(duration=1),
                                                         fromcurrent=True,
                                                         mode='immediate')])])],                   
                  )
layout.update(xaxis =dict(range=[df_01.index[0], 
                                 df_01.index[len(df_01)-1]+pd.Timedelta(days=2)
                                ], 
                          autorange=False),
              yaxis =dict(range=[0, y_max*1.05], autorange=False))
fig = go.Figure(data=traces, frames=frames, layout=layout)
# Pycharm,VS Code, Spider 等模式下
# Jupyter Notebook 下也可以用
plot(fig,filename='covid-19-multiple-lines.html')
# Jupyter Notebook 中
# fig.show()

上面代码中, go.Layout 中的 duration 可以来控制按钮点击后变化的速度。

运行上述代码后,得到的效果如下:

曲线可以动起来了,是不是很棒啊。

为方便大家进行操作,Lemon 给大家提供了本文的 PDF 版内容(含完整的代码)以及数据文件,可以在公众号 「Python数据之道」后台回复数字 「661」进行获取。

(完)

Python动态曲线图演示全球疫情数据实战项目 这一行代码就揭示了各国疫情发展的巨大差异。比如美国、印度这些人口大国通常具有极高的极差,反映出疫情波峰波谷剧烈波动的特点。箱线图更是异常值探测的好帮手:对数坐标下,那些刺眼的离群点无所遁形。记得某天某国突然报告50万新增?八成是累计数据修正造成的”虚假”暴增。回顾这段旅程,从最初的到最后的动态动画,每一步都凝聚着无数工程师的智慧结晶。但这不仅仅是技术的胜利,更是思维方式的进化。真正优秀的数据产品,应该像一部纪录片:既有严谨的事实基础,又有打动人心的叙事节奏。 阅读详情

相关推荐

20200401-用Python来进行多条曲线动态演示全球疫情变化.zip

用Python来进行多条曲线动态演示全球疫情变化。

刷爆全网的动态条形图,原来5行Python代码就能实现!

说起动态图表,最火的莫过于动态条形图了。在B站上搜索「数据可视化」这个关键词,可以看到很多与动态条形图相关的视频。好多视频都达到了上百万的播放量,属实厉害。目前网上实现动态条形图现成的工...

法纳斯特 2707

python绘制新型冠状病毒疫情地图与疫情曲线

python绘制新型冠状病毒疫情地图与疫情曲线。 读取腾讯的接口获得数据,再使用matplotlib库进行绘制。

python动态爱心曲线_使用matplotlib动态刷新指定曲线实例

我就废话不多说啦,还是直接看代码吧!from matplotlib import pyplot as pltimport numpy as npx = np.linspace(1, 100, 20)y = x *2 +3fig = plt.figure()ax = fig.add_subplot(1,1,1)ax.scatter(x, y)plt.ion()for i in range(10):y...

weixin_39554172的博客 362

爬虫小例--爬药监局(上)

”明月如霜,好风如水,清景无限 “ 文远最近也算是爬虫入门吧,相信后面会慢慢熟悉。 壹 直接上例子,爬取药监局的数据。目的是得到每家公司的详情数据,例: 具体网址:http://scxk.nmpa.gov.cn:81/xk/ 这是主页,下面详情信息: 贰 分析,通过网页检查发现,主网页上没有公司相关数据,观察XHR中的Ajax请求发现,公司信息都是动态数据(方便更新),点击发现每个公司 的详情信息通过ID号这个参数区别,那么可以确定思路是先得到每个公司的ID号,然后在通过ID对应每一个详细网站,同样右键

john_ashley的博客 4556

开源onlyoffice编译完整过坑版

onlyoffice 编译过坑完整版;

sHImart 4551

Python动态可视化Plotly

Python动态可视化Plotly

weixin_39559994的博客 1048

金蝶云星空API实战:从零到一,用Postman打通业务数据流

本文详细介绍了如何使用Postman调试金蝶云星空API,从创建第三方应用到实战调试技巧,帮助开发者快速打通业务数据流。文章重点讲解了API配置的关键细节、常见问题排查方法以及自动化测试方案,提升开发效率与准确性。

weixin_33712987的博客 519

太酷了,用Python实现一个动态条形图!

数据可视化项目实战~

法纳斯特 5775

广义标签多伯努利滤波器(GLMB):多目标跟踪中的动态身份维护理论与算法解析

目标集表示Xx1l1x2l2xNlNX{(x1​l1​x2​l2​xN​lN​)}xi∈Rdxi​∈Rd为目标状态(如位置、速度),li∈Lli​∈L为唯一标签(可数无限集,如自然数序列),N 为目标数(允许N0N=0N0,即空集)。GLMB 通过广义化标签多伯努利分布,将多目标跟踪从 “状态估计” 提升至 “动态身份 - 状态联合建模”,成为复杂场景下精准跟踪的核心技术。

qq_44965657的博客 1599

Python实现ARIMA模型

以下是一个使用Python实现ARIMA(自回归移动平均模型)的简单示例代码。在运行代码之前,请确保已经安装了pandasnumpy和库。ARIMAorder(2,0,2)p = 2d = 0q = 2forecastmatplotlib在实际应用中,你需要将模拟数据替换为真实的时间序列数据,并且通过合适的方法(如信息准则等)来确定pdq的最佳值。除了auto_arima在使用pmdarima。

huanghm88的专栏 1736

用 Python 动态曲线图来对全球疫情进行演示

作者:Lemon出品:Python数据之道用 Python 动态曲线图来对全球疫情进行演示各位同学好,我是 Lemon 。最近一段时间,我写了几篇用 P...

Python数据之道 7246

损失函数大汇总(五十九)(TopoInteraction Loss附公式推导与代码)

本文介绍了TopoInteraction Loss,一种用于多类别分割任务的拓扑交互约束损失函数。不同于传统拓扑损失关注单类别的连通性和孔洞数量,该损失重点约束不同类别之间的空间关系,包括互斥(exclusion)和包含(containment)两种典型拓扑关系。通过将全局拓扑约束转化为局部邻接检测,该损失能准确定位破坏预设拓扑关系的像素,并针对性施加惩罚。关键创新点在于:1)将包含关系转化为互斥约束;2)使用卷积运算高效检测非法邻接;3)仅对违规像素施加损失。实验表明,该方法能有效纠正类别间的错误接触,特

悦学共鸣,温柔以待,汇聚光芒,共同成长 350

用 Python可视化神器 Plotly 动态演示全球疫情变化趋势

作者:Lemonbit出品:Python数据之道用 Python可视化神器 Plotly动态演示全球疫情变化趋势各位同学早上好,我是 Lemonbit 。近期对疫情数据进行可视化的内容...

Python数据之道 5745

ISO2626 --- Item Definition相关项定义

本文并不是针对ISO26262的一个项目,而是针对ISO26262的规范,我们在相关项定义阶段,我们需要做什么,我们的文档需要包含哪些内容的一个描述。

wj博客 909

如何解决Dify重新部署(升级到最新版)后出现的Setup failed: PermissionDenied等问题

重新部署(升级)Dify后遇到Permission denied错误?🚫 本文详细分析了这个问题的原因🔐,并提供了完整的解决步骤来修复这个问题✨

XiaoqiangClub的博客 1654

利用Python实现新冠疫情数据可视化(获取疫情历史数据,制作南丁格尔玫瑰图、疫情地图、动态疫情组合图、词云)

文章目录 前言 从今年年初爆发的新冠疫情,截止至当前9.21,全球累计确诊人数已超三千万,死亡人数近百万,这对于世界各国人民而言无疑是一场巨大的灾难。当前国内疫情局势已基本稳定,而美国、印度、巴西等国家的感染人数仍以较快的速度持续增长,情况不容乐观。 本文利用Python的pyecharts与matplotlib库制作了一些疫情可视化图来展现全球疫情的发展趋势,由于本人才疏学浅,难免有纰漏,欢迎指正。 1.获取疫情历史数据 本文的疫情历史数据从百度获取,几行代码即可,链接:https://voice.b

maiyida123的博客 3万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

超火动态排序疫情变化图,这次我们用 Plotly来绘制

超火动态排序疫情变化图,这次我们用 Plotly来绘制各位同学早上好,我是 Lemonbit 。国内的疫情基本进入扫尾阶段了,但国外疫情还处于爆发的高峰...

Python数据之道 4297

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

用 Python 可视化神器 Plotly 动态演示全球疫情变化趋势

“ 阅读本文大概需要 9 分钟。 ”大家好,今天转载的这一篇是借助 Plotly 工具来演示全球疫情变化趋势,同时该技能在日常的报表制作中也十分实用。...

静觅 719

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

用 Plotly 动态柱状图来演示全球疫情变化趋势 | 付费阅读文章处女作

用 Plotly 动态柱状图来演示全球疫情变化趋势各位同学早上好,我是 Lemonbit 。终于收到付费阅读的邀请了,今天发点技术类的干货,这篇文章后面需要付费阅读,收费就象征性的吧,看...

Python数据之道 2555

用 Python可视化神器 Plotly 动态演示全球疫情变化趋势!

用 Python可视化神器 Plotly 动态演示全球疫情变化趋势 各位同学早上好,我是 Lemonbit 。 近期对疫情数据进行可视化的内容比较多,今天我来用 Python 可视化申请 Plotly 对国外的疫情发展情况进行可视化,以项目实战的形式,在分析和了解国外疫情变化趋势的同时,加深大家对 Plotly 的学习应用。 在开始之前,我们先来看看最终制作的部分效果图,如果你觉得有兴趣...

爬遍所有网站 645
上一篇: 面向对象编程,再见!
下一篇: 太火了:中文版开源!这或许是最经典的 Python 编程教材
Wang_AI
博客等级 码龄12年 991粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值