
您可以直接嵌入任何网站的出版物中的动画直方图正变得越来越流行。 它们显示特定时间段内任何特性的变化动态并清楚地做到这一点。 让我们看看如何使用R和通用包创建它们。
Skillbox建议: Python开发人员从头开始 实践课程。
我们提醒您: 对于所有“哈勃”读者来说,使用“哈勃”促销代码注册任何Skillbox课程时均可享受10,000卢布的折扣。
配套
我们需要R中的软件包:
这两个是必不可少的。 另外,需要tidyverse,janitor和scales来分别管理数据,清除阵列和格式化。
资料
我们将在该项目中使用的原始数据集是从世界银行的网站下载的。 它们是-
世界银行数据 。 如果需要完整格式的数据,可以从
项目文件夹中下载。
这是什么信息? 该样本包含了过去几年(2000年至2017年)大多数国家的GDP。
资料处理
我们将使用下面的代码准备所需的数据格式。 我们清除列名,将数字转换为数字格式,然后使用collect()函数转换数据。 接收到的所有信息都存储在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)渲染动画。
加载库
资料管理
在此步骤中,您需要过滤数据以获取每年的前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构建图非常简单。 如您在上面的代码部分中看到的,主题()函数有一些关键点。 它们是必不可少的,以便所有元素都可以动起来而不会出现问题。 如果有必要,其中一些可能不会显示。 示例:仅绘制垂直网格线和图例,但是从该位置删除了轴的标题和其他一些组件。
动画制作
这里的关键功能是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()函数对其进行可视化了。 动画()中使用的渲染器可能会有所不同,具体取决于所需的输出文件的类型。
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 )
结果

如您所见,没有什么复杂的。 整个项目都可以在
我的GitHub上找到 ,您可以根据需要使用它。
Skillbox建议: