Исправление нескольких координат узлов при выполнении алгоритма кластеризации в igraph
Интересно, возможно ли следующее:
В настоящее время у меня есть подмножество узлов в графе (граф A), которое принадлежит другому отдельному и большему графу (граф B).
Я хотел бы сохранить компоновку из графа B, относящуюся к этому подмножеству узлов, при запуске алгоритма генерации компоновки на графе A. Может быть любой из алгоритмов компоновки.
layout.circle(graph, params)
layout.sphere(graph, params)
layout.fruchterman.reingold(graph, ..., dim=2, params)
layout.kamada.kawai(graph, ..., dim=2, params)
layout.spring(graph, ..., params)
layout.reingold.tilford(graph, ..., params)
layout.fruchterman.reingold.grid(graph, ..., params)
layout.lgl(graph, ..., params)
layout.graphopt(graph, ..., params=list())
layout.mds(graph, dist=NULL, dim=2, options=igraph.arpack.default)
layout.svd(graph, d=shortest.paths(graph), ...)
2 ответа
Вы можете использовать minx
, maxx
, miny
а также maxy
аргументы layout.fruchterman.reingold()
или же layout.kamada.kawai()
исправить некоторые вершины полностью. Эти аргументы определяют специфичные для вершины нижние и / или верхние пределы для координат.
Для вершин, которые вы хотите исправить, установите их точно на значение, которое нужно исправить, а для других вершин установите minx
к небольшим отрицательным значениям (-Inf
может работать тоже), и установить maxx
в какое-то большое значение, (опять же, может быть Inf
работает тоже).
Возможно, вам придется использовать rescale=FALSE
аргумент в plot.igraph()
чтобы избежать масштабирования всего макета, как для первого, так и для второго графика.
Редактировать:
Из руководства:
'
minx
' Если не 'NULL
', то это должен быть числовой вектор, который задает нижние границы для'x
координаты вершин. Длина вектора должна соответствовать количеству вершин в графе.'
maxx
' Похожий на 'minx
', но дает верхние границы.
Например:
g <- graph.star(10, center=1)
minx <- rep(-Inf, vcount(g))
maxx <- rep( Inf, vcount(g))
minx[1] <- 0
maxx[1] <- 0
lay <- layout.fruchterman.reingold(g, minx=minx, maxx=maxx, miny=minx, maxy=maxx)
plot(g, layout=lay)
фиксирует первую вершину в (0,0) (может быть изменен путем изменения масштаба, чтобы избежать изменения масштаба, используйте rescale=FALSE
в plot()
и установить пределы печати).
Макет в igraph определяется как (число узлов) матрицей из 2, где первый столбец указывает координату x (в произвольном масштабе), а второй столбец - координату y. Вы можете сохранить результат любой из этих функций для получения этой матрицы, а затем передать ее layout
аргумент, когда вы строите другой график.
library("igraph")
# A 3-node network:
g <- graph.adjacency(matrix(1,3,3))
# Obtain a layout:
l <- layout.circle(g)
# A different 3-node network:
g2 <- graph.adjacency(matrix(0,3,3))
# Plot second network with layout based on first network:
plot(g2,layout=l)
редактировать
Если у вас есть подмножество графика, вы можете просто проиндексировать эту матрицу. Например:
# A 3-node network:
g <- graph.adjacency(matrix(1,3,3))
# Obtain a layout:
l <- layout.circle(g)
# A 2-node subset:
g2 <- graph.adjacency(matrix(1,2,2))
# Plot second network with layout based on first network:
plot(g2,layout=l[1:2,])