【发布时间】:2019-10-06 00:00:31
【问题描述】:
我想使用不同的布局为同一个网络制作动画,并在布局之间实现平滑过渡。我想在 gganimate 框架内执行此操作。
library(igraph)
library(ggraph)
library(gganimate)
set.seed(1)
g <- erdos.renyi.game(10, .5, "gnp")
V(g)$name <- letters[1:vcount(g)]
l1 <- create_layout(g, "kk")
l2 <- create_layout(g, "circle")
l3 <- create_layout(g, "nicely")
long <- rbind(l1,l2,l3)
long$frame <- rep(1:3, each =10)
按照ggplot 方法,我以长格式(long)存储节点位置,并为每个布局添加一个frame 变量。
我试图使它与以下代码一起工作,它工作正常,几乎是我想要的。但是,我似乎找不到包含边缘的方法:
ggplot(long, aes(x, y, label = name, color = as.factor(name), frame = frame)) +
geom_point(size = 3, show.legend = F) +
geom_text(show.legend = F) +
transition_components(frame)
我还尝试将边缘添加为geom_segment,但最终在节点保持移动时它们是静态的。这就是我使用ggraph 包并失败的原因:
ggraph(g, layout = "manual", node.position = long) +
geom_node_point() +
geom_edge_link() +
transition_components(frame)
我想要一个网络的动画,其中节点位置不断变化,同时显示节点和边。
非常感谢任何帮助!
编辑:我了解到可以将布局直接包含到 ggraph 中(甚至可以操作属性)。这就是我在下面的 gif 中所做的。此外,正在使用 geom_edge_link0' 而不是 geom_edge_link。
ggraph(long) +
geom_edge_link0() +
geom_node_point() +
transition_states(frame)
注意边缘没有移动。
【问题讨论】:
-
使用
ggraph失败的原因是什么? -
它会抛出一个错误,指出节点和节点位置之间的差异。这是有道理的,因为网络有 10 个节点,而我提供了 30 个位置。不幸的是,我不知道如何规避这一点。
标签: r ggplot2 igraph gganimate ggraph