R: изменить цвет igraph в зависимости от условия, если элемент в списке элементов - PullRequest
0 голосов
/ 30 января 2020

У меня есть объект iGraph. Я хочу изменить цвет некоторых подузлов на светло-голубой, в то время как все остальные оранжевые.

Следующий код возвращает false для всех узлов, поэтому все узлы возвращаются как оранжевые. Почему это так?

V(sub_net)
> 20/20 vertices, named, from 348f7f4:
> [1] 115 325 423 446 482 485 487 491 492 511 512 517 518 519 521 523 541 561 621 712

typeof(V(sub_net)[1])
> [1] "integer"

V(sub_net)$color <- ifelse(V(sub_net) %in% c(511,   541, 518, 519),"lightblue", "orange")

V(sub_net)$color
> [1] "orange" "orange" "orange" "orange" "orange" "orange" "orange" "orange" "orange" "orange"
>[11] "orange" "orange" "orange" "orange" "orange" "orange" "orange" "orange" "orange" "orange"

Мой код показывает, что имеется 20 узлов целочисленного типа, и пытается переназначить 511, 541, 518 и 519 на светло-синий (иначе оранжевый). Но когда я строю график, все узлы оранжевого цвета.

Я считаю, что виновато утверждение ifelse, но я не понимаю проблемы.

Добавим еще немного контекста относительно того, как я получил мои данные:

infile<-"MergerNet_Jan21_2016_forR.csv"
## Load package
library(igraph)
el = read.csv(infile, header = TRUE, sep = ",")
g_acq = graph.data.frame(el, directed = TRUE, vertices= NULL)

### List of all the years represented in the set
el[,"year"]
df <- data.frame(el)
class(df$weight)
# ---
#[1] "integer"
# ---

class(df$source)
# ---
# [1] "factor"
# ---

class(el)
# ---
# [1] "data.frame"
# ---

# Edges
ecount(g_acq)
## Vertices
vcount(g_acq)

#Is it a simple graph? No!
## Check whether Self_loops exist, as do multiple edges
is.simple(g_acq)
# ---
#[1] FALSE
# ---
E(g_acq)$weight 
g_acq_simpl<-simplify(g_acq)
### The above should default to the option below, to sum the existing edge weights ### when combining them
##g_acq_simpl<-simplify(g_acq,edge.attr.comb="sum" )

E(g_acq_simpl)$weight 
# Will use the inverse of log weight for shortest path calculations
inv_weight<-1/log(E(g_acq_simpl)$weight  + 1)
num_weight<-E(g_acq_simpl)$weight 
length(inv_weight)

# Remove disconnected components to create a strongly connected component. We will use this component to calculate closeness and shortest path distances.
g_acq_scc <-g_acq_simpl - vertices('814', '925', '928')
inv_weight_scc<-1/log(E(g_acq_scc)$weight  + 1)

plot(g_acq_scc)
sub_net<-induced.subgraph(g_acq_simpl, v=c('511', '541',
                                           '518', '519', '517', '325', '423', '446', '512', '523',
                                           '561', '621', '115', '482', '485', '487', '491', '492',
                                           '521', '712' ))

Обратите внимание, что с тех пор я изменил свой код, чтобы попытаться использовать как целочисленные, так и строковые аргументы, но следующее вернуло false, к моему замешательству:

V(sub_net) %in% c(511, 541, 518, 518)
>  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [20] FALSE

is.element(el = V(sub_net),set=c(511, 541, 518, 518))
>  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [20] FALSE

V(sub_net) %in% c('511', '541', '518', '518')
>  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [20] FALSE

is.element(el = V(sub_net),set=c('511', '541', '518', '518'))
>  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [20] FALSE

1 Ответ

0 голосов
/ 31 января 2020

Попробуйте вставить свой оператор ifelse в plot, в аргумент vertex.color, например:

plot(sub_net, vertex.color= ifelse(V(sub_net) %in% c(511, 541, 518, 519),"lightblue", "orange"))
...