Skapa animerade histogram med R

Skapa animerade histogram med R

Animerade stapeldiagram som kan bäddas in direkt i ett inlägg på vilken webbplats som helst blir allt mer populära. De visar dynamiken i förändringar i alla egenskaper under en viss tid och gör detta tydligt. Låt oss se hur man skapar dem med R och generiska paket.

Skillbox rekommenderar: Praktisk kurs "Python-utvecklare från grunden".

Påminnelse: för alla läsare av "Habr" - en rabatt på 10 000 rubel när du anmäler dig till någon Skillbox-kurs med hjälp av "Habr"-kampanjkoden.

paket

Vi behöver paket i R:

Dessa två är oerhört nödvändiga. Dessutom kommer tidyverse, vaktmästare och vågar att krävas för att hantera data, rensa upp arrayen och formatera därefter.

Data

Den ursprungliga datamängden vi kommer att använda i detta projekt laddas ner från Världsbankens webbplats. Här är de - Världsbankens data. Samma data, om du behöver den färdig, kan laddas ner från projektmappar.

Vad är detta för information? Urvalet innehåller BNP-värdet för de flesta länder under flera år (från 2000 till 2017).

Databehandling

Vi kommer att använda koden nedan för att förbereda det nödvändiga dataformatet. Vi rensar kolumnnamnen, omvandlar siffrorna till ett talformat och konverterar data med funktionen gather(). Vi sparar allt som tas emot i gdp_tidy.csv för vidare användning.

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")

Animerade histogram

Deras skapelse kräver två steg:

  • Plotta en komplett uppsättning faktiska histogram med ggplot2.
  • Animera statiska histogram med önskade parametrar med hjälp av gganimate.

Det sista steget är att rendera animationen i önskat format, inklusive GIF eller MP4.

Laddar bibliotek

  • bibliotek (tidyverse)
  • bibliotek(gganimate)

Datahantering

I det här steget måste du filtrera data för att få de 10 bästa länderna för varje år. Låt oss lägga till flera kolumner som gör att vi kan visa en förklaring för histogrammet.

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()

Bygga statiska histogram

Nu när vi har ett datapaket i det format som krävs börjar vi rita statiska histogram. Grundläggande information - topp 10 länder med maximal BNP för det valda tidsintervallet. Vi skapar grafer för varje år.

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"))

Att skapa plotter med ggplot2 är väldigt enkelt. Som du kan se i kodavsnittet ovan finns det flera nyckelpunkter med funktionen theme(). De är nödvändiga så att alla element animerar utan problem. Vissa av dem kanske inte visas om det behövs. Exempel: Endast de vertikala rutnätslinjerna och förklaringarna ritas, men axeltitlarna och flera andra komponenter tas bort från området.

animering

Nyckelfunktionen här är transition_states(), den syr ihop separata statiska grafer. view_follow() används för att rita rutnätslinjer.

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")

Tolkning

När animationen väl har skapats och lagrats i animobjektet är det dags att rendera den med funktionen animate(). Renderaren som används i animate() kan vara olika beroende på vilken typ av utdatafil som krävs.

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 )

Resultat

Skapa animerade histogram med R

Som du kan se, inget komplicerat. Hela projektet finns tillgängligt i min GitHub, du kan använda den som du vill.

Skillbox rekommenderar:

Källa: will.com

Lägg en kommentar