使用 R 创建动画直方图

使用 R 创建动画直方图

可以直接嵌入到任何网站的帖子中的动画条形图变得越来越流行。 它们清晰地显示了特定时间内任何特征变化的动态。 让我们看看如何使用 R 和通用包创建它们。

技能箱推荐: 实践课程 《从零开始的Python开发》.

我们提醒: 对于“Habr”的所有读者 - 使用“Habr”促销代码注册任何 Skillbox 课程可享受 10 卢布的折扣。

我们需要 R 中的包:

这两点是极其必要的。 此外,还需要 tidyverse、janitor 和 scales 来管理数据、清理数组并相应地格式化。

数据

我们将在该项目中使用的原始数据集是从世界银行网站下载的。 他们来了 - 世界银行数据。 相同的数据,如果您需要现成的,可以从 项目文件夹.

这是什么样的信息? 该样本包含大多数国家数年(2000年至2017年)的GDP值。

数据处理

我们将使用下面发布的代码来准备所需的数据格式。 我们清除列名,将数字转换为数字格式,并使用 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。

加载库

  • 图书馆(tidyverse)
  • 图书馆(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()

构建静态直方图

现在我们有了所需格式的数据包,我们开始绘制静态直方图。 基本信息 - 选定时间间隔内 GDP 最高的前 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")

渲染图

创建动画并将其存储在 anim 对象中后,就可以使用 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,您可以根据需要使用它。

技能箱推荐:

来源: habr.com

添加评论