Выяснение того, как группы вершин образуются и растворяются со временем в NDTV
Я создаю анимацию изменяющейся социальной сети в R-пакете NDTV. У меня есть список вершин, которые я хотел бы сгруппировать во время короткого периода анимации. Каков наилучший способ сделать это?
Я преследовал три разных пути, но потерпел неудачу во всех. Мы ценим любые предложения.
1) Я попытался использовать атрибут вершины под названием "группа", при том понимании, что это позволит мне связать вершину с группой. Используя анимацию "wheel" в мастерской ndtv в качестве отправной точки, я попытался развернуть следующий код:
activate.vertex.attribute(wheel,'group','2',onset=6,terminus=8,v=1)
render.animation(wheel,vertex.group='group',verbose=FALSE)
Но это вызывает сообщение об ошибке: "группа не является графическим параметром".
Это озадачивает, потому что когда я бегу list.vertex.attributes(wheel)
, group.active
указан в качестве атрибута. Color.active
также указан в качестве атрибута, и я могу изменить цвет вершин, используя метод, описанный выше. Почему один атрибут распознается программой, а другой нет?
2) Я также попытался загрузить CSV-файл, состоящий из координат x и y, в надежде, что я смогу использовать это для определения положения вершин. Мне удалось загрузить файл CSV и создать статический график с новыми координатами, но я не смог включить новые координаты в изменяющуюся анимацию этого графика. Вот данные и код, которые я использовал (опять же, этот код был развернут после инициализации сети, как описано на семинаре ndtv)
df<-read.csv(file="coords.csv",header=F,sep=",")
plot(wheelAt8,coords=df)
Это приводит к статическому графику, который отражает загруженные координаты, но сама анимация не изменяется.
3) Поскольку я не мог заставить работать вышеизложенное, я сейчас пытаюсь изменить network.layout.animate.useAttribute(net, dist.mat = NULL, default.dist = NULL,seed.coords = NULL, layout.par = list(x = "x", y = "y"), verbose = TRUE)
для этого проекта.
Я не уверен, с чего начать, потому что я не уверен, как поместить значения координат в "х".
Спасибо за ваше время.
1 ответ
ndtv
Пакет пытается расположить вершины в соответствии с расстояниями вдоль их ребер, поэтому простое добавление атрибута с именем group не даст этого. Вам нужно будет либо изменить структуру сети (активировать и деактивировать ребра между вершинами в вашей "группе"), либо полностью переопределить процесс анимации и просто указать точно, где вы хотите нарисовать вершины (что вы пытаетесь в попытке №2)
В вашем примере render.animation(wheel,vertex.group='group',verbose=FALSE)
не будет работать, потому что нет имени параметра vertex.group
, Если вы хотите раскрасить вершины по группам, вы бы сделали что-то вроде
render.animation(wheel,vertex.col='vertex.group')
который говорит ему использовать атрибут 'vertex.group' в качестве цвета вершины
При попытке №2 вы предоставляете только статический набор координат, поэтому я предполагаю, что вы хотите, чтобы вершины оставались в фиксированных положениях и просто анимировали изменения связывания? Для этого вам необходимо прикрепить свои координаты к сети в виде атрибутов с именами "x" и "y". Затем, поскольку вы хотите использовать нестандартный алгоритм компоновки сети, вам нужно вызвать compute.animation
и скажите, какой макет использовать, прежде чем позвонить render.animation
,
library(ndtv)
# the 'wheel' example network
wheel <- network.initialize(10)
add.edges.active(wheel,tail=1:9,head=c(2:9,1),onset=1:9, terminus=11)
add.edges.active(wheel,tail=10,head=c(1:9),onset=10, terminus=12)
# your coordinate amtrix
df<-matrix(c(-0.99603723, 2.798261858,
-0.10480299, 1.754082668,
0.64294818, 0.679889124,
1.19137571, 0.042572219,
1.47703967, 0.250050715,
1.49393321, 1.523045819,
1.2319355, 3.772612788,
0.72715205, 6.634426198,
0.01328487, 9.529656458,
-1.49393321, 0.662555779),ncol=2,byrow=TRUE)
# attach your *static* coordinates to the network
set.vertex.attribute(wheel,'x',df[,1])
set.vertex.attribute(wheel,'y',df[,2])
# compute the animation with the 'useAttribute' layout (which will look for x and y attributes)
compute.animation(wheel,animation.mode = 'useAttribute')
# render it
render.animation(wheel)