2017-01-20 11 views
2

у меня есть этот кусок кодаИндивидуальная окраска отдельных общин

library(igraph) 
library(igraphdata) 

data("karate") 

g <- karate 

# for reproducibility 
set.seed(23548723) 

network_layout <- layout_with_fr(g) 
trimmed_network <- delete.edges(g, which(E(g)$weight < 4)) 
communities <- cluster_louvain(trimmed_network) 

plot(communities, trimmed_network, layout=network_layout) 

и генерирует

enter image description here

Я хочу отключить раскраске (color="white" и mark.groups=NULL) вершин в однослойных (length 1), и я знаю, что вы можете манипулировать цветом «нормальных» графиков, используя $color, но я не сделал и любой намек в документации igraph, как обращаться с ней на сообщество.

Существует также возможность не использовать сообщество замышляет с

plot(trimmed_network, ...) 

, таким образом, используя цвет графика, но тогда я бы потерять маркировку группы.

Как я могу изменить цвет и групповые знаки за сообщества, основанные на length(communities[1]) == 1

ответ

2

Определение вершин в каждой группе> 1 и передавать их в виде списка в mark.groups. Это немного нерешительно, но это работает.

r <- rle(sort(communities$membership)) 
x <- r$values[which(r$lengths>1)] 
y <- r$values[which(r$lengths==1)] 
cols <- communities$membership 
cols[which(cols %in% y)] <- "white" 
grps <- lapply(x, function(x) communities[[x]]) 
grps <- lapply(1:length(grps), function(x) which(V(g)$name %in% grps[[x]])) 
plot(communities, trimmed_network, layout=network_layout, 
col = cols, mark.groups = grps) 

enter image description here

+0

Спасибо за ваш ответ. Очень интересный подход с использованием 'rle'. +1 для решения групповой маркировки, не может принять это, поскольку, поскольку отсутствует единичный вывод цвета вершин. – thatsIch

+0

Я полностью упустил эту часть. Виноват. Хорошо, я отредактирую ответ и добавлю код для окраски тех изолирующих вершин белого цвета. Ради полноты :). – paqmo

+0

Я принял ваш ответ для редактирования. – thatsIch

1

Нам нужно найти числовой идентификатор сообщества только с одним участником и установить цвет членов этих одноэлементных общин «белый ».

# Get community membership 
memb = membership(communities) 

# Find number of members in each community 
tab = table(memb) 

# Set colors for each member. (Adjust these as desired) 
col = colors()[2:(length(memb)+1)] 

# But for members of communities of one, set the color to white 
singles = which(memb %in% as.numeric(names(tab)[tab==1])) 
col[singles] = "white" 

plot(communities, trimmed_network, layout=network_layout, col=col, mark.groups=NULL) 

enter image description here

+0

Спасибо за ответ. Как насчет 'mark.group' сообществ с' length> 1'? – thatsIch

+0

Прости, я пропустил эту часть. Похоже, @paqmo накрыл его. – eipi10

+0

К сожалению, этот способ я не могу принять ни одного из ваших ответов, он не покрыл часть, которую вы разрешили: D, но возьмите +1 – thatsIch

 Смежные вопросы

  • Нет связанных вопросов^_^