-1 关于plotly 的小问题

因为plotly用着还不熟练,我把我遇到的一些plotly调用问题总结了一下:

  • [打补丁]plotly常见问题

0. 前言:

疫情期间,工作‘过于‘繁忙。。。教程早已编好,文稿却没更出来。。。
(伪)鲁迅曾经说过:所有的数据都应该被‘画’出来,而不是‘写’出来。

自接触数据科学起,我就异常热衷于’画‘出更好的数据图(逼死强迫症)。作为一个曾经的通信人,Matlab告诉我,不能交互的数据图永远不算完美。什么matplotlib,seaborn,甚至ggplot。我只想说,普通。。。直到 plotly出现。

1. plotly介绍

plotly官方文档: https://plotly.com/python

plotly是一个可交互的 开源 开源 开源 python数据可视化库。在顶层通过 JavaScript(plotly.js)库生成web-based 可视化图表。
(可以直接生成网页,还能集成在jupyter-notebook | jupyter-lab(需要额外插件)| VS code 中直接显示)
另外,plotly 作为python 数据生态中的重要一环,也创建了相应的网页数据报表 – Dash ,对标R shiny,Tableau,MS PowerBI(后两个为商业软件,集成环境更优秀,而且价格也挺贵。。。)

当然, plotly & Dash也分为开源版本商用版本, 并且4.0版本之前都可以使用online/offline 两种模式。其中online模式需要注册账号, 上传的图表可以使用Chart Studio对细节进行更改。 4.0之后的版本已经将online模式彻底移植到 chart-studio 中,

  • 开源版本一切免费,证书为github上的开源证书 – MIT license,No Technical Supports!!(除了bug自己调试 或者等待在下个版本解决)
  • 商用版本各种服务收费,还能使用有UI界面的Chart Studio修图。价格嘛,详情需要自己咨询。。。

1.1 安装

