Gumawa ng Animated Histograms Gamit ang R

Gumawa ng Animated Histograms Gamit ang R

Ang mga animated na bar chart na maaaring direktang i-embed sa isang post sa anumang website ay lalong nagiging popular. Ipinapakita nila ang dinamika ng mga pagbabago sa anumang mga katangian sa isang tiyak na oras at ginagawa ito nang malinaw. Tingnan natin kung paano gawin ang mga ito gamit ang R at mga generic na pakete.

Inirerekomenda ng Skillbox ang: Praktikal na kurso "Python developer mula sa simula".

Pinapaalala namin sa iyo: para sa lahat ng mga mambabasa ng "Habr" - isang diskwento na 10 rubles kapag nag-enroll sa anumang kurso sa Skillbox gamit ang code na pang-promosyon ng "Habr".

Mga package

Kailangan namin ng mga pakete sa R:

Ang dalawang ito ay lubhang kailangan. Bilang karagdagan, kakailanganin ang tidyverse, janitor at mga kaliskis upang pamahalaan ang data, linisin ang array at i-format nang naaayon.

Data

Ang orihinal na dataset na gagamitin namin sa proyektong ito ay dina-download mula sa website ng World Bank. Nandito na sila - Data ng WorldBank. Ang parehong data, kung kailangan mo itong handa, ay maaaring ma-download mula sa mga folder ng proyekto.

Anong uri ng impormasyon ito? Ang sample ay naglalaman ng halaga ng GDP ng karamihan sa mga bansa sa loob ng ilang taon (mula 2000 hanggang 2017).

Pagproseso ng data

Gagamitin namin ang code na naka-post sa ibaba upang ihanda ang kinakailangang format ng data. Nililinis namin ang mga pangalan ng column, ginagawang format ng numero ang mga numero, at kino-convert ang data gamit ang gather() function. Ini-save namin ang lahat ng natanggap sa gdp_tidy.csv para sa karagdagang paggamit.

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

Mga animated na histogram

Ang kanilang paglikha ay nangangailangan ng dalawang yugto:

  • Pag-plot ng kumpletong hanay ng mga aktwal na histogram gamit ang ggplot2.
  • I-animate ang mga static na histogram na may mga gustong parameter gamit ang gganimate.

Ang huling hakbang ay i-render ang animation sa nais na format, kasama ang GIF o MP4.

Naglo-load ng mga aklatan

  • silid-aklatan(malinis)
  • library(gganimate)

Pamamahala ng data

Sa hakbang na ito, kailangan mong i-filter ang data para makuha ang nangungunang 10 bansa para sa bawat taon. Magdagdag tayo ng ilang column na magbibigay-daan sa atin na magpakita ng alamat para sa histogram.

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

Pagbuo ng mga static na histogram

Ngayon na mayroon na kaming data package sa kinakailangang format, sisimulan namin ang pagguhit ng mga static na histogram. Pangunahing impormasyon - nangungunang 10 bansa na may pinakamataas na GDP para sa napiling agwat ng oras. Gumagawa kami ng mga graph para sa bawat taon.

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

Ang paggawa ng mga plot gamit ang ggplot2 ay napakasimple. Tulad ng makikita mo sa seksyon ng code sa itaas, mayroong ilang mga pangunahing punto na may theme() function. Ang mga ito ay kinakailangan upang ang lahat ng mga elemento ay kumikilos nang walang mga problema. Ang ilan sa mga ito ay maaaring hindi maipakita kung kinakailangan. Halimbawa: Tanging ang mga patayong linya ng grid at mga alamat ang iginuhit, ngunit ang mga pamagat ng axis at ilang iba pang bahagi ay inalis sa lugar.

animasyon

Ang pangunahing function dito ay transition_states(), pinagsasama-sama nito ang magkahiwalay na mga static na graph. view_follow() ay ginagamit upang gumuhit ng mga linya ng grid.

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

Pag-render

Kapag ang animation ay nagawa at naimbak sa anim na bagay, oras na para i-render ito gamit ang animate() function. Ang renderer na ginamit sa animate() ay maaaring mag-iba depende sa uri ng output file na kinakailangan.

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 )

Resulta

Gumawa ng Animated Histograms Gamit ang R

Tulad ng nakikita mo, walang kumplikado. Ang buong proyekto ay magagamit sa aking GitHub, magagamit mo ito ayon sa nakikita mong akma.

Inirerekomenda ng Skillbox ang:

Pinagmulan: www.habr.com

Magdagdag ng komento