動(dòng)態(tài)統(tǒng)計(jì)圖相比靜態(tài)圖更能夠增加數(shù)據(jù)的展現(xiàn)力,有一種數(shù)據(jù)會(huì)說話的感覺。最近有人問動(dòng)態(tài)條形圖如何繪制?其實(shí)有很多途徑都可以實(shí)現(xiàn)動(dòng)態(tài)圖的效果,比如gganimate包和ggplot2聯(lián)合繪圖;如果利用Rmd生成報(bào)告的話,利用code chunk選項(xiàng)也可以實(shí)現(xiàn)動(dòng)態(tài)圖的效果。
今天我們利用ggplot2和magick包生成gif圖片的方式生成動(dòng)態(tài)圖。
比如,我們有一個(gè)具有兩個(gè)變量的數(shù)據(jù)框,其中一個(gè)變量是year,存儲(chǔ)年份值,另一個(gè)變量是num,存儲(chǔ)的是登記處數(shù)量。我們現(xiàn)在想繪制一個(gè)條形圖,X軸是年份,Y軸是登記處數(shù)量,以展現(xiàn)不同年份登記處數(shù)量變化情況。如果是靜態(tài)圖的話,不能體現(xiàn)登記處數(shù)量隨著年份變化而變化的過程。那么,我們就讓它動(dòng)起來,讓條圖隨著年份的變化逐漸出現(xiàn)。
大致繪圖思路:
我們可以根據(jù)條形圖中條的數(shù)量,繪制n個(gè)圖,其中第1個(gè)圖顯示第1個(gè)年份的條,第2個(gè)圖顯示前2個(gè)年份的條,依次類推,最后1個(gè)圖則顯示所有條形,然后把這些圖整合成為gif圖片格式,實(shí)現(xiàn)動(dòng)圖效果。
數(shù)據(jù)準(zhǔn)備方面,我們可以根據(jù)初始數(shù)據(jù)框生成n個(gè)數(shù)據(jù)框,其中,第1個(gè)數(shù)據(jù)框中num變量第1行為有效值,其余值為空;第2個(gè)數(shù)據(jù)框中num變量前2行為有效值,其余為空;依次類推。
R包準(zhǔn)備方面,我們利用dplyr包整理數(shù)據(jù),利用ggplot2繪圖,利用magick包生成gif圖片。
數(shù)據(jù)整理程序如下:
#加載dplyr包
library(dplyr)
##
## 載入程輯包:'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
#生成繪圖所需的數(shù)據(jù)框
data <- data.frame(year=c(seq(1,9,1)),num=c(1,15,30,48,50,70,90,101,125))
#生成一個(gè)空的列表,用于存放生成的多個(gè)圖
data1 <- list()
#利用for顯示循環(huán),生成n個(gè)圖,并存放到data1列表中
for (i in 1:9){
data1[[i]]<- data%>%
mutate(num=ifelse(year<=i,num,NA),year=factor(year,labels = c("1959","2008","2012","2015","2017","2018","2019","2020","2021")))
}
繪圖程序如下:
#加載ggplot2包
library(ggplot2)
#加載magick包
library(magick)
## Linking to ImageMagick 6.9.12.3
## Enabled features: cairo, freetype, fftw, ghostscript, heic, lcms, pango, raw, rsvg, webp
## Disabled features: fontconfig, x11
#利用magick打開一個(gè)圖形設(shè)備,依據(jù)圖形設(shè)備的參數(shù)生成圖形。
fig <- image_graph(width=600,height = 400)
#在for循環(huán)中生成n個(gè)圖形
for (i in 1:9){
p<-data1[[i]]%>%
ggplot(aes(x=year,y=num,fill=year))+
geom_bar(stat = "identity", show.legend = FALSE)+
scale_y_continuous(limits=c(0,130),breaks = seq(0, 130, by = 10),expand = c(0,0)) +
geom_text(aes(label=num),size=7)+
xlab("Year") + ylab("Number of Cancer Registries in Henan Province")+
theme_classic()+
theme(
axis.ticks = element_blank(),
axis.text = element_text(size=12),
axis.title = element_text(size=15),
)
print(p)
}
#關(guān)閉圖形設(shè)備
dev.off()
## png
## 2
最后,利用magick包生成gif圖片
#把圖片向量的最后一張圖放到最前面作為gif的封面圖
fig<- c(fig[9],fig)
#生成gif圖片,以每幀兩秒的速度播放gif圖片
image_animate(fig, fps = 2, dispose = "previous")

以上就是我們最終生成的動(dòng)態(tài)條形圖,在繪制圖的過程中,需要注意的是,一定要保證所有過程圖具有相同的橫坐標(biāo)和縱坐標(biāo)刻度和范圍,這樣才能讓圖看起來只有條在動(dòng)。