使用 R 建立動畫直方圖

使用 R 建立動畫直方圖

可以直接嵌入到任何網站的貼文中的動畫長條圖變得越來越流行。 它們清晰地顯示了特定時間內任何特徵變化的動態。 讓我們看看如何使用 R 和通用套件建立它們。

技能箱推薦: 實踐課程 《從零開始的Python開發》.

提醒: 對於“Habr”的所有讀者 - 使用“Habr”促銷代碼註冊任何 Skillbox 課程可享受 10 盧布的折扣。

套餐

我們需要 R 中的套件:

這兩點是極為必要的。 此外,還需要 tidyverse、janitor 和 scales 來管理資料、清理陣列並相應地格式化。

數據

我們將在該專案中使用的原始資料集是從世界銀行網站下載的。 他們來了 - 世界銀行數據。 相同的數據,如果您需要現成的,可以從 專案資料夾.

這是什麼樣的資訊? 此樣本包含大多數國家數年(2000年至2017年)的GDP值。

資料處理

我們將使用下面發布的程式碼來準備所需的資料格式。 我們清除列名,將數字轉換為數字格式,並使用 Gather() 函數轉換資料。 我們將收到的所有內容保存在 gdp_tidy.csv 中以供進一步使用。

library(tidyverse)
library(janitor)

gdp <- read_csv("./data/GDP_Data.csv")

#select required columns

gdp <- gdp %>% select(3:15)

#filter only country rows

gdp <- gdp[1:217,]

gdp_tidy <- gdp %>%
mutate_at(vars(contains("YR")),as.numeric) %>%
gather(year,value,3:13) %>%
janitor::clean_names() %>%
mutate(year = as.numeric(stringr::str_sub(year,1,4)))

write_csv(gdp_tidy,"./data/gdp_tidy.csv")

動畫直方圖

他們的創作需要兩個階段:

  • 使用 ggplot2 繪製一組完整的實際直方圖。
  • 使用 gganimate 使用所需參數對靜態直方圖進行動畫處理。

最後一步是以所需的格式渲染動畫,包括 GIF 或 MP4。

載入庫

  • 圖書館(tidyverse)
  • 圖書館(gganimate)

數據管理

在此步驟中,您需要過濾資料以取得每年排名前 10 的國家。 讓我們新增幾列,以便我們顯示直方圖的圖例。

gdp_tidy <- read_csv("./data/gdp_tidy.csv")

gdp_formatted <- gdp_tidy %>%
group_by(year) %>%
# The * 1 makes it possible to have non-integer ranks while sliding
mutate(rank = rank(-value),
Value_rel = value/value[rank==1],
Value_lbl = paste0(" ",round(value/1e9))) %>%
group_by(country_name) %>%
filter(rank <=10) %>%
ungroup()

建構靜態直方圖

現在我們有了所需格式的資料包,我們開始繪製靜態直方圖。 基本資訊 - 選定時間間隔內 GDP 最高的前 10 個國家。 我們為每年創建圖表。

staticplot = ggplot(gdp_formatted, aes(rank, group = country_name,
fill = as.factor(country_name), color = as.factor(country_name))) +
geom_tile(aes(y = value/2,
height = value,
width = 0.9), alpha = 0.8, color = NA) +
geom_text(aes(y = 0, label = paste(country_name, " ")), vjust = 0.2, hjust = 1) +
geom_text(aes(y=value,label = Value_lbl, hjust=0)) +
coord_flip(clip = "off", expand = FALSE) +
scale_y_continuous(labels = scales::comma) +
scale_x_reverse() +
guides(color = FALSE, fill = FALSE) +
theme(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.grid.major.x = element_line( size=.1, color="grey" ),
panel.grid.minor.x = element_line( size=.1, color="grey" ),
plot.title=element_text(size=25, hjust=0.5, face="bold", colour="grey", vjust=-1),
plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="grey"),
plot.caption =element_text(size=8, hjust=0.5, face="italic", color="grey"),
plot.background=element_blank(),
plot.margin = margin(2,2, 2, 4, "cm"))

使用 ggplot2 建立繪圖非常簡單。 正如您在上面的程式碼部分中看到的,theme() 函數有幾個關鍵點。 它們是必要的,以便所有元素都可以毫無問題地進行動畫處理。 如有必要,其中一些可能不會顯示。 範例:僅繪製垂直網格線和圖例,但從該區域中刪除軸標題和其他幾個組件。

動畫

這裡的關鍵函數是transition_states(),它將單獨的靜態圖縫合在一起。 view_follow() 用於繪製網格線。

anim = staticplot + transition_states(year, transition_length = 4, state_length = 1) +
view_follow(fixed_x = TRUE) +
labs(title = 'GDP per Year : {closest_state}',
subtitle = "Top 10 Countries",
caption = "GDP in Billions USD | Data Source: World Bank Data")

渲染圖

創建動畫並將其儲存在 anim 物件中後,就可以使用 animate() 函數渲染它了。 animate() 中使用的渲染器可能會有所不同,具體取決於所需輸出檔案的類型。

的GIF

# For GIF

animate(anim, 200, fps = 20, width = 1200, height = 1000,
renderer = gifski_renderer("gganim.gif"))

MP4

# For MP4

animate(anim, 200, fps = 20, width = 1200, height = 1000,
renderer = ffmpeg_renderer()) -> for_mp4

anim_save("animation.mp4", animation = for_mp4 )

導致

使用 R 建立動畫直方圖

如您所見,沒什麼複雜的。 整個專案可在 我的 GitHub,您可以根據需要使用它。

技能箱推薦:

來源: www.habr.com

添加評論