Атрибуты вершин в двудольном сетевом графике

Во-первых, я новичок в R, поэтому извиняюсь, если это простой вопрос.

У меня есть .csv с пограничной сетью групп, людей, связанных с ними, и некоторыми атрибутами людей и групп.

e.g.

Групповой человек ПерсонаГрупповая игра
Снукер Теннис Джейн Доу
B Футбол Футбол Джон Доу
Теннис Билла Смита
B Футбол Футбол Фрэнсис Андервуд
Футбол Теннис Фрэнсис Андервуд

Я нарисовал двудольную сеть:

df <- read.csv("file.csv", header = TRUE, sep = ",")
df.network <- graph.data.frame(df, directed = F)
V(df.network)$type <- bipartite.mapping(df.network)$type

В настоящее время я раскрасил вершины Group и Person по-разному следующим образом:

V(df.network)$color <- ifelse(V(df.network)$type, "grey", "orange")

что я действительно хочу сделать, так это по-разному раскрасить вершины Person в зависимости от поля «Person Game», но, похоже, это не атрибут, к которому я могу получить доступ для вершины, только Edge. Итак, это работает для окраски краев:

E(df.network)$color <- ifelse(E(df.network)$PersonGame=='Snooker', 
 "red", ifelse(E(df.network)$PersonGame=='Football', "blue", "orange"))

но это не сработает, если я применяю к вершинам вместо ребра, поскольку я не могу заставить атрибут PersonGame применить к вершине.

Кто-нибудь может помочь?


person otter77    schedule 22.03.2018    source источник


Ответы (1)


Рекомендую перенести игры на ноды. Поскольку некоторые узлы являются группами, а другие - персонами, я буду называть это просто игрой (а не персональной игрой и групповой игрой), но я передам персональные игры людям, а групповые игры - группам.

PA = unique(cbind(ends(df.network, E(df.network))[,2], E(df.network)$PersonGame))
GA = unique(cbind(ends(df.network, E(df.network))[,1], E(df.network)$GroupGame))

V(df.network)$Game = ""
V(df.network)[PA[,1]]$Game = PA[,2]
V(df.network)[GA[,1]]$Game = GA[,2]

Теперь у каждого узла есть Game. Мы можем изменить вашу инструкцию, которая создала цвет ребра, чтобы создать цвет вершины. Я добавил линию, чтобы по-разному раскрасить группы

V(df.network)$color <- ifelse(V(df.network)$Game=='Snooker', 
 "red", ifelse(V(df.network)$Game=='Football', "blue", "orange"))
V(df.network)[!V(df.network)$type]$color = "lightgray"

Теперь мы можем рисовать с помощью цветов узлов.

LO = layout_as_bipartite(df.network)
plot(df.network, layout=LO)

Сеть с цветными узлами

person G5W    schedule 22.03.2018