Cipta Histogram Beranimasi Menggunakan R

Cipta Histogram Beranimasi Menggunakan R

Carta bar animasi yang boleh dibenamkan terus ke dalam siaran di mana-mana tapak web menjadi semakin popular. Mereka memaparkan dinamik perubahan dalam mana-mana ciri sepanjang masa tertentu dan melakukan ini dengan jelas. Mari lihat cara menciptanya menggunakan R dan pakej generik.

Skillbox mengesyorkan: Kursus praktikal "Pembangun Python dari awal".

Kami mengingatkan: untuk semua pembaca "Habr" - diskaun sebanyak 10 rubel apabila mendaftar dalam mana-mana kursus Skillbox menggunakan kod promosi "Habr".

Pakej

Kami memerlukan pakej dalam R:

Kedua-dua ini sangat diperlukan. Selain itu, tidyverse, janitor dan penimbang akan diperlukan untuk mengurus data, membersihkan tatasusunan dan memformat dengan sewajarnya.

Data

Dataset asal yang akan kami gunakan dalam projek ini dimuat turun dari laman web Bank Dunia. Di sini mereka - Data Bank Dunia. Data yang sama, jika anda memerlukannya sedia, boleh dimuat turun dari folder projek.

Apakah jenis maklumat ini? Sampel mengandungi nilai KDNK kebanyakan negara selama beberapa tahun (dari 2000 hingga 2017).

Pemprosesan data

Kami akan menggunakan kod yang dipaparkan di bawah untuk menyediakan format data yang diperlukan. Kami mengosongkan nama lajur, menukar nombor menjadi format nombor dan menukar data menggunakan fungsi gather(). Kami menyimpan semua yang diterima dalam gdp_tidy.csv untuk kegunaan selanjutnya.

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

Histogram animasi

Penciptaan mereka memerlukan dua peringkat:

  • Memplot set lengkap histogram sebenar menggunakan ggplot2.
  • Animasikan histogram statik dengan parameter yang dikehendaki menggunakan gganimate.

Langkah terakhir ialah membuat animasi dalam format yang dikehendaki, termasuk GIF atau MP4.

Memuatkan perpustakaan

  • perpustakaan(kemas)
  • perpustakaan (ganimate)

Pengurusan Data

Dalam langkah ini, anda perlu menapis data untuk mendapatkan 10 negara teratas bagi setiap tahun. Mari tambah beberapa lajur yang membolehkan kita memaparkan legenda untuk 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()

Membina histogram statik

Sekarang bahawa kami mempunyai pakej data dalam format yang diperlukan, kami mula melukis histogram statik. Maklumat asas - 10 negara teratas dengan KDNK maksimum untuk selang masa yang dipilih. Kami membuat graf untuk setiap tahun.

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

Mencipta plot menggunakan ggplot2 adalah sangat mudah. Seperti yang anda lihat dalam bahagian kod di atas, terdapat beberapa perkara utama dengan fungsi theme(). Mereka perlu supaya semua elemen bernyawa tanpa masalah. Sesetengah daripada mereka mungkin tidak dipaparkan jika perlu. Contoh: Hanya garisan grid menegak dan legenda dilukis, tetapi tajuk paksi dan beberapa komponen lain dialih keluar dari kawasan itu.

Animasi

Fungsi utama di sini ialah transition_states(); ia mencantumkan graf statik yang berasingan. view_follow() digunakan untuk melukis garis 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")

Rendering

Setelah animasi dibuat dan disimpan dalam objek anim, tiba masanya untuk menjadikannya menggunakan fungsi animate(). Penyampai yang digunakan dalam animate() boleh berbeza bergantung pada jenis fail output yang diperlukan.

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 )

Keputusan

Cipta Histogram Beranimasi Menggunakan R

Seperti yang anda lihat, tiada yang rumit. Keseluruhan projek tersedia di GitHub saya, anda boleh menggunakannya mengikut kesesuaian anda.

Skillbox mengesyorkan:

Sumber: www.habr.com

Tambah komen