Vi skaber animerede histogrammer ved hjælp af R

Vi skaber animerede histogrammer ved hjælp af R

Animerede histogrammer, der kan integreres direkte i publikationer på enhver hjemmeside, bliver mere og mere populære. De viser dynamikken i ændringer af enhver karakteristik over tid og gør det visuelt. Lad os se på, hvordan vi kan oprette dem ved hjælp af R og universelle pakker.

Skillbox anbefaler: Praktisk kursus «Python-udvikler fra bunden».

Vi minder om: til alle læsere af 'Habr' — rabat på 10.000 rubler ved tilmelding til et hvilket som helst Skillbox-kursus med rabatkoden 'Habr'.

Pakker

Vi har brug for følgende pakker i R:

Disse to er absolut nødvendige. Derudover vil vi også bruge tidyverse, janitor og scales til datamanagement, oprydning af datasæt og formatering henholdsvis.

Data

Det originale datasæt, som vi skal bruge i dette projekt, hentes fra Verdensbankens hjemmeside. Her er de — WorldBank Data. De samme data, hvis du har brug for dem i et klart format, kan hentes fra projektmappen.

Hvilken information er dette? Prøven indeholder bruttonationalprodukt (BNP) værdien for de fleste lande over flere år (fra 2000 til 2017).

Behandling af data

Vi vil bruge koden nedenfor til at forberede det nødvendige dataformat. Vi renamer kolonnerne, omdanner tal til numerisk format og konverterer dataene ved hjælp af funktionen gather(). Alt, hvad der er opnået, gemmes i gdp_tidy.csv til videre brug.

bibliotek(tidyverse)
bibliotek(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")

Animerede histogrammer

Der kræves to trin for at oprette dem:

  • Byg en komplet samling af aktuelle histogrammer ved hjælp af ggplot2.
  • Animer statiske histogrammer med de ønskede parametre ved hjælp af gganimate.

Det sidste trin er at gengive animationen i det ønskede format, inklusive GIF eller MP4.

Indlæsning af biblioteker

  • bibliotek(tidyverse)
  • library(gganimate)

Datahåndtering

I dette trin skal vi filtrere dataene for at få top-10 lande hvert år. Vi tilføjer nogle kolonner, der gør det muligt at vise legenden for histogrammet.

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

Bygning af statiske histogrammer

Nu hvor vi har datasættet i det ønskede format, begynder vi at tegne de statiske histogrammer. Grundlæggende information — top-10 lande med det højeste BNP i den valgte tidsperiode. Diagrammerne oprettes for hvert å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"))

Det er meget enkelt at bygge grafer ved hjælp af ggplot2. Som du kan se i koden ovenfor, er der flere nøglepunkter med funktionen theme(). De er nødvendige for, at alle elementer animeres problemfrit. Nogle af dem kan eventuelt ikke vises efter behov. For eksempel tegnes kun de vertikale gitterlinjer og legender, mens aksetitlerne og et par andre komponenter fjernes fra udsnittet.

Animation

Den centrale funktion her er transition_states(), som samler individuelle statiske grafer. view_follow() bruges til at tegne gitterlinjerne.

anim = staticplot + transition_states(year, transition_length = 4, state_length = 1) +
view_follow(fixed_x = TRUE) +
labs(title = 'BNP pr. år : {closest_state}',
subtitle = "De 10 bedste lande",
caption = "BNP i milliarder USD | Datakilde: Verdensbankens Data")

Rendering

Når animationen er oprettet og gemt i objektet anim, er det tid til at visualisere den ved hjælp af funktionen animate(). Renderer, der bruges i animate(), kan være forskellig afhængig af den ønskede outputfiltype.

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

Vi skaber animerede histogrammer ved hjælp af R

Som vi kan se, er der ikke noget svært. Hele projektet er tilgængeligt på min GitHub, du kan bruge det, som du finder passende.

Skillbox anbefaler:

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster