@agpwhy
2022-06-14T10:37:51.000000Z
字数 2104
阅读 201
又鸽了好久的笔记,疫情确实给大家的正常节奏有很大的影响。正好看到前段时间一个关于gganimate的推送就想着用一个新冠相关的数据试试看能不能做成动图。之前28,29期就是新冠的,不过那时候给的是一个静态的展示(一晃都是半年前的事情了)
library(dplyr)
library(ggplot2)
library(shadowtext)
library(nCov2019)
library(tibble)
library(gapminder)
library(gganimate)
library(ggsci)
主要就是gganimate这个包,这个包其实功能很多,我只能说学习了个皮毛。ggsci这个是用来配色的。
col <- c(ggsci::pal_jco(alpha = 0.8)(10),ggsci::pal_npg(alpha = 0.8)(10),
ggsci::pal_d3(alpha = 0.8)(10),ggsci::pal_lancet(alpha = 0.8)(9),
ggsci::pal_aaas(alpha = 0.8)(10),ggsci::pal_jama(alpha = 0.8)(7))
主要就是tidyverse的运用,加上需要对tibble有一定的了解(虽然我还不是很精通啦)。
res <- query()
y <- res$historical
d <- y["global"]
dd <-
d %>% as_tibble %>% filter(cases > 1000000) %>% group_by(country) %>%
mutate(days_since_1m = as.numeric(date - min(date))) %>% ungroup
dd$new = dd$cases - c(0, dd$cases[1:nrow(dd) - 1])
dd2 <- dd %>%
group_by(days_since_1m) %>% arrange(days_since_1m, desc(new)) %>%
filter(days_since_1m > 0 & days_since_1m < 367) %>%
mutate(number = row_number()) %>%filter(number <= 20)
这里再次强调,这里的数据里的country应该理解为国家和地区,并不单指国家(因为包括波多黎各这种)。
这个其实等于ggplot2做一串,然后连在一起。具体的建议去看官方手册。只能说理解的时候还是看官方手册好(拿自己的数据就知道,如果按照推送里那个代码来,最多只出现50帧的gif,怎么修改还是看手册好)
ani <- ggplot(dd2, aes(x = number, y = new, colour = country)) +
geom_col(aes(number, new, fill = country)) +
geom_text(aes(number, new, label = new), hjust = -0.1) +
geom_text(aes(number, y = 0 , label = country), hjust = 1.1) +
scale_colour_manual(values = col) + ##设置颜色
scale_fill_manual(values = col) + ##设置颜色
coord_flip(clip = "off", expand = FALSE) + scale_x_reverse() +
ylab('Daily New Cases') + ggtitle('COVID-19 Rank Since 1M',subtitle = 'Day {current_frame}') +
theme_minimal() +
theme(
panel.grid = element_blank(),
axis.ticks.y = element_blank(),
axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.text = element_text(size = 12, colour = 'black'),
axis.title = element_text(size = 14, colour = 'black'),
plot.title = element_text(size = 20, hjust = 0.5),
plot.subtitle = element_text(size = 15, hjust = 0.5),
legend.position = 'none',
plot.margin = margin(1, 4, 1, 3, "cm")
) +
transition_manual(frames = days_since_1m) +
enter_fade() +
exit_fade()
animate(ani,fps=20,width=700,height=450,nframes = length(unique(dd2$days_since_1m)))
anim_save("covid_19.gif")
最后这样保存出来就有点点炫了。
这个图展示的是每个国家达到百万确诊后的日增,上面的Day几就是达到百万确诊后第几天。
Fin