
Animowane histogramy, które można osadzić bezpośrednio w publikacji na dowolnej stronie internetowej, stają się coraz bardziej popularne. Przedstawiają dynamikę zmian różnych cech w określonym czasie w wizualny sposób. Zobaczmy, jak je stworzyć za pomocą R i uniwersalnych pakietów.
Skillbox poleca: Praktyczny kurs .
Przypominamy: dla wszystkich czytelników „Habra” — zniżka 10 000 rubli przy zapisie na dowolny kurs Skillbox z kodem promocyjnym „Habra”.
Pakiety
Potrzebujemy pakietów w R:
- ggplot2
Te dwa pakiety są niezbędne. Dodatkowo potrzebne będą tidyverse, janitor i scales do zarządzania danymi, czyszczenia zbiorów i formatowania odpowiednio.
Dane
Oryginalny zestaw danych, który będziemy używać w tym projekcie, jest pobierany z witryny Banku Światowego. Oto on — . Te same dane, jeśli potrzebujesz ich w gotowej formie, można pobrać z .
Jakie to informacje? Próbka zawiera wartość PKB większości krajów za kilka lat (od 2000 do 2017 roku).
Obróbka danych
Będziemy używać kodu umieszczonego poniżej do przygotowania wymaganego formatu danych. Oczyszczamy nazwy kolumn, przekształcamy liczby w format numeryczny i konwertujemy dane za pomocą funkcji gather(). Wszystko, co zostanie uzyskane, zapisujemy w gdp_tidy.csv do dalszego wykorzystania.
biblioteka(tidyverse)
biblioteka(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")
Animowane histogramy
Ich stworzenie wymaga dwóch etapów:
- Budowanie pełnego zestawu aktualnych histogramów za pomocą ggplot2.
- Animowanie statycznych histogramów z pożądanymi parametrami za pomocą gganimate.
Ostatni krok — renderowanie animacji w pożądanym formacie, w tym GIF lub MP4.
Ładowanie bibliotek
- biblioteka(tidyverse)
- library(gganimate)
Zarządzanie danymi
Na tym etapie należy przefiltrować dane, aby uzyskać 10 najlepszych krajów każdego roku. Dodamy kilka kolumn, które umożliwią wyświetlenie legendy dla histogramu.
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()
Budowanie statycznych histogramów
Teraz, gdy mamy zestaw danych w odpowiednim formacie, zaczynamy rysowanie statycznych histogramów. Podstawowe informacje — 10 najlepszych krajów z najwyższym PKB w wybranym okresie czasu. Wykresy tworzymy dla każdego roku.
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"))
Tworzenie wykresów za pomocą ggplot2 jest dość proste. Jak widać w powyższym kodzie, istnieje kilka kluczowych punktów z funkcją theme(). Są one konieczne, aby wszystkie elementy animowały się bez problemu. Niektóre z nich można pominąć, jeśli zajdzie taka potrzeba. Na przykład rysowane są tylko pionowe linie siatki i legendy, natomiast tytuły osi i kilka innych komponentów są usuwane z wykresu.
Animacja
Kluczową funkcją tutaj jest transition_states(), która łączy poszczególne statyczne wykresy. view_follow() służy do rysowania linii siatki.
anim = staticplot + transition_states(year, transition_length = 4, state_length = 1) +
view_follow(fixed_x = TRUE) +
labs(title = 'PKB na rok: {closest_state}',
subtitle = "Top 10 Krajów",
caption = "PKB w miliardach USD | Źródło danych: Dane Banku Światowego")
Renderowanie
Po tym, jak animacja została stworzona i zapisana w obiekcie anim, nadszedł czas, aby ją zobrazować za pomocą funkcji animate(). Renderer używany w animate() może być różny w zależności od typu wymaganego wyjściowego pliku.
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)
Wynik

Jak widać, nic trudnego. Cały projekt jest dostępny na , możesz go używać według własnego uznania.
Skillbox poleca:
- Dwuletni praktyczny kurs .
- Kurs online .
- Praktyczny roczny kurs .
Źródło: habr.com
