用magick包和ggplot2包繪制動(dòng)態(tài)條形圖

動(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)條形圖

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容