微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

构建 networkDynamic 对象时,边缘和顶点属性映射不正确

如何解决构建 networkDynamic 对象时,边缘和顶点属性映射不正确

我的目标是使用 R 中的 ndtv 和 networkDynamic 包进行动态网络可视化。我使用第 7.3 节 here 中所述的边拼写和顶点拼写构造 networkDynamic 对象。数据框还包含时间边和顶点属性 (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 对象时遇到了同样的问题,并且在 newcomb 数据上运行相同的代码时它仍然存在,如评论中所建议的。上面链接的文档提到该数据集包含它似乎没有的边缘属性“权重”,因此我使用 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,at = 2)

最后,当根据“rank.active”属性渲染具有边缘宽度的动画时,边缘宽度不是动态的,而是始终保持静态。

    compute.animation(newcombDyn,end = 14,rule = "any"))
render.d3movie(newcombDyn,edge.lwd = (newcombDyn %e% "rank.active")/2,launchbrowser = TRUE)

解决方法

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

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,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,edge.lwd = (net %e% "weight.active")/100,vertex.cex = (net %v% "size.active"),launchBrowser = FALSE)

render.d3movie(net,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

,

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

> render.d3movie(net,edge.lwd = 'weight',vertex.cex = 'size',launchBrowser = FALSE)

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。