0

我的目标是使用 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)
4

2 回答 2

0

因为渲染函数已经在每个时间步(使用network.collapse)计算了一个静态“切片”网络,所以可以直接传入要使用的属性的静态版本的名称(“size”与“size.active”)渲染功能:

> render.d3movie(net, usearrows = T,
                                 edge.lwd = 'weight',
                                 vertex.cex = 'size',
                                 output.mode = "HTML",
                                 launchBrowser = FALSE)

但是在这种情况下,您还想转换属性以进行渲染,您可以传入一个要应用的函数(参见示例中的示例)该函数可以使用与该时间片的相应网络相对应?render.animation的变量命名:slice

> render.d3movie(net, usearrows = T,
                 edge.lwd = function(slice){slice%e%'weight'/100},
                 vertex.cex = function(slice){slice%v%'size'},
                 output.mode = "HTML",
                 launchBrowser = FALSE)

看起来您已将边定义为在所有时间步的所有顶点之间都处于活动状态,但顶点并未定义为在所有时间步内都处于活动状态。例如,在时间步一只有 9 个顶点处于活动状态。您可以更改输入文件以对齐顶点和边缘活动。您还可以reconcile.vertex.activity()用来扩展顶点的活动(但它无法推断缺失时间范围的 TEA 属性)

于 2021-04-20T19:00:56.423 回答
0

我认为这只是从 更改为 的问题rank.activerank但结果可能不是您想要的,因为所有关系都存在,因为不允许有任何关系。但,

library(networkDynamic)
library(ndtv)
data(newcomb)
newcombDyn <- networkDynamic(network.list = newcomb.rank, create.TEAs = TRUE)

看看两者的区别

get.edge.value.active(newcombDyn, 'rank', onset=0, terminus=1,  dynamic.only=TRUE)

get.edge.value.active(newcombDyn, 'rank', onset=1, terminus=2,  dynamic.only=TRUE) 

我们看到值正在改变,所以应该按预期映射(也许)

render.d3movie(newcombDyn, usearrows = T, edge.lwd = (newcombDyn %e% "rank")/2, output.mode = "HTML", launchBrowser = TRUE)

制作某种电影。或者,使用上面的数据(现在它已被作者证明是安全的),更改您的

render.d3movie(net, usearrows = T,
          edge.lwd = (net %e% "weight.active")/100,
          vertex.cex = (net %v% "size.active"),
          output.mode = "HTML",
          launchBrowser = FALSE)

render.d3movie(net, usearrows = T,
           edge.lwd = (net %e% "weight.active")/25, #divide by 100 makes invisible arrows
           vertex.cex = (net %v% "size.active")*2, # perhaps too large, but...
           output.mode = "HTML",
           launchBrowser = FALSE)

对于一个非常棘手的数据结构,它似乎正在工作(ish)。HTH

于 2021-04-20T15:53:49.643 回答