Круговые циклы в пакете R iGraph

Как с помощью iGraph представить саморефлексивные узлы с помощью кривых в форме круга? По умолчанию эти кривые представлены в виде защемленной или каплевидной петли.


person Chernoff    schedule 21.09.2012    source источник


Ответы (2)


Внутри plot.igraph вы можете видеть, что циклы отрисовываются с помощью функции plot.bezier, и все управление для этого в значительной степени жестко закодировано там. Вам придется переписать большие куски plot.igraph, чтобы вызвать функцию plot.circle, которую вам придется написать для этого.

Кроме того, я предполагаю, что вам нужны не полные круги, а сегменты кругов, которые начинаются на краю символа вершины (синий круг по умолчанию с номером вершины в нем) и заканчиваются (возможно, со стрелкой) в другой части край символа вершины? Или вам нужны круги, которые касаются символа, как это делают петли Безье?

В любом случае, ответ, кажется, «нет, не без программирования или отправки запроса на функцию ребятам из igraph».

Я опубликовал более ранний ответ, в котором говорилось, что были задействованы функции макета, но это неправда - функции макета только позиционируют вершины, а работа plot.igraph заключается в рисовании ребер.

person Spacedman    schedule 21.09.2012
comment
Место отправки запроса на функцию находится здесь: bugs.launchpad.net/igraph/+bugs - person Gabor Csardi; 21.09.2012

Как сказал Spacedman, для этого вам нужно будет немного запрограммировать. Вы можете построить график без циклов, а затем добавить их (графики в основном представляют собой диаграмму рассеяния, и вы можете использовать points и подобные функции для добавления к ним линий), но это не тривиально (тем более что вам нужно знать ребра узлов). , а не их центр) и приведет к тому, что петли будут нанесены поверх всего остального, что может выглядеть не очень хорошо.

В эти выходные я обновил qgraph информацию о том, как работают автопетли. qgraph можно использовать для построения сетей, и он прекрасно сочетается с igraph. например.:

# An adjacency matrix:
A <- matrix(1,3,3)

library("igraph")
# igraph graph and layout:
Graph <- graph.adjacency(A)
Layout <- layout.circle(Graph)

# Plot in qgraph:
library("qgraph")
qgraph(get.adjacency(Graph,sparse=FALSE),layout=Layout,diag=TRUE,directed=TRUE)

введите здесь описание изображения

Я вполне доволен тем, как получились эти петли, и они кажутся более подходящими для того, что вы описываете. Так что это может быть вариант. Однако мои циклы так же жестко запрограммированы. Для справки, я вычисляю ребро узла (начальную и конечную точки цикла) с помощью внутренней функции qgraph:::Cent2Edge и вычисляю форму цикла (сплайн) с помощью внутренней функции qgraph:::SelfLoop.

person Sacha Epskamp    schedule 21.09.2012
comment
Какой параметр указывает qgraph рисовать прямые линии или сплайны? - person skan; 19.11.2017