@agpwhy
2022-06-14T10:37:51.000000Z
字数 2104
阅读 281
又鸽了好久的笔记,疫情确实给大家的正常节奏有很大的影响。正好看到前段时间一个关于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$historicald <- y["global"]dd <-d %>% as_tibble %>% filter(cases > 1000000) %>% group_by(country) %>%mutate(days_since_1m = as.numeric(date - min(date))) %>% ungroupdd$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