R语言 使用网络动态和/或 ndtv 控制动态顶点属性



我正在研究政府机构如何随时间变化。计划是使用 ndtv 包来可视化变化。我有一个节点列表,其中列出了顶点ID,机构名称,节点起点和节点终点:

nodelist <- read.csv("https://github.com/aterhorst/data/raw/master/nodelist.csv", header=T, stringsAsFactors = F)

以及显示开始、边缘末端的边缘列表:

edgelist <- read.csv("https://github.com/aterhorst/data/raw/master/edgelist.csv", header=T, stringsAsFactors = F)

我可以很容易地创建一个网络对象:

nw <- network(edgelist,
vertex.attr = nodelist[,c(1,2)],
vertex.attrnames = c("vertex.id", "agency"), 
directed = F)
nd <-networkDynamic(nw, 
edge.spells = edgelist[,c(3,4,2,1)],
vertex.spells=nodelist[,c(3,4,1)])

我可以根据边对网络进行动画处理,顶点没问题:

reconcile.vertex.activity(nd, mode = "match.to.edges")
filmstrip(nd, 
displaylabels = FALSE, 
frames = 5, 
slice.par = list(start = 2014, end = 2019, interval = 1, aggregate.dur = 1, rule = 'any'))
render.d3movie(nd,
filename = "~/owncloud/longspine/data/animation.html",
displaylabels = FALSE,
# This slice function makes the labels work
vertex.tooltip = function(slice) {paste("<b>Agency:</b>", (slice %v% "agency"))})

从本质上讲,这显示了边和顶点如何随时间而来去去。接下来,我想按机构预算调整顶点的大小。这每年都在变化。我应该怎么做?在线教程有点难以理解。在我的例子中,我们总共有217个机构。每个都有一个年度预算(如果它们在开始时存在,则在节点列表中终止)。任何提示或建议将不胜感激。

我设法让一些东西工作。

require(sna)
require(tsna)
require(ndtv)
require(networkDynamic)
require(lubridate)
nodelist <- read.csv("https://github.com/aterhorst/data/raw/master/nodelist.csv", header=T, stringsAsFactors = F)
edgelist <- read.csv("https://github.com/aterhorst/data/raw/master/edgelist.csv", header=T, stringsAsFactors = F)
nodelist_expanded <- read.csv("https://github.com/aterhorst/data/raw/master/nodelist_expanded.csv", header=T, stringsAsFactors = F)
# onset date must be numeric (does not like date?)
nodelist$onset <- year(nodelist$onset)
nodelist$terminus <- year(nodelist$terminus)
# colour nodes by portfolio type
nodelist$col <- ifelse(nodelist$portfolio == T, "red", "blue")
nodelist_expanded$onset <- year(nodelist_expanded$onset)
nodelist_expanded$terminus <- year(nodelist_expanded$terminus)
# scale attributes
nodelist_expanded$log_appropriation <- log(nodelist_expanded$appropriation + 10) / 10
nodelist_expanded$log_ext_revenue <- log(nodelist_expanded$ext_revenue + 10) / 10
edgelist$onset <- year(edgelist$onset)
edgelist$terminus <- year(edgelist$terminus)
# create basic network object
nw <- network(edgelist[,c(2,3)],
vertex.attr = nodelist[,c(1:3,6)],
vertex.attrnames = c("vertex.id", "agency", "portfolio", "col"),
directed = F)
# plot basic network object
plot(nw, vertex.col = "col")
# make dynamic network object
nd <-networkDynamic(nw,
edge.spells = edgelist[,c(4,5,3,2)],
vertex.spells = nodelist_expanded[,c(6,7,1,8,9)],
create.TEAs = TRUE,
vertex.TEA.names = c("log_appropriation", "log_ext_revenue"))
# reconcile things
reconcile.vertex.activity(nd, mode = "match.to.edges")
# make movie!
render.d3movie(nd,
displaylabels = FALSE,
vertex.col = "col",
vertex.tooltip = function(slice) {
paste("<b>Agency:</b>", (slice %v% "agency"))})

要设置动态顶点属性,您可以使用activate.vertex.attribute()函数来定义哪些顶点应该在多长时间内具有哪些值。例如,要在顶点 1 上创建一个名为"budget"的动态属性,其值为 10000,从 2014 年到 2015 年:

nd <-activate.vertex.attribute(nd,'budget',
value=10000,
onset=2014,
terminus=2015,
v=1)

您可能希望在创建对象时一次完成所有操作。 如果将nodelist设置为每年每个顶点有一行,则应该能够使用networkDynamic()构造函数的create.TEAs选项使用所需的属性活动法术初始化对象。因此,如果您的nodelist如下所示:


vertex.id        agency portfolio      onset   terminus  budget
1         1   AAF Company     FALSE 2014-07-01 2015-07-01   10000
2         1   AAF Company     FALSE 2015-07-01 2016-07-01   10500
...

然后

nd <-networkDynamic(nw, 
edge.spells = edgelist[,c(3,4,2,1)],
vertex.spells=nodelist[,c(3,4,1)],
create.TEAs=TRUE,
vertex.TEA.names='budget')

networkDynamic包小插图中关于"激活TEA属性"的部分应该有更多有用的信息 https://cran.r-project.org/web/packages/networkDynamic/vignettes/networkDynamic.pdf

然后,您应该能够在ndtv中将动态顶点属性映射到动画绘图属性(ndtv将在渲染时管理每个时间点从动态属性到静态属性的转换)

render.d3movie(nd,vertex.cex='budget')

除非这些组织的预算异常适中,否则我猜你会想使用预算的log()或其他方式来转换原始预算数字,否则节点将大得难以想象。

还有一个教程更深入地介绍了这一点,因为在时间窗口中的值聚合如何工作方面有一些必要的微妙之处: http://statnet.csde.washington.edu/workshops/SUNBELT/current/ndtv/ndtv_workshop.html#controlling-plot-properties-using-dynamic-attributes-teas

最新更新