一、引言

自从COVID-19疫情在2020年爆发以来,数据可视化成为了了解疫情趋势和规模的重要手段。饱受争议的疫情数据可视化中的南丁格尔玫瑰图(Rose Chart),由于具有简洁、直观、易于理解等特点,逐渐成为了一个备受欢迎的数据可视化方式。


本文的目的是探讨如何使用南丁格尔玫瑰图来呈现COVID-19疫情数据,并介绍其基本原理和应用方法。通过本文,您将能了解如何绘制一个真实还原的COVID-19疫情玫瑰图,以及如何评估和选择适合的玫瑰图参数。此外,本文还将分析疫情玫瑰图的局限性和可能的出路,以及未来的发展方向。

二、什么是南丁格尔玫瑰图

2.1 定义和基本原理

南丁格尔玫瑰图是一种可以将数据按照分类分组并展现为平面角度的可视化方式,由英国护士和统计学家南丁格尔在19世纪60年代发明。在玫瑰图中,圆圈代表了整体,而每个扇形代表了一个分类变量。扇形的半径根据数据值而变化,通常采用不同的颜色或者角度来区分不同的类别。南丁格尔玫瑰图的本质是将多个条形图通过旋转而组合在一起组成一个圆形图。玫瑰图最常用的形式是展示一个周期内不同类别中数值的比例。

2.2 用途和优点

南丁格尔玫瑰图主要用于对多个分类数据进行可视化展示,并比较它们之间的比例关系。在近年来的数据可视化中,南丁格尔玫瑰图被广泛应用于展现疫情和其他方面的数据,比如营销数据分析、疾病分析、投票结果分布等。

相较于其他图表,南丁格尔玫瑰图具有以下几个优点:

  • 直观性:玫瑰图的展示形式直观易懂,适合用于展示相对比例关系。
  • 可比性:各扇形与总圆通常是同等的,人们可以自由地比较不同的类别。
  • 可读性:数据值用大小来表示,颜色用来加强类别记忆。
  • 易于制作:制作起来相对简单,常见的数据可视化软件均支持制作南丁格尔玫瑰图。

在下一部分,本文将介绍如何使用南丁格尔玫瑰图来展示COVID-19疫情数据。

三、数据集

3.1 获取确诊和死亡数据

# install.packages("readr")library(readr)# install.packages("tidyr")library(tidyr)confirmed_cases_url <- "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"confirmed_cases_df <- read.csv(confirmed_cases_url) # 读取全球每日确诊数据

deaths_url <- "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv"deaths_df <- read.csv(deaths_url) # 读取全球每日死亡数据

3.2 数据清洗和预处理

  1. 长格式转换
confirmed_cases_df <- confirmed_cases_df %>%   select(-c("Province.State", "Lat", "Long")) %>%  gather(key = "date", value = "confirmed_cases", -c("Country.Region"))head(confirmed_cases_df)

deaths_df <- deaths_df %>%   select(-c("Province.State", "Lat", "Long")) %>%  gather(key = "date", value = "deaths", -c("Country.Region"))head(deaths_df)

数据展示:

 Country.Region     date confirmed_cases1    Afghanistan X1.22.20               02        Albania X1.22.20               03        Algeria X1.22.20               04        Andorra X1.22.20               05         Angola X1.22.20               06     Antarctica X1.22.20               0

  Country.Region     date deaths1    Afghanistan X1.22.20      02        Albania X1.22.20      03        Algeria X1.22.20      04        Andorra X1.22.20      05         Angola X1.22.20      06     Antarctica X1.22.20      0

  1. 数据的聚合
# 去除重复项目,方便整合confirmed_cases_df <- confirmed_cases_df[!duplicated(confirmed_cases_df[c("Country.Region", "date")]),]deaths_df <- deaths_df[!duplicated(deaths_df[c("Country.Region", "date")]),]

# 汇总数据集combined_data <- confirmed_cases_df %>%   left_join(deaths_df, by = c("Country.Region", "date")) 

head(combined_data)

结果展示:

  Country.Region     date confirmed_cases deaths1    Afghanistan X1.22.20               0      02        Albania X1.22.20               0      03        Algeria X1.22.20               0      04        Andorra X1.22.20               0      05         Angola X1.22.20               0      06     Antarctica X1.22.20               0      0
  1. 计算世界各国2020-07-28日的确诊人数和死亡人数
