本文展示如何用R语言动态图可视化:如何、创建具有精美动画的图。
如何用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
基本
状态之间的过渡长度将设置为与它们之间的实际时间差相对应。
标签变量:frame_time
。给出当前帧所对应的时间。
创建面板:
让视图跟随数据在每帧中变化
逐步衰减
显示原始数据作为背景
您可以根据需要显示过去和/或将来的原始数据并设置其样式。
静态图
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)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。
本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。
非常感谢您阅读本文,如需帮助请联系我们!