可以直接嵌入到任何網站的貼文中的動畫長條圖變得越來越流行。 它們清晰地顯示了特定時間內任何特徵變化的動態。 讓我們看看如何使用 R 和通用套件建立它們。
技能箱推薦: 實踐課程
《從零開始的Python開發》 .提醒: 對於“Habr”的所有讀者 - 使用“Habr”促銷代碼註冊任何 Skillbox 課程可享受 10 盧布的折扣。
套餐
我們需要 R 中的套件:
- ggplot2
-
動畫
這兩點是極為必要的。 此外,還需要 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 )
導致
如您所見,沒什麼複雜的。 整個專案可在
技能箱推薦:
- 兩年實踐課程
“我是專業網頁開發人員” .- 在線課程
《從頭開始的 C# 開發人員》 .- 實踐年課程
《PHP 開發者從 0 到 PRO》 .
來源: www.habr.com