фиксация узлов при построении сетей - PullRequest
0 голосов
/ 15 ноября 2018

mynet - это сетевой объект с 93 вершинами и тремя атрибутами вершин: sex, indegree и outdegree. Другой сетевой объект, simnet, является имитацией версии сети. Узлы и распределения степеней одинаковы, но некоторые ребра были перемонтированы.

Я строю их рядом ...

par(mfrow=c(1,2))
plot(mynet, vertex.col="sex", main="mynet")
plot(simnet, vertex.col="sex", main="simnet")

... и получите следующий результат:

enter image description here

Это было бы гораздо полезнее, если бы я мог зафиксировать расположение узлов на обоих графиках, поскольку это сделало бы различия в краях очень четкими. Есть ли способ сделать это с помощью функции base plot()? Если нет, то как проще всего это сделать без ручного ввода координат для каждого узла?

1 Ответ

0 голосов
/ 15 ноября 2018

Есть способ сделать это, установив макет перед построением и используя один и тот же макет для обоих графиков.Мы можем сделать это, используя имена узлов, так как это одни и те же узлы между каждым графом.Подход немного хакерский, но, похоже, работает.Пример кода ниже:

library(igraph)

# Make some fake networks
set.seed(42)
df1 <- data.frame(e1 = sample(1:5, 10, replace = T),
                  e1 = sample(1:5, 10, replace = T))

df2 <- data.frame(e1 = sample(1:5, 10, replace = T),
                  e1 = sample(1:5, 10, replace = T))

# the original
g1 <- graph_from_data_frame(df1, directed = F)
# the 'simulations'
g2 <- graph_from_data_frame(df2, directed = F)

# set up the plot
par(mfrow=c(1,2))
# we set the layout
lo <- layout_with_kk(g1)
# this is a matrix of positions. Positions
# refer to the order of the nodes
head(lo)
#>             [,1]        [,2]
#> [1,] -0.03760207  0.08115827
#> [2,]  1.06606602  0.35564140
#> [3,] -1.09026110  0.28291157
#> [4,] -0.90060771 -0.72591181
#> [5,]  0.67151585 -1.82471026
V(g1)
#> + 5/5 vertices, named, from 418e4e6:
#> [1] 5 2 4 3 1

# If the layout has names for the rows then we can
# use those names to fiddle with the order
row.names(lo) <- names(V(g1))

# plot with layout
plot(g1, layout = lo)
# plot with layout but reorder the layout to match the order
# in which nodes appear in g2
plot(g2, layout = lo[names(V(g2)), ])

Создано в 2018-11-15 пакетом представлением (v0.2.1)

...