iGraph (R) - условное изменение цвета или веса ребра - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь изменить цвет узлов на графике в зависимости от значения флага, соответствующего определенному узлу.См. Список ребер HAVE ниже, например:

ego friend  realfriend  resources
Joe Jim              1          2
Joe Jon              1          1
Joe James            1          5
Sam Jeff             1          2
Sam Stephanie        1          3
Sam Joe              1          1
Sam Jim              1          1
Bob Dylan            0          1
Bob Jim              1          4

Дилан - воображаемый друг, поэтому я хочу, чтобы узел, представляющий его (и других воображаемых друзей), отличался от realfriend = 1. Я поворачиваюсьHAVE в следующем графике:

test <- graph.data.frame(HAVE, directed=F)
plot(test, vertex.size=degree(test))

Но когда я пытаюсь заставить узлы отображаться разными цветами на основе значения для realfriend, график не производит никакого изменения цвета:

colrs <- c("red", "blue")
V(test)$color <- colrs[V(test)$realfriend]

Есть идеи, почему это не сработает?

1 Ответ

0 голосов
/ 30 мая 2018

Данные для графика показаны в конце.

Есть много вещей, которые нужно отрегулировать, чтобы получить то, что вы хотите.Во-первых, как я уже отмечал в комментариях, как вы их построили, realfriend - это свойство ребер, а не вершин.Чтобы иметь возможность раскрасить вершины, вам нужно свойство вершин.Я считаю, что вы имели в виду, что каждый , указанный в HAVE $ ego (первый столбец), является реальным.Имеет ли $ realfriend показатель того, является ли HAVE $ friend (второй столбец) реальным.Поэтому нам нужно перенести это с ребер на вершины.Затем мы можем использовать что-то вроде вашего кода, чтобы назначать цвета для вершин, но есть и другие небольшие проблемы, которые нужно исправить.Вы используете V (test) $ realfriend для индексации в списке цветов.Но (как только мы его создадим) V (test) $ realfriend принимает значения 0 или 1. Нет цвета 0. Нам нужны цвета 1 или 2, поэтому я добавляю один к V (test) $ realfriend при использовании его в качествеиндекс в цвета.Кроме того, некоторые вершины вычерчиваются очень маленькими, поэтому трудно сказать, какого они цвета.Я сохранил размер, пропорциональный степени, но сделал вершины намного больше.Итак, складывая все это вместе:

library(igraph)
test <- graph.data.frame(HAVE, directed=F)

## label the vertices with reality
for(i in 1:ecount(test)) {
    E = ends(test, E(test)[i])
    V(test)[E[1]]$realfriend = 1
    V(test)[E[2]]$realfriend = HAVE$realfriend[i]
}

colrs <- c("red", "blue")
V(test)$color <- colrs[V(test)$realfriend+1]

plot(test, vertex.size=degree(test)*6)

Graph with colored vertices

Обратите внимание, что Дилан вышел красным, а остальные синим.

Данные

HAVE = read.table(text="ego friend  realfriend  resources
Joe Jim              1          2
Joe Jon              1          1
Joe James            1          5
Sam Jeff             1          2
Sam Stephanie        1          3
Sam Joe              1          1
Sam Jim              1          1
Bob Dylan            0          1
Bob Jim              1          4",
header=TRUE)
...