igraph: добавление формы к краям между сообществами - PullRequest
0 голосов
/ 26 мая 2018

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

1 Ответ

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

Решение этой задачи состоит из двух частей:

  1. Нахождение ребер для маркировки и
  2. добавление символа к этим ребрам.

Этот ответ полностью относится к части 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)

Unlabeled graph

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

Часть 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)

Labeled Graph

...