pip 和conda 都可以直接安装, 截止到目前为止 最新版本为 4.6.0 (plotly >=4.0.0 只有offline 模式

pip install plotly==4.6.0

考虑到各个packages 的版本依赖关系, 更推荐通过conda安装

conda install -c plotly plotly==4.6.0

我一直用jupyter-lab, 额外的extensions安装如下 (jupyter 安装extensions 需要提前安装 node.js。。。):

conda install jupyterlab
conda install ipywidgets
jupyter labextension install @jupyter-widgets/jupyterlab-manager@1.1 --no-build
jupyter labextension install jupyterlab-plotly@4.6.0 --no-build
jupyter labextension install plotlywidget@4.6.0 --no-build
jupyter lab build

1.2 plotly 子模块

在最开始使用plotly的时候,我唯一的一个疑问就是,搞不清楚什么时候使用什么模块。为此,特意去研究了一下官方提供的API教程。

plotly分为 5个重要子模块:

  • express 模块:高级画图API,类似seaborn,可以用简单的代码,通过读取dataframe,画出相对复杂的分布曲线,kde曲线。
  • graph_objects 模块: 底层画图API, 类似 matplotlib.pyplot, 可以精确控制图像中的每一个变量,图像figure的大小,图像布局,曲线的粗细,点击曲线后显示的信息,etc。但是 每一个变量都需要用户自主声明。
  • subplots 模块:用于创建多图布局 类似 pyplot 中的subplots
  • figure_factory 模块: 用于创建特定复杂的图表
  • io模块: input/output模块 用于读取/生成 各种格式的图表 (HTML, json, images, etc…)

2. 数据可视化:

数据来源: 约翰霍普金森大学 - 新冠病毒全球感染人数 - Github 开源数据

编程环境:

  • Python version = 3.8
  • jupyter-lab version = 1.2.6
  • plotly version = 4.6.0
  • numpy version = 1.18.1
  • pandas version = 1.0.3
  • cufflinks version = 0.17.3

2.1 读取数据

# import basic libs
import os
import pandas as pd
import numpy as np# 直接从github读取数据
df = pd.read_csv('https://raw.githubusercontent.com/CSSEGISandData/COVID-19/web-data/data/cases_time.csv', error_bad_lines=False )
df.loc[:,'Last_Update'] = pd.to_datetime(df.loc[:,'Last_Update'], format='%m/%d/%y')
print(df.shape) # output: (21384, 16) # 国家/城市坐标 & 人口数据
location_lookup_table = pd.read_csv('https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/UID_ISO_FIPS_LookUp_Table.csv', error_bad_lines=False )

数据基本情况:

# 疫情统计时间
df.loc[:,'Last_Update'].min() # Timestamp('2020-01-22 00:00:00')
df.loc[:,'Last_Update'].max() # Timestamp('2020-04-18 00:00:00')

从时间角度看,基本就是,国内暴发疫情之后的第一阶段。

2.2 创建画布

就像写网页需要CSS布局文件一样,Plotly也需要先创建一个布局 Layout
Plotly是用js 编译生成图像, 配置文件 基本就是json格式,所以各个参数可以用字典直接定义。

下面的例子里,我简单的设定了一些常用的参数,方便直接copy 使用

import plotly as py
from plotly import graph_objects as go
from plotly import subplotslayout_default = go.Layout(# color themetemplate='plotly_dark',# set titletitle = dict(text='Default Title',font={'size':30,'color':'#444'},x=0.5, #[0,1,'auto']y=0.9 # [0,1, 'auto']),# set axisxaxis=dict(visible=True,color='#444',title='default xaxis' # or dict),yaxis=dict(visible=True,color='#444',title='default yaxis', # or dicttype='-', # one of ( "-" | "linear" | "log" | "date" | "category" | "multicategory" )#range=[1,2]),# set Figure's sizeautosize=False,height=600, # in pixelwidth=1100,# set Legendshowlegend=True
)

2.3 欧洲各国的累计感染人数曲线

# 准备数据
countries = ['DEU', 'ESP', 'FRA', 'GBR', 'ITA', 'USA']
df_country = df[(df['Province_State'].isna())&(df['Last_Update'] >= '2020-03-01')]# pivot 各个国家的确诊人数
data= df_country.pivot_table(index='iso3',columns='Last_Update',values='Confirmed', fill_value=0, aggfunc='mean').loc[countries]# 创建 figure
fig = go.Figure(layout=layout_default)
# x坐标
x= data.columns.strftime('%Y-%m-%d').values.tolist()# 画多条曲线
for idx in data.index:# 官方API: https://plotly.com/python/reference/fig.add_trace(go.Scatter(x =x,y = data.loc[idx].values.tolist(),text = data.loc[idx].values.tolist(),mode = 'lines+markers',name= location_lookup_table[location_lookup_table['iso3'] == idx].iloc[0]['Country_Region'],hovertext = 'Population:{}'.format(int(location_lookup_table[location_lookup_table['iso3'] == idx].iloc[0]['Population'])),hoverinfo = 'all',# Examples: "x", "y", "x+y", "x+y+z", "all"opacity=0.5))# 略微更改一下布局
fig.update_layout(title = dict(text='<b>疫情大国</b>确诊<i>总人数</i>',font={'size':30},x=0.5, #[0,1,'auto']y=0.9 # [0,1, 'auto']),
)# 快速更改axis
fig.update_xaxes(title_text="<b>日期</b> 加粗"
)fig.update_yaxes(title_text="<i>确诊人数</i> 斜体"
)# 画图像
fig.show()

如下图:

2.4 感染严重程度以及发展情况

看了其他的API, 我发现如果要创建多个子图的画布, 最好还是直接从底层graph_objects 配合 subpots 来搭建更快捷.
如果需求仅仅是EDA过程中的数据可视化 那么 plotly.express很好的适配了pandas.DataFrame, 真的真的真的很方便!

import plotly.express as pxfig = px.scatter_geo(data_frame=df_country, locations="iso3", color="Incident_Rate",hover_name="Country_Region", size="Confirmed",animation_frame=df_country["Last_Update"].astype(str),projection="natural earth",size_max=100,width=1200, height=700)
fig.update_layout(template='plotly_dark'
)
fig.show()

输出截图(真的不会添加本地动图。。。)

2.5 其他

  • 表格 Table
    当然,除了图像绘制以外, plotly还可以显示表格, 我写了一个将df转换为plotly表格的function
# pandas.dataframe --> plotly.graph_objects.table
def TableFromPandas(df):columns = df.columnsreturn go.Table(header=dict(values=list(columns),align='left'),cells=dict(values=[df[i] for i in columns],align='left'))
fig = go.Figure(data=[TableFromPandas(df_country)]
) fig.show()

2.6 总结

其实 总体看起来,plotly底层API graph_objects参数繁多,可操作空间非常大, 配合subplots,可以制作出非常精良的报表!
用于EDA过程中的数据可视化却略有些繁琐。相对而言, plotly.express在平时相对更加实用!

另外还有一个package 叫做 cufflinks 日常用起来更加方便, 可以通过 df.iplot() 直接调用plotly API , 平时用来画些简单的分布图啊, 折线图啊 只能是真香 !

import cufflinks as cf
cf.go_offline()
cf.set_config_file(offline=False, world_readable=True)# 数据没变
df_country.pivot_table(columns='iso3',index='Last_Update',values='Confirmed', fill_value=0, aggfunc='mean')[countries].iplot(opacity=0.5, mode = 'lines')


下次更新内容:

  • 传统时序模型
  • 美股股指, 个股, 美债 走势分析

What’s More

PS : 话说,曾经用Dash制作过一个简单的审阅学生考试成绩的报表,只不过是法语版的,有需要的朋友可以拿走:
https://github.com/lhaippp/Dash_Student_Management_System

PPS:上周收到了祖国爸爸发来的急救包(不是只给留学生 lol)!口罩,莲花清瘟胶囊,消毒湿巾一应俱全。一看日期,3月23号生产!从生产到运输直到送达, 在没有物流的情况下,10多天就能全球达!

我要吹一波!!

[数据科学]001.新冠病毒全球疫情-数据可视化-plotly-完整详尽教程相关推荐

  1. [转载] python+selenium定时爬取丁香园的新冠病毒每天的数据,并制作出类似的地图(部署到云服务器)

    参考链接: Python vars() python+selenium定时爬取丁香园的新冠病毒每天的数据,并制作出类似的地图(部署到云服务器) 声明:仅供技术交流,请勿用于非法用途,如有其它非法用途造 ...

  2. python+selenium定时爬取丁香园的新冠病毒每天的数据,并制作出类似的地图(部署到云服务器)

    python+selenium定时爬取丁香园的新冠病毒每天的数据,并制作出类似的地图(部署到云服务器) 声明:仅供技术交流,请勿用于非法用途,如有其它非法用途造成损失,和本博客无关 目录 python ...

  3. 新乡市各县市新冠病毒肺炎疫情专题地图

    新乡市各县市新冠病毒肺炎疫情专题地图 专题地图制作流程 数据获取 shp 地区属性数据 数据处理 拓扑修正 面要素生成 图面设计 分级统计图法 标题设置与图例设计 成图展示 专题地图制作流程 这份专题 ...

  4. CnOpenData全国小区新冠病毒确诊病例数数据

    一.数据简介 2019年末爆发的新冠疫情是百年来传播速度最快.感染范围最广.防控难度最大的一次重大突发公共卫生事件,而最早遭受这一重大危机冲击与考验的中国,以上下一心.众志成城的魄力和行动最早阻断了疫 ...

  5. 用matlab对2003年香港SARS数据建模预估新冠病毒在H市的疫情走势

    疫情隔离阶段果然是可以心无旁骛安心学习的时光.我在<用matlab对曲线拟合做最小二乘法单目标优化>https://blog.csdn.net/weixin_41855010/articl ...

  6. Leaflet绘制新冠病毒全球及中国各省市数据分布

    在线Demo地址:http://pandora128.cn/map/virus/index.html 目标设定 绘制全球新冠感染人员分布及热力图 绘制中国各省市新冠感染人员分布及热力图 解决思路 数据 ...

  7. 扎克伯格:Facebook不会把位置数据交给政府,哪怕是用于追踪新冠病毒!

    数据猿报道 最新招聘公告: ①阿里数据中台品牌团队杭州四大职位虚位以待 ②蚂蚁金服大数据部2020实习生招募全面启动 ③TalkingData北京招资深银行行业BD... ④数数科技上海招大数据运维支 ...

  8. python新冠病毒COVID-19数据分析和数据可视化

    在全球范围内,截至2021 年 11 月 15 日欧洲中部时间下午 4:30,各国已向世卫组织报告了253,163,330(2.5亿)例COVID-19确诊病例,包括5,098,174(5百万)例死亡 ...

  9. 新冠病毒分型和突变分析(SARS-CoV2_ARTIC_Nanopore)

    新冠病毒分型和突变分析(SARS-CoV2_ARTIC_Nanopore) 一. 本文使用Artic官方提供环境对Nanopore minion SARS-Cov-2测序数据,对新冠病毒突变及分型鉴定 ...

最新文章

  1. 为什么 Vista 使用过程中C盘用掉的空间迅速增大?
  2. 第五百七十二、三天 how can I 坚持
  3. 你用过这种奇葩的C#注释吗?如何看待
  4. 中间人攻击-http流量嗅探
  5. 如何在本地开发环境调试微信 JS-SDK
  6. chrome无法打开某些网页,但safari可以
  7. wordpress古腾堡淘宝客插件,支持京东淘宝
  8. 计算机桌面最下面的横条怎么去掉,win7系统桌面出现横条如何去除?桌面出现横条去除方法...
  9. ele 多个表格 tab切换后 多选, 复选出现的问题
  10. 浅析密码测评的重要性(附密码产品和功能测评技术实施方法)
  11. css样式表的作用和意义,什么是CSS?
  12. c++11总结19——std::mutex
  13. 小程序码 踩坑记录(buffer转成图片显示问题)
  14. matlab数值微分与数值积分
  15. 如何在谷歌学术下载论文
  16. Objective-c自学笔记(5)-自动释放池
  17. zookeeper 启动错误Error contacting service. It is probably not running
  18. JavaScript 面向对象(二) —— 案例篇
  19. MATLAB反三角函数arcsecx, arccscx, arctanx, arccotx, arcsinx, arccosx绘图表示
  20. 百度CEO李彦宏:我是互联网的信徒

热门文章

  1. nginx配置反向代理缓存
  2. 按需加载图片、html代码、js代码,前端页面性能优化
  3. java程序设计期末考试试题_JAVA语言程序设计期末考试试题及答案
  4. 【科创人】首鲜共享罗辉林:错的事一秒不值,人类组织终将走向共享
  5. 网络编程下的图书管理系统
  6. MySQL 慢查询及SQL执行时间监控
  7. Linux下启动和关闭Redis
  8. WGAN(Wasserstein GAN)看这一篇就够啦,WGAN论文解读
  9. OFDM OFDMA
  10. 手机内屏外屏有什么区别?