Управление динамическими атрибутами вершин с помощью networkDynamic и / или ndtv - PullRequest
0 голосов
/ 29 мая 2019

Я смотрю на то, как со временем меняются правительственные учреждения.Планируется использовать пакет ndtv для визуализации изменений.У меня есть список узлов, в котором перечислены идентификаторы вершин, название агентства, начало узла и конечный узел:

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 агентств.Каждый из них будет иметь годовой бюджет (если они существуют в начале, конец в списке узлов).Любые советы или рекомендации будут оценены.

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Мне удалось заставить что-то работать.

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"))})
0 голосов
/ 29 мая 2019

для настройки динамических атрибутов вершин вы можете использовать функцию activate.vertex.attribute(), чтобы определить, какие вершины должны иметь какие значения и для какой продолжительности.Например, чтобы создать динамический атрибут в вершине 1 с именем «бюджет» со значением 10000 из 2014-2015 гг .:

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

Скорее всего, вы захотите сделать это все сразу при создании объекта.Если вы настроите свой nodelist так, чтобы он имел одну строку на вершину в год, вы сможете использовать опцию create.TEAs конструктора networkDynamic(), чтобы инициализировать объект необходимыми вам заклинаниями действия атрибута.Поэтому, если ваш 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

...