Lag animerte histogrammer ved hjelp av R

Lag animerte histogrammer ved hjelp av R

Animerte stolpediagrammer som kan bygges inn direkte i et innlegg på et hvilket som helst nettsted, blir stadig mer populært. De viser dynamikken til endringer i alle egenskaper over en viss tid og gjør dette tydelig. La oss se hvordan du lager dem ved å bruke R og generiske pakker.

Skillbox anbefaler: Praktisk kurs "Python-utvikler fra bunnen av".

Vi minner om: for alle lesere av "Habr" - en rabatt på 10 000 rubler når du melder deg på et hvilket som helst Skillbox-kurs ved å bruke kampanjekoden "Habr".

Pakker

Vi trenger pakker i R:

Disse to er ekstremt nødvendige. I tillegg vil tidyverse, vaktmester og vekter være nødvendig for å administrere dataene, rydde opp i matrisen og formatere deretter.

Data

Det originale datasettet vi skal bruke i dette prosjektet er lastet ned fra Verdensbankens nettsted. Her er de - Verdensbankdata. De samme dataene, hvis du trenger dem ferdige, kan lastes ned fra prosjektmapper.

Hva slags informasjon er dette? Utvalget inneholder BNP-verdien for de fleste land i flere år (fra 2000 til 2017).

Databehandling

Vi vil bruke koden som er lagt ut nedenfor for å forberede det nødvendige dataformatet. Vi sletter kolonnenavnene, gjør tallene til et tallformat og konverterer dataene ved hjelp av gather()-funksjonen. Vi lagrer alt som mottas i gdp_tidy.csv for videre bruk.

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

Animerte histogrammer

Opprettelsen deres krever to stadier:

  • Plotte et komplett sett med faktiske histogrammer ved hjelp av ggplot2.
  • Animer statiske histogrammer med ønskede parametere ved hjelp av gganimate.

Det siste trinnet er å gjengi animasjonen i ønsket format, inkludert GIF eller MP4.

Laster inn biblioteker

  • bibliotek (tidyverse)
  • bibliotek(gganimate)

Dataledelse

I dette trinnet må du filtrere dataene for å få de 10 beste landene for hvert år. La oss legge til flere kolonner som lar oss vise en forklaring for 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()

Bygge statiske histogrammer

Nå som vi har en datapakke i det nødvendige formatet, begynner vi å tegne statiske histogrammer. Grunnleggende informasjon - topp 10 land med maksimalt BNP for det valgte tidsintervallet. Vi lager grafer 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"))

Å lage plott ved hjelp av ggplot2 er veldig enkelt. Som du kan se i kodedelen ovenfor, er det flere nøkkelpunkter med theme()-funksjonen. De er nødvendige slik at alle elementer animerer uten problemer. Noen av dem vises kanskje ikke om nødvendig. Eksempel: Bare de vertikale rutenettlinjene og tegnene tegnes, men aksetitlene og flere andre komponenter fjernes fra området.

animasjon

Nøkkelfunksjonen her er transition_states(), den syr sammen separate statiske grafer. view_follow() brukes til å tegne rutenett.

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

Gjengivelse

Når animasjonen er opprettet og lagret i anim-objektet, er det på tide å gjengi den ved hjelp av animate()-funksjonen. Gjengiveren som brukes i animate() kan være forskjellig avhengig av typen utdatafil som kreves.

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

Lag animerte histogrammer ved hjelp av R

Som du kan se, ingenting komplisert. Hele prosjektet er tilgjengelig i min GitHub, du kan bruke den som du vil.

Skillbox anbefaler:

Kilde: www.habr.com

Legg til en kommentar