Tạo biểu đồ hoạt hình bằng R

Tạo biểu đồ hoạt hình bằng R

Biểu đồ thanh hoạt hình có thể được nhúng trực tiếp vào bài đăng trên bất kỳ trang web nào đang ngày càng trở nên phổ biến. Chúng hiển thị động lực của những thay đổi ở bất kỳ đặc điểm nào trong một thời gian nhất định và thực hiện điều này một cách rõ ràng. Hãy xem cách tạo chúng bằng R và các gói chung.

Hộp kỹ năng khuyến nghị: khóa học thực hành "Nhà phát triển Python từ đầu".

Chúng tôi nhắc nhở: cho tất cả độc giả của "Habr" - giảm giá 10 rúp khi đăng ký bất kỳ khóa học Skillbox nào bằng mã khuyến mại "Habr".

Các gói

Chúng tôi cần các gói trong R:

Hai điều này là vô cùng cần thiết. Ngoài ra, dọn dẹp, gác cổng và cân sẽ được yêu cầu để quản lý dữ liệu, dọn dẹp mảng và định dạng cho phù hợp.

Dữ liệu

Bộ dữ liệu gốc mà chúng tôi sẽ sử dụng trong dự án này được tải xuống từ trang web của Ngân hàng Thế giới. Họ đây rồi - Dữ liệu của Ngân hàng Thế giới. Dữ liệu tương tự, nếu bạn cần, có thể tải xuống từ thư mục dự án.

Đây là loại thông tin gì? Mẫu chứa giá trị GDP của hầu hết các quốc gia trong vài năm (từ 2000 đến 2017).

Xử lí dữ liệu

Chúng tôi sẽ sử dụng mã được đăng bên dưới để chuẩn bị định dạng dữ liệu cần thiết. Chúng tôi xóa tên cột, chuyển số sang định dạng số và chuyển đổi dữ liệu bằng hàm thu thập(). Chúng tôi lưu mọi thứ nhận được trong gdp_tidy.csv để sử dụng tiếp.

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

biểu đồ hoạt hình

Sự sáng tạo của họ đòi hỏi hai giai đoạn:

  • Vẽ một bộ biểu đồ thực tế hoàn chỉnh bằng ggplot2.
  • Tạo hoạt ảnh cho biểu đồ tĩnh với các tham số mong muốn bằng gganimate.

Bước cuối cùng là hiển thị hoạt ảnh ở định dạng mong muốn, bao gồm GIF hoặc MP4.

Đang tải thư viện

  • thư viện(tidyverse)
  • thư viện(gganmate)

Quản lý dữ liệu

Ở bước này, bạn cần lọc dữ liệu để có được 10 quốc gia hàng đầu mỗi năm. Hãy thêm một số cột cho phép chúng tôi hiển thị chú giải cho biểu đồ.

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

Xây dựng biểu đồ tĩnh

Bây giờ chúng ta đã có gói dữ liệu ở định dạng được yêu cầu, chúng ta bắt đầu vẽ biểu đồ tĩnh. Thông tin cơ bản - 10 quốc gia hàng đầu có GDP tối đa trong khoảng thời gian đã chọn. Chúng tôi tạo biểu đồ cho mỗi năm.

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

Tạo các ô bằng ggplot2 rất đơn giản. Như bạn có thể thấy trong phần mã ở trên, có một số điểm chính với hàm theme(). Chúng cần thiết để tất cả các yếu tố hoạt hình mà không gặp vấn đề gì. Một số trong số chúng có thể không được hiển thị nếu cần thiết. Ví dụ: Chỉ các đường lưới dọc và chú giải được vẽ nhưng tiêu đề trục và một số thành phần khác sẽ bị xóa khỏi khu vực.

hoạt hình

Hàm chính ở đây là transition_states(), nó ghép các biểu đồ tĩnh riêng biệt lại với nhau. view_follow() được sử dụng để vẽ các đường lưới.

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

Kết xuất

Sau khi hoạt ảnh được tạo và lưu trữ trong đối tượng hoạt hình, đã đến lúc hiển thị nó bằng hàm animate(). Trình kết xuất được sử dụng trong animate() có thể khác nhau tùy thuộc vào loại tệp đầu ra được yêu cầu.

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 )

Kết quả

Tạo biểu đồ hoạt hình bằng R

Như bạn có thể thấy, không có gì phức tạp. Toàn bộ dự án có sẵn trong GitHub của tôi, bạn có thể sử dụng nó khi bạn thấy phù hợp.

Hộp kỹ năng khuyến nghị:

Nguồn: www.habr.com

Thêm một lời nhận xét