Tworzymy animowane histogramy za pomocą R

Tworzymy animowane histogramy za pomocą R

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 „Python-developer od podstaw”.

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:

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 — Dane WorldBank. Te same dane, jeśli potrzebujesz ich w gotowej formie, można pobrać z folderu projektu.

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

Tworzymy animowane histogramy za pomocą R

Jak widać, nic trudnego. Cały projekt jest dostępny na moim GitHubie, możesz go używać według własnego uznania.

Skillbox poleca:

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster