R语言动态图可视化:如何、创建具有精美动画的图

本文展示如何用R语言动态图可视化:如何、创建具有精美动画的图。

由Kaizong Ye,Sherry Deng撰写

如何用R语言创建具有精美动画的图的例子。

 演示数据集

library(gapminder)
head(gapminder)
## # A tibble: 6 x 6
##   country     continent  year lifeExp      pop gdpPercap
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Afghanistan Asia       1952    28.8  8425333      779.
## 2 Afghanistan Asia       1957    30.3  9240934      821.
## 3 Afghanistan Asia       1962    32.0 10267083      853.
## 4 Afghanistan Asia       1967    34.0 11537966      836.
## 5 Afghanistan Asia       1972    36.1 13079460      740.
## 6 Afghanistan Asia       1977    38.4 14880372      786.

×

最近二十年来,随着动态图数据的大量产生,动态图可视化研究也得到了长足的发展。人们设计了许多可视化技术,用于支持不同种类的探索任务。接着,为了比较不同技术的优劣,人们又并发展了相应的评价方法。在此过程中,人们也将动态图可视化技术运用于解决一系列实际问题。Beck等人在今年EuroVis的Start of the Art Report环节报告了一篇综述论文[1],总结了现有的动态图可视化研究。他们共计考察了129篇相关论文,将它们大致分为技术类、评价类和应用类。他们随后对以上三方面研究进行详细的归类整理,并在最后展望了未来的研究方向。

在论文中,Beck等人将可视化技术分为动画技术(Animation)和时间轴技术(Time line)。


动画技术是一种直观的可视化技术。它主要基于点边图(Node link diagram)表示。因此,这类技术考虑的主要问题是,如果为每一个时间步的图选择一个好的点布局(Node layout)。根据考虑的图本身特性的不同,点布局算法又可以分为通用性算法和特殊算法。通用性算法可以处理所有类型的动态图数据。这类算法所考虑的一个核心问题是如何保持思维导图(Mental map)。也就是说,如何使得每个时间步的图有一个美观和容易理解的布局,同时相邻时间步的图布局又要尽可能相似以方便用户追踪点的移动。特殊算法往往针对特殊的数据,通常可以达到一些特殊的要求。比如有一类图数据,其中节点之间不仅有相互联系,节点本身还存在一个层级组织关系。也就是说,有些节点被看做是属于同一类。这类图数据成为组合图(Compound graph)。在动态组合图的可视化中,一个重要需求是保证同一类的节点始终在一起,并且当时间切换时,同一类节点形成的闭包的位置需要大致保持不变。有一些特殊的算法致力于解决这类问题,例如Dynamic GMap [2]。

相比而言,时间轴技术不那么直观,但它更侧重于分析时变特性。它既可以使用点边图表示,也可以使用矩阵(Matrix)表示。使用点边图表示的技术,通常会将每个时间步的图重叠(Superimpose)或并列放置(Juxtapose)。也有不少技术会将点边图和时间轴进行更加紧密的结合(Integrate),如图2所示。例如,最右侧的图中显示的是Massive Sequence View技术 [3],其中横轴是时间轴,每行表示一个节点,两行之间的连线表示一条边。这类技术给予了用户很大的设计自由度,通常支持很高精度的时间展示,但是直观性可能有所不足。


基于矩阵表示的时间轴技术,其时间信息要么通过矩阵的重叠或并置表示,要么通过在矩阵的每个小格内嵌入时间轴来表示。这类方法直观性最差,主要侧重于边模式的时序比较。

Beck等人认为,动态图可视化在未来有以下研究方向:

  • 发展评价方法,例如,何时需要保持思维导图,需要保持到什么程度?

  • 提高可视化伸缩度,例如,如何支持更多的时间步骤?

  • 设计混合表现技术,例如,是否可以混合矩阵表示和动画技术?

  • 支持更多类型的数据,例如,如何展现带不确定信息的动态图数据?

  • 发展交互技术,例如,如何标记和编辑动态图数据?

  • 应用于更多类型的数据

[1] Fabian Beck, Michael Burch, Stephan Diehl, and Daniel Weiskopf. The State of the Art in Visualizing Dynamic Graphs, in Proc. EuroVis State of The Art Report, 2014.

[2] Yifan Hu, Stephen G. Kobourov and Sankar Veeramoni. Embedding, Clustering and Coloring for Dynamic Maps, in Proc. IEEE PacificVis, pages 33-40, 2012.

[3] Stef van den Elzen and Danny Holten and Jorik Blaas and Jarke J. van Wijk. Reordering Massive Sequence Views: Enabling Temporal and Structural Analysis of Dynamic Networks, in Proc. IEEE PacificVis, pages 33-40, 2013.



静态图

p <- ggplot(
  gapminder, 
  aes(x = gdpPercap, y=lifeExp, size = pop, colour = country)
  ) +
  geom_point(show.legend = FALSE, alpha = 0.7) +
  scale_color_viridis_d() +
  scale_size(range = c(2, 12)) +
  scale_x_log10() +
  labs(x = "GDP per capita", y = "Life expectancy")
p


课程

R语言数据分析挖掘必知必会

从数据获取和清理开始,有目的的进行探索性分析与可视化。让数据从生涩的资料,摇身成为有温度的故事。

立即参加

基本

状态之间的过渡长度将设置为与它们之间的实际时间差相对应。

标签变量:frame_time。给出当前帧所对应的时间。

创建面板:

让视图跟随数据在每帧中变化

​ 


R语言对布丰投针(蒲丰投针)实验进行模拟和动态可视化生成GIF动画

阅读文章


静态图

p <- ggplot(
  airquality,
  aes(Day, Temp, group = Month, color = factor(Month))
  ) +
  geom_line() +
  scale_color_viridis_d() +
  labs(x = "Day of Month", y = "Temperature") +
  theme(legend.position = "top")
p

让数据逐渐出现

  • 按天显示(x轴)

在数据的几个不同阶段之间进行转换

数据准备:


随时关注您喜欢的主题


​ 

library(dplyr)
mean.temp <- airquality %>%
  group_by(Month) %>%
  summarise(Temp = mean(Temp))
mean.temp
## # A tibble: 5 x 2
##   Month  Temp
##   <int> <dbl>
## 1     5  65.5
## 2     6  79.1
## 3     7  83.9
## 4     8  84.0
## 5     9  76.9

创建平均温度的条形图:

p <- ggplot(mean.temp, aes(Month, Temp, fill = Temp)) +
  geom_col() +
  scale_fill_distiller(palette = "Reds", direction = 1) +
  theme_minimal() +
  theme(
    panel.grid = element_blank(),
    panel.grid.major.y = element_line(color = "white"),
    panel.ontop = TRUE
  )
p

​ 

  • transition_states():

​ 

  • enter_grow()+ enter_fade()

保存动画

如果需要保存动画以备后用,可以使用该anim_save()功能。


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds