Эҷоди гистограммаҳои аниматсия бо истифода аз R

Эҷоди гистограммаҳои аниматсия бо истифода аз R

Диаграммаҳои сатри аниматсионии, ки метавонанд мустақиман дар як паём дар ҳама гуна вебсайт ҷойгир карда шаванд, торафт маъмултар мешаванд. Онҳо динамикаи тағирёбии ҳама гуна хусусиятҳоро дар муддати муайян нишон медиҳанд ва ин корро равшан мекунанд. Биёед бубинем, ки чӣ тавр онҳоро бо истифода аз R ва бастаҳои умумӣ эҷод кардан мумкин аст.

Skillbox тавсия медиҳад: Курси амалӣ "Таҳиягари Python аз сифр".

Мо ба шумо хотиррасон мекунем: барои ҳамаи хонандагони "Habr" - тахфифи 10 000 рубл ҳангоми номнавис шудан ба курсҳои Skillbox бо истифода аз рамзи таблиғотии "Habr".

Бастаҳо

Ба мо бастаҳо дар R лозиманд:

Ин ду хеле заруранд. Илова бар ин, барои идора кардани маълумот, тоза кардани массив ва мувофиқан формат кардан аз навсозиҳо, фаррошҳо ва тарозуҳо талаб карда мешаванд.

маълумот

Маҷмӯи маълумоти аслии мо дар ин лоиҳа аз вебсайти Бонки Ҷаҳонӣ зеркашӣ карда мешавад. Ана онҳо - Маълумоти Бонки Ҷаҳонӣ. Ҳамин маълумотро, агар ба шумо тайёр лозим бошад, аз он зеркашӣ кардан мумкин аст ҷузвдонҳои лоиҳа.

Ин чӣ гуна маълумот аст? Намуна арзиши ММД-и аксари кишварҳоро дар тӯли якчанд сол (аз соли 2000 то 2017) дар бар мегирад.

Коркарди маълумот

Мо коди дар зер интишоршударо барои омода кардани формати маълумоти зарурӣ истифода мебарем. Мо номҳои сутунҳоро тоза мекунем, рақамҳоро ба формати рақам табдил медиҳем ва маълумотро бо истифода аз функсияи gather() табдил медиҳем. Мо ҳама чизеро, ки дар gdp_tidy.csv гирифта шудааст, барои истифодаи минбаъда захира мекунем.

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

Гистограммаҳои аниматсионӣ

Эҷоди онҳо ду марҳиларо талаб мекунад:

  • Тартиб додани маҷмӯи пурраи гистограммаҳои воқеӣ бо истифода аз ggplot2.
  • Бо истифода аз gganimate гистограммаҳои статикиро бо параметрҳои дилхоҳ аниматсия кунед.

Қадами ниҳоӣ ин пешниҳоди аниматсия дар формати дилхоҳ, аз ҷумла GIF ё MP4 мебошад.

Боркунии китобхонаҳо

  • китобхона (тартиб)
  • китобхона (gganimate)

Идоракунии маълумот

Дар ин қадам, шумо бояд маълумотро филтр кунед, то 10 кишвари беҳтаринро барои ҳар сол ба даст оред. Биёед якчанд сутунҳоро илова кунем, ки ба мо имкон медиҳанд легендаро барои гистограмма нишон диҳем.

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

Сохтани гистограммаҳои статикӣ

Акнун, ки мо бастаи маълумотро дар формати зарурӣ дорем, мо ба кашидани гистограммаҳои статикӣ шурӯъ мекунем. Маълумоти асосӣ - 10 кишвари беҳтарин бо ММД барои фосилаи вақти интихобшуда. Мо барои ҳар сол графикҳо месозем.

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

Эҷоди қитъаҳо бо истифода аз ggplot2 хеле содда аст. Тавре ки шумо дар фасли рамзи боло мебинед, якчанд нуктаҳои калидӣ бо функсияи theme() мавҷуданд. Онҳо барои он заруранд, ки ҳама унсурҳо бе мушкилот зинда шаванд. Баъзеи онҳо дар ҳолати зарурӣ намоиш дода намешаванд. Мисол: Танҳо хатҳои шабакаи амудӣ ва афсонаҳо кашида мешаванд, аммо унвонҳои меҳвар ва якчанд ҷузъҳои дигар аз минтақа хориҷ карда мешаванд.

Аниматсия

Функсияи калидӣ дар ин ҷо transition_states () аст, ки он графикҳои алоҳидаи статикиро бо ҳам мепайвандад. view_follow() барои кашидани хатҳои шабака истифода мешавад.

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

Пешниҳоди

Пас аз он ки аниматсия дар объекти анима сохта ва захира карда мешавад, вақти он расидааст, ки онро бо истифода аз функсияи animate() намоиш диҳед. Рендерере, ки дар animate() истифода мешавад, вобаста ба намуди файли баромади зарурӣ метавонад гуногун бошад.

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 )

Дар натиҷа

Эҷоди гистограммаҳои аниматсия бо истифода аз R

Тавре ки шумо мебинед, ҳеҷ чиз мураккаб нест. Тамоми лоиҳа дар дастрас аст GitHub ман, шумо метавонед онро тавре истифода баред, ки мувофиқат кунед.

Skillbox тавсия медиҳад:

Манбаъ: will.com

Илова Эзоҳ