一、引言

自从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. display:inline-block 的使用
  2. dedecms织梦list标签按照权重排序
  3. python爬虫能干什么-总算发现python爬虫能够干什么
  4. Vue.js 条件渲染
  5. Python数据结构学习笔记——队列和双端队列
  6. javascript for in,for each,for循环遍历区别
  7. java xml数据解析_java xml解析,数据读取
  8. 如何测试并调试基于 NDK 的 Android 应用
  9. 2D Game Creation - 2D游戏开发基本流程
  10. 工业条形码扫描枪:如何为您的应用选择合适的扫描枪
  11. Java使用ffmpeg将视频转为Mp4格式
  12. java判断时间是否在某个时间段内
  13. SEO过程中外链的误区
  14. uboot 下mmc read/write命令使用和验证方法
  15. 志强CPU E5 E7参数,CPU内核参数对比图
  16. 华为鸿蒙系统会在哪些手机上更新,那些华为手机可以升级鸿蒙系统!
  17. MII、RMII、SMII、GMII接口简介
  18. 继承类的多态和实现接口的多态的区别
  19. CDR2023软件最新版有哪些新增功能?
  20. java字符转成ncr_NCR字符编码(形如中国)转换为汉字 in JAVA

热门文章

  1. Vultr CentOS6.8换内核装锐速
  2. 教授专栏30 | 甘剑平: 北赤道流控制黑潮与棉兰老流的“三足鼎立”物理过程
  3. javascript插入before(),after()新DOM方法
  4. 计算机毕业设计Java动物园动物饲养管理(源码+系统+mysql数据库+lW文档)
  5. 二次指数平滑法matlab程序_二次指数平滑法程序
  6. 南邮计算机 双一流,南邮曾憾失211,如今成为双一流,而第四轮学科评估却让人失望?...
  7. 接口测试之代码实例21讲--接口测试基础入门
  8. Lucene博客分享
  9. CTF经典(前五道)
  10. Android 直播、短视频平台第三方宝宝特效SDK接入方式