我的目标是使用 R 中的 ndtv 和 networkDynamic 包进行动态网络可视化。我使用边缘拼写和顶点拼写构造 networkDynamic 对象,如第 7.3 节所述。数据帧还包含时间边缘和顶点属性 (TEA)。
library(networkDynamic)
edges <- read.csv("https://raw.githubusercontent.com/SoranHD/Rstuff/main/edges.csv")
edges$X<- NULL
nodes <- read.csv("https://raw.githubusercontent.com/SoranHD/Rstuff/main/nodes.csv")
nodes$X <- NULL
net <- networkDynamic(edge.spells = edges, vertex.spells = nodes, create.TEAs = TRUE)
我希望所有边和顶点始终保持活动状态,但会根据它们的 TEA 而有所不同。我想要“权重”来确定边缘的宽度,“大小”来确定节点的大小。
但是,当我渲染动画时,很明显两者都没有正确映射到它们的对象上。
compute.animation(net,
slice.par = list(start = 1, end = 8, interval = 1, aggregate.dur = 1, rule = "any"))
render.d3movie(net, usearrows = T,
edge.lwd = (net %e% "weight.active")/100,
vertex.cex = (net %v% "size.active"),
output.mode = "HTML",
launchBrowser = FALSE)
出于某种原因,只有从“节点 1”指向的边具有不同的宽度,甚至这些边也没有按预期显示。节点大小也是错误的,并且始终保持不变。
显然我做错了什么。我尝试以几种不同的方式构建数据集,包括作为代表每个波的网络对象列表,但我一直遇到同样的问题。任何帮助将不胜感激。
编辑
在使用 network.list 选项构造 dynamicNetwork 对象时我遇到了同样的问题,并且在新梳数据上运行相同的代码时它仍然存在,如评论中所建议的那样。上面链接的文档提到数据集包含它似乎不包含的边缘属性“权重”,因此我使用 newcom.rank 数据集中的“rank”属性。
library(networkDynamic)
library(networkDynamic)
data(newcomb)
newcombDyn <- networkDynamic(network.list = newcomb.rank, create.TEAs = TRUE)
当比较 newcomb.rank 网络列表中第一个网络中的“rank”属性与时间 1 的“rank.active”属性时,我们发现它们不对应。此外,“rank.active”属性远大于活动边的数量。
get.edge.attribute(newcomb.rank[[1]], "rank")
get.edge.attribute.active(newcombDyn, "rank.active", at = 1)
此外,“rank.active”在 t = 2 时看起来与 t = 1 时相同。
get.edge.attribute.active(newcombDyn, "rank.active", at = 2)
最后,当基于“rank.active”属性渲染具有边缘宽度的动画时,边缘宽度不是动态的,而是始终保持静态。
compute.animation(newcombDyn, slice.par = list(start = 1, end = 14, interval = 1, aggregate.dur = 1, rule = "any"))
render.d3movie(newcombDyn, usearrows = T, edge.lwd = (newcombDyn %e% "rank.active")/2, output.mode = "HTML", launchBrowser = TRUE)