data <- combined_data %>%  filter(date == "X7.28.20") %>%  group_by(Country.Region)  %>%  summarise(confirmed_cases = sum(confirmed_cases, na.rm = TRUE),            deaths = sum(deaths, na.rm = TRUE))

data

结果展示:

# A tibble: 201 × 3   Country.Region      confirmed_cases deaths   <chr>                         <int>  <int> 1 Afghanistan                   36454   1274 2 Albania                        4997    148 3 Algeria                       28615   1174 4 Andorra                         907     52 5 Angola                         1000     47 6 Antarctica                        0      0 7 Antigua and Barbuda              86      3 8 Argentina                    173355   3179 9 Armenia                       37629    71910 Australia                       113      3# ℹ 191 more rows# ℹ Use `print(n = ...)` to see more rows

  1. 过滤出确诊前26名国家
# 按确诊人数排序data <- arrange(data, desc(confirmed_cases))data_sever <- slice(data, 1:26)data_mild <- slice(data, 27:nrow(data))

  1. 生成label参数
# 追加iddata_sever <- data_sever %>%  mutate(id = 1:nrow(data_sever))

dat <- data_sever %>%  mutate(    label = case_when(      id <= 5  ~ paste0(Country.Region, "国\n", confirmed_cases, "例"),      id <= 13 ~ paste0(confirmed_cases, "例\n", Country.Region, "国"),      T ~ paste0(confirmed_cases, "例 ", Country.Region, "国")    )  )

# 逆向排序dat <- arrange(dat,confirmed_cases)dat <- select(dat, -id)dat <- dat %>%  mutate(id = 1:nrow(dat))

# 直接画图,比例差距大的离谱,适当的缩放比例

四、开始画图

  1. 画出底图
# 由于比例差距太大了,做了一次开方,适当缩小比例差距dat$sqrt <- sqrt(dat$confirmed_cases)p1 <- ggplot(data = dat, aes(x = id, y=confirmed_cases,            label = label)) +    geom_col(aes(fill = id), width = 1, size = 0) +    geom_col(    aes(y = 40),    fill = "white",    width = 1,    alpha = 0.2,    size = 0) +    geom_col(aes(y = 20),        fill = "white",        width = 1,alpha = 0.2,        size = 0)p1


  1. 极坐标化
p2 <-p1 + coord_polar() +   theme_void() + scale_y_continuous(limits = c(-200, 2100))p2
  1. 修改色谱
p3 <-  p2 +  scale_fill_gradientn(    colors = c("#54778f", "#4EB043", "#E69D2A", "#DD4714", "#A61650"),    guide = F  )p3
  1. 加上label
p4 <-p3 +geom_text(    data = . %>% filter(id <= 13),    nudge_y = 340,    angle = 95 - 180 * c(1:13) / 13,    fontface = "bold",    size = 1.8)+geom_text(    data = . %>% filter(between(id, 14, 21)),    nudge_y = -85,    nudge_x = -0.1,    color = "white",    fontface = "bold",    size = 1.8)+geom_text(    data = . %>% filter(id >= 22),    nudge_y = -85,    color = "white",    angle = 80 - 75 * c(1:5)/5,    fontface = "bold",    size = 1.8)p4

五、结论

这次图形虽然再现成功了,但是还是有很大的差距的。死亡人数这个我计算出来了,但是排上去的话还是很不好看,所以拿下来了。这次碰到的主要问题是R语言画出的图形,圆环部分特别小,如果适当的扩大图形,说不定会有更好的效果。目前技术有限,还不清楚怎么调整下部圈圈的大小,以及在相框等比扩大图形的问题需要解决,如果有知道的大佬,希望告知!

