
Animované histogramy, které lze přímo integrovat do publikace na jakémkoli webu, se stávají stále populárnějšími. Ukazují dynamiku změn různých charakteristik během určitého časového období a dělají to přehledně. Podívejme se, jak je vytvořit pomocí R a univerzálních balíčků.
Skillbox doporučuje: Praktický kurz .
Připomínáme: pro všechny čtenáře "Habra" – sleva 10 000 korun při registraci na jakýkoli kurz Skillbox s promokódem "Habr".
Balíčky
Potřebujeme balíčky v R:
- ggplot2
Tyto dva jsou nezbytné. Kromě toho budeme potřebovat tidyverse, janitor a scales pro správu dat, čištění a formátování dat.
Údaje
Původní datový set, který budeme v tomto projektu používat, se stahuje z webových stránek Světové banky. Tady jsou — . Tato data, pokud je potřebujete ve zpracované podobě, si můžete stáhnout z .
Jaké informace to jsou? Vzorek obsahuje HDP většiny zemí za několik let (od roku 2000 do 2017).
Zpracování dat
Použijeme kód uvedený níže pro přípravu požadovaného formátu dat. Čistíme názvy sloupců, převádíme čísla na číselný formát a konvertujeme data pomocí funkce gather(). Vše, co získáme, ukládáme do gdp_tidy.csv pro další použití.
knihovna(tidyverse)
knihovna(janitor)
gdp <- read_csv("./data/GDP_Data.csv")
#select required columns
gdp % select(3:15)
#filter only country rows
gdp <- gdp[1:217,]
gdp_tidy %
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")
Animované histogramy
Jejich vytvoření vyžaduje dvě fáze:
- Vytvoření úplného setu aktuálních histogramů pomocí ggplot2.
- Animování statických histogramů s požadovanými parametry pomocí gganimate.
Posledním krokem je renderování animace v požadovaném formátu, včetně GIF nebo MP4.
Načítání knihoven
- knihovna(tidyverse)
- library(gganimate)
Správa dat
V tomto kroku je třeba filtrovat data, abyste získali top 10 zemí každého roku. Přidáme několik sloupců, které umožní zobrazit legendu pro histogram.
gdp_tidy <- read_csv("./data/gdp_tidy.csv")
gdp_formatted %
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 %
ungroup()
Vytvoření statických histogramů
Nyní, když máme datový balíček ve správném formátu, začneme kreslit statické histogramy. Základní informace — top 10 zemí s nejvyšším HDP za vybrané časové období. Grafy vytváříme pro každý rok.
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"))
Vytváření grafů pomocí ggplot2 je velmi jednoduché. Jak můžete vidět v úseku kódu výše, existuje několik klíčových bodů s funkcí theme (). Ty jsou nezbytné pro bezproblémovou animaci všech prvků. Některé z nich je možné při potřebě ani nezobrazovat. Příklad: vykreslují se pouze vertikální čáry mřížky a legendy, zatímco názvy os a několik dalších komponentů se z úseku odstraňuje.
Animace
Klíčová funkce zde — transition_states(), spojuje jednotlivé statické grafy. view_follow () se používá k vykreslení čar mřížky.
anim = staticplot + transition_states(year, transition_length = 4, state_length = 1) +
view_follow(fixed_x = TRUE) +
labs(title = 'HDP za rok: {closest_state}',
subtitle = "Top 10 zemí",
caption = "HDP v miliardách USD | Zdroj dat: Světová banka")
Renderování
Jakmile je animace vytvořena a uložena v objektu anim, nastává čas ji vizualizovat pomocí funkce animate (). Renderer používaný ve funkci animate () může být odlišný v závislosti na typu požadovaného výstupního souboru.
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 )
Výsledek

Jak vidíme, nic složitého. Celý projekt je k dispozici na , můžete jej používat podle vlastního uvážení.
Skillbox doporučuje:
- Dvouroční praktický kurz .
- Online kurz .
- Praktický roční kurz .
Zdroj: habr.com
