[关闭]
@agpwhy 2022-06-14T10:37:51.000000Z 字数 2104 阅读 201

用R做gif,展示新冠相关数据-王胖的生信笔记第45期

又鸽了好久的笔记,疫情确实给大家的正常节奏有很大的影响。正好看到前段时间一个关于gganimate的推送就想着用一个新冠相关的数据试试看能不能做成动图。之前28,29期就是新冠的,不过那时候给的是一个静态的展示(一晃都是半年前的事情了)

3

2

准备环境

  1. library(dplyr)
  2. library(ggplot2)
  3. library(shadowtext)
  4. library(nCov2019)
  5. library(tibble)
  6. library(gapminder)
  7. library(gganimate)
  8. library(ggsci)

主要就是gganimate这个包,这个包其实功能很多,我只能说学习了个皮毛。ggsci这个是用来配色的。

  1. col <- c(ggsci::pal_jco(alpha = 0.8)(10),ggsci::pal_npg(alpha = 0.8)(10),
  2. ggsci::pal_d3(alpha = 0.8)(10),ggsci::pal_lancet(alpha = 0.8)(9),
  3. ggsci::pal_aaas(alpha = 0.8)(10),ggsci::pal_jama(alpha = 0.8)(7))

整理数据

主要就是tidyverse的运用,加上需要对tibble有一定的了解(虽然我还不是很精通啦)。

  1. res <- query()
  2. y <- res$historical
  3. d <- y["global"]
  4. dd <-
  5. d %>% as_tibble %>% filter(cases > 1000000) %>% group_by(country) %>%
  6. mutate(days_since_1m = as.numeric(date - min(date))) %>% ungroup
  7. dd$new = dd$cases - c(0, dd$cases[1:nrow(dd) - 1])
  8. dd2 <- dd %>%
  9. group_by(days_since_1m) %>% arrange(days_since_1m, desc(new)) %>%
  10. filter(days_since_1m > 0 & days_since_1m < 367) %>%
  11. mutate(number = row_number()) %>%filter(number <= 20)

这里再次强调,这里的数据里的country应该理解为国家和地区,并不单指国家(因为包括波多黎各这种)。

做图

这个其实等于ggplot2做一串,然后连在一起。具体的建议去看官方手册。只能说理解的时候还是看官方手册好(拿自己的数据就知道,如果按照推送里那个代码来,最多只出现50帧的gif,怎么修改还是看手册好)

  1. ani <- ggplot(dd2, aes(x = number, y = new, colour = country)) +
  2. geom_col(aes(number, new, fill = country)) +
  3. geom_text(aes(number, new, label = new), hjust = -0.1) +
  4. geom_text(aes(number, y = 0 , label = country), hjust = 1.1) +
  5. scale_colour_manual(values = col) + ##设置颜色
  6. scale_fill_manual(values = col) + ##设置颜色
  7. coord_flip(clip = "off", expand = FALSE) + scale_x_reverse() +
  8. ylab('Daily New Cases') + ggtitle('COVID-19 Rank Since 1M',subtitle = 'Day {current_frame}') +
  9. theme_minimal() +
  10. theme(
  11. panel.grid = element_blank(),
  12. axis.ticks.y = element_blank(),
  13. axis.title.y = element_blank(),
  14. axis.text.y = element_blank(),
  15. axis.text = element_text(size = 12, colour = 'black'),
  16. axis.title = element_text(size = 14, colour = 'black'),
  17. plot.title = element_text(size = 20, hjust = 0.5),
  18. plot.subtitle = element_text(size = 15, hjust = 0.5),
  19. legend.position = 'none',
  20. plot.margin = margin(1, 4, 1, 3, "cm")
  21. ) +
  22. transition_manual(frames = days_since_1m) +
  23. enter_fade() +
  24. exit_fade()
  25. animate(ani,fps=20,width=700,height=450,nframes = length(unique(dd2$days_since_1m)))
  26. anim_save("covid_19.gif")

最后这样保存出来就有点点炫了。

ZS5eyA.gif

这个图展示的是每个国家达到百万确诊后的日增,上面的Day几就是达到百万确诊后第几天。

Fin

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注