Я пытаюсь создать сетевую визуализацию данных трассировки контактов, но ограничиваю группы узлов координатами ГИС или произвольно внутри многоугольника файла формы.
В идеале это должно быть в рамках ggplot2, чтобы я мог интегрироваться с другими картами, но если бы существовал igraph или другие решения, я тоже был бы счастлив.
Пример сети контактов из виньетки ggnetwork, распределяющей узлы с использованием принудительно-направленного алгоритма.
library(network)
library(sna)
library(ggnetwork)
n <- network(rgraph(10, tprob = 0.2), directed = FALSE)
n %v% "family" <- sample(letters[1:3], 10, replace = TRUE)
n %v% "importance" <- sample(1:3, 10, replace = TRUE)
e <- network.edgecount(n)
set.edge.attribute(n, "type", sample(letters[24:26], e, replace = TRUE))
set.edge.attribute(n, "day", sample(1:3, e, replace = TRUE))
ggplot(n, aes(x = x, y = y, xend = xend, yend = yend)) +
geom_edges(color = "black") +
geom_nodes(color = "black", size = 8) +
geom_nodetext(aes(color = family, label = LETTERS[ vertex.names ]),
fontface = "bold") +
theme_blank()
Немного заглянем под капот:
ggnetwork(n)
x y family importance na.x vertex.names xend yend day
1 0.9716994 0.2514118 b 3 FALSE 1 0.9716994 0.2514118 NA
2 0.2287786 0.3320298 a 3 FALSE 2 0.2287786 0.3320298 NA
3 1.0000000 0.6549319 c 3 FALSE 3 1.0000000 0.6549319 NA
4 0.6364260 0.6691008 b 2 FALSE 4 0.6364260 0.6691008 NA
5 0.5913509 0.2442173 b 3 FALSE 5 0.5913509 0.2442173 NA
6 0.2744755 0.7079372 c 2 FALSE 6 0.2744755 0.7079372 NA
7 0.4569772 1.0000000 a 3 FALSE 7 0.4569772 1.0000000 NA
8 0.0000000 0.5340600 a 2 FALSE 8 0.0000000 0.5340600 NA
9 0.8101132 0.0000000 b 1 FALSE 9 0.8101132 0.0000000 NA
10 0.8281340 0.3730087 c 2 FALSE 10 0.8281340 0.3730087 NA
17 0.0000000 0.5340600 a 2 FALSE 8 0.2287786 0.3320298 1
21 0.0000000 0.5340600 a 2 FALSE 8 0.2744755 0.7079372 2
41 0.2744755 0.7079372 c 2 FALSE 6 0.2287786 0.3320298 3
51 0.2744755 0.7079372 c 2 FALSE 6 0.6364260 0.6691008 3
61 0.4569772 1.0000000 a 3 FALSE 7 0.6364260 0.6691008 2
71 0.4569772 1.0000000 a 3 FALSE 7 0.2744755 0.7079372 2
81 0.5913509 0.2442173 b 3 FALSE 5 0.9716994 0.2514118 3
91 0.5913509 0.2442173 b 3 FALSE 5 0.2287786 0.3320298 3
101 0.5913509 0.2442173 b 3 FALSE 5 0.6364260 0.6691008 3
11 0.6364260 0.6691008 b 2 FALSE 4 1.0000000 0.6549319 3
12 0.8101132 0.0000000 b 1 FALSE 9 0.5913509 0.2442173 2
13 0.8101132 0.0000000 b 1 FALSE 9 0.9716994 0.2514118 2
14 0.8281340 0.3730087 c 2 FALSE 10 0.9716994 0.2514118 3
15 0.8281340 0.3730087 c 2 FALSE 10 0.6364260 0.6691008 2
16 0.8281340 0.3730087 c 2 FALSE 10 0.8101132 0.0000000 3
18 1.0000000 0.6549319 c 3 FALSE 3 0.9716994 0.2514118 2
na.y type
1 NA <NA>
2 NA <NA>
3 NA <NA>
4 NA <NA>
5 NA <NA>
6 NA <NA>
7 NA <NA>
8 NA <NA>
9 NA <NA>
10 NA <NA>
17 FALSE z
21 FALSE z
41 FALSE z
51 FALSE y
61 FALSE y
71 FALSE y
81 FALSE y
91 FALSE y
101 FALSE x
11 FALSE x
12 FALSE z
13 FALSE z
14 FALSE z
15 FALSE y
16 FALSE z
18 FALSE z
Я полагаю, что мог бы рандомизировать пары x / y внутри каждого многоугольника (например, splancs :: csr или sp :: spsample), но, очевидно, на выходе получился бы беспорядок линий и точек.
Можно ли использовать силовой алгоритм для алгоритмического распределения групп узлов в пределах определенных ограничений координат?