Решение этой задачи состоит из двух частей:
- Нахождение ребер для маркировки и
- добавление символа к этим ребрам.
Этот ответ полностью относится к части 1, но ответ к части 2 не идеален.
Настройка Базовый график и кластеризация
library(igraph)
g <- graph_from_literal(1-2-3-4-1, 2-5-4, 1-5,3-5,
2-6, 1-9, 6-7-10-8-6, 6-9-10)
CL = cluster_louvain(g)
set.seed(1234)
plot(CL, g)
Я установил случайное начальное число, чтобы мы могли получить тот же график позже длясравнение.
Часть 1. Найти границы между сообществами
Это довольно просто.Просто проверьте, находятся ли конечные точки каждого ребра в одном или разных сообществах.Чтобы сделать это сравнение, удобно назначить номер кластера каждой вершины в качестве атрибута.
## create a cluster label for each vertex
V(g)$cluster = 0
for(i in 1:length(CL)) {
V(g)[CL[[i]]]$cluster = i }
## identify the cross-cluster edges and check
XCE = which(V(g)[ends(g, E(g))[,1]]$cluster !=
V(g)[ends(g, E(g))[,2]]$cluster)
E(g)[XCE]
+ 2/16 edges (vertex names):
[1] 1--9 2--6
Мы видим, что это правильно идентифицировало ребро между вершинами 1 и 9 и ребро между вершинами2 и 6 как ребра, которые соединяют разные сообщества.
Часть 2 Аннотирование ребер перекрестного сообщества
Идея в том, чтобы использовать метки ребер для обозначения ребер между сообществами.Края меток текстовые.Если вы хотели текстовую метку, это полное решение.Но если вы хотите символ, вы ограничены теми символами, которые вы можете сделать в тексте.Я пытался использовать многие символы символов Юникода, но безуспешно.Предыдущий вопрос SO Есть ли аргумент для принудительного использования UTF8 в функциях igraph? спросил, как использовать Unicode, но ответа не получил.Я был успешным при использовании расширенных символов ASCII.Я использую ¤ ниже, но некоторые другие, чтобы попробовать это: ‡ ¤ • º §
## Create edge labels
EdgeLabel = rep("", ecount(g))
## Potential symbol characters: ‡ ¤ • º §
EdgeLabel[XCE] = "¤"
set.seed(1234)
plot(CL, g, edge.label=EdgeLabel, edge.label.cex=1.5)