
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 .
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:
- ggplot2
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 — . De samme data, hvis du har brug for dem i et klart format, kan hentes fra .
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

Som vi kan se, er der ikke noget svært. Hele projektet er tilgængeligt på , du kan bruge det, som du finder passende.
Skillbox anbefaler:
- Toårigt praktisk kursus .
- Online kursus .
- Praktisk års kursus .
Kilde: habr.com
