R yordamida animatsion histogrammalar yarating

R yordamida animatsion histogrammalar yarating

Har qanday veb-saytdagi postga to'g'ridan-to'g'ri joylashtirilishi mumkin bo'lgan animatsion chiziqli diagrammalar tobora ommalashib bormoqda. Ular ma'lum bir vaqt ichida har qanday xususiyatlardagi o'zgarishlar dinamikasini namoyish etadilar va buni aniq bajaradilar. Keling, ularni R va umumiy paketlar yordamida qanday yaratishni ko'rib chiqaylik.

Skillbox tavsiya qiladi: Amaliy kurs "Python dasturchisi noldan".

Sizga eslatib o'tamiz: "Habr" ning barcha o'quvchilari uchun - "Habr" promo-kodidan foydalangan holda har qanday Skillbox kursiga yozilishda 10 000 rubl chegirma.

Paketlar

Bizga R dagi paketlar kerak:

Bu ikkisi juda zarur. Bundan tashqari, ma'lumotlarni boshqarish, massivni tozalash va shunga mos ravishda formatlash uchun tartibli, farrosh va tarozi talab qilinadi.

ma'lumotlar

Ushbu loyihada biz foydalanadigan asl ma'lumotlar to'plami Jahon banki veb-saytidan yuklab olingan. Mana ular - Jahon banki ma'lumotlari. Xuddi shu ma'lumotlarni, agar sizga tayyor bo'lsa, yuklab olish mumkin loyiha papkalari.

Bu qanday ma'lumot? Namunada koβ€˜pchilik mamlakatlarning bir necha yillardagi (2000 yildan 2017 yilgacha) YaIM qiymati keltirilgan.

Ma'lumotni qayta ishlash

Kerakli ma'lumotlar formatini tayyorlash uchun quyida joylashtirilgan koddan foydalanamiz. Biz ustun nomlarini tozalaymiz, raqamlarni raqam formatiga aylantiramiz va ma'lumotlarni yig'ish () funktsiyasidan foydalanib o'zgartiramiz. Biz gdp_tidy.csv da olingan hamma narsani keyingi foydalanish uchun saqlaymiz.

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

Animatsiyalangan histogrammalar

Ularni yaratish ikki bosqichni talab qiladi:

  • Ggplot2 yordamida haqiqiy histogrammalarning to'liq to'plamini chizish.
  • Gganimate yordamida kerakli parametrlar bilan statik gistogrammalarni jonlantiring.

Yakuniy qadam animatsiyani kerakli formatda, shu jumladan GIF yoki MP4 formatida ko'rsatishdir.

Kutubxonalar yuklanmoqda

  • kutubxona (tartib)
  • kutubxona (gganimate)

Ma'lumotlarni boshqarish

Ushbu bosqichda har yili eng yaxshi 10 ta davlatni olish uchun ma'lumotlarni filtrlashingiz kerak. Keling, gistogramma uchun afsonani ko'rsatishga imkon beradigan bir nechta ustunlarni qo'shamiz.

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

Statik histogrammalarni yaratish

Endi biz kerakli formatdagi ma'lumotlar paketiga egamiz, biz statik histogrammalarni chizishni boshlaymiz. Asosiy ma'lumotlar - tanlangan vaqt oralig'ida maksimal YaIMga ega 10 ta mamlakat. Biz har bir yil uchun grafiklarni yaratamiz.

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 yordamida uchastkalarni yaratish juda oddiy. Yuqoridagi kod bo'limida ko'rib turganingizdek, theme() funksiyasi bilan bir nechta asosiy fikrlar mavjud. Ular barcha elementlar muammosiz jonlanishi uchun kerak. Agar kerak bo'lsa, ulardan ba'zilari ko'rsatilmasligi mumkin. Misol: Faqat vertikal panjara chiziqlari va afsonalari chizilgan, lekin o'q sarlavhalari va bir nechta boshqa komponentlar maydondan olib tashlanadi.

Animatsiya

Bu erda asosiy funktsiya transition_states() bo'lib, u alohida statik grafiklarni birlashtiradi. view_follow() panjara chiziqlarini chizish uchun ishlatiladi.

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

Renderlash

Animatsiya yaratilgan va animatsiya ob'ektida saqlanganidan so'ng, uni animate() funktsiyasidan foydalanib ko'rsatish vaqti keldi. animate() da ishlatiladigan renderer talab qilinadigan chiqish fayli turiga qarab har xil bo'lishi mumkin.

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 )

natija

R yordamida animatsion histogrammalar yarating

Ko'rib turganingizdek, hech qanday murakkab narsa yo'q. Butun loyiha ichida mavjud mening GitHub, siz undan o'zingiz xohlagancha foydalanishingiz mumkin.

Skillbox tavsiya qiladi:

Manba: www.habr.com

a Izoh qo'shish