Исправление нескольких координат узлов при выполнении алгоритма кластеризации в 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,])
Другие вопросы по тегам