惊人!截至6月10日全球COVID-19疫情玫瑰图,这些国家最危险相关推荐

  1. Win10早期版本下月终止服务、百万医疗设备存在漏洞风险|11月10日全球网络安全热点

    安全资讯报告 REvil勒索软件的关联公司在全球范围内被抓捕 罗马尼亚执法当局宣布逮捕两名作为REvil勒索软件家族成员的人,这对历史上最多产的网络犯罪团伙之一造成了沉重打击. 据欧洲刑警组织称,据信 ...

  2. 谷歌以54亿美元收购网络安全公司、数百万惠普设备存在高危漏洞|3月10日全球网络安全热点

    安全资讯报告 美国国家安全局(NSA)为保护IT基础设施提出最新建议 这份来自NSA网络安全局的文件鼓励采用"零信任"网络.该报告涵盖网络设计.设备密码和密码管理.远程日志记录和管 ...

  3. 银行木马卷土重来、开发者破坏开源库影响数千应用程序|1月10日全球网络安全热点

    安全资讯报告 银行木马Flubot Android恶意软件卷土重来 FluBot是一种适用于Android的银行恶意软件,它通过向全球多家银行提供覆盖登录表单来窃取密码.新的攻击假冒Adobe应用程序 ...

  4. YouSwap将于5月10日15:00新增CATE流动性挖矿

    据最新消息,YouSwap将于5月10日15:00(UTC+8)于BSC链联盟区新增开启CATE/USDT和CATE/YOU流动性挖矿,用户可以通过质押以上币对的LP Token挖矿YOU. 截至5月 ...

  5. 战报来了,第四届“强网”拟态防御国际精英挑战赛,11月10日赛况报道

    第四届"强网"拟态防御国际精英挑战赛于2021年11月9日正式开幕.本届大赛由中国工程院.江苏省人民政府.国家互联网信息办公室网络安全协调局.科学技术部高新技术司作为指导单位,南京 ...

  6. 意法半导体(ST)7月10日宣布收购TouchGFX

    意法半导体(ST)7月10日宣布收购TouchGFX 2018-07-14 09:54操作系统/设计/智能手机 7月10日,全球半导体领导者意法半导体(ST)宣布收购TouchGFX软件的开发商和供应 ...

  7. 【历史上的今天】7 月 10 日:iOS App Store 问世;台积电创始人出生;第一台被“越狱”的 iPhone

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2023 年 7 月 10 日,在 1856 年的今天,交流电的发明者尼古拉·特斯拉(Nikola Tesla)出 ...

  8. 【历史上的今天】4 月 10 日:Github 诞生;人类第一张黑洞照片;计算机延误航天飞机

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 4 月 10 日,在 2007 年的今天,九城出资 2700 万美元闪电收购雅蜂网,当时雅蜂网上线时 ...

  9. 【历史上的今天】2 月 10 日:QQ 诞生;IBM 电脑击败人类象棋冠军;谷歌光纤发布

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2023 年 2 月 10 日,在 1883 年的今天,美国第一位女性电气工程师伊迪丝·克拉克(Edith Cla ...

最新文章

  1. JAVA并发编程学习笔记------FutureTask
  2. BI国产化替代进入实质阶段,新产品新方案提高加速度
  3. (一)Windows环境下汇编编程读书笔记
  4. python的递归算法学习(1)
  5. 使用redis解决并发操作问题
  6. java get请求参数乱码_java web项目get,post请求参数中文乱码解决
  7. day19 .NET项目DLL反编译未授权访问配置调试报错
  8. 生活记录:给枯燥的心灵浇浇水
  9. 知乎热议:35岁,你要逃离北上广?
  10. 【组合】BZOJ3505(Cqoi2014)[数三角形]题解
  11. JDK源码解析之HashSet
  12. XPDL与WS-BPEL的比较之五:形势与未来
  13. 通用技术机械图尺寸标注高考必看知识点
  14. 卧槽,javaCV不到十行代码实现图片OCR文字识别
  15. php取word表格一行内容,如何提取出word表格中的内容 值得一看
  16. 【实验室预约平台系统——开题报告 分享(仅供参考呀)】
  17. 服务器向虚拟机迁移,windows物理机服务器迁移到虚拟机
  18. php如何实现上传照片功能_php如何实现图片上传功能
  19. [Unity] ACT 战斗系统学习 9:Bolt 和 FlowCanvas
  20. linux 图形化创建文件,Arronax - 在Ubuntu中创建桌面启动器的图形工具

热门文章

  1. SAP UI5 应用开发教程的学习目录 - 循序渐进,由浅入深,适合不同水平的 SAP UI5 开发人员
  2. textarea标签的使用及案例
  3. TCP通信中服务器处理客户端意外断开
  4. golang 调用php,php-go: PHP绑定golang库,让您快速在go语言里调用php,欢迎star,fork~
  5. “双十一”大战,四大化妆品上市公司哪家强?
  6. hic染色体构想_30个使您的网站看起来更好的快速构想
  7. php程序yii是什么意思,Yii框架是什么
  8. 逗号分隔值文件的读取
  9. 【Educoder作业】操作系统之文件管理(二) ※
  10. 工业上数控机床所属的计算机应用领域,5)工业上的数控机床所属的计算机应用领域是:...