Как управлять узлами выбросов для алгоритмов компоновки сети?
Представление большого графика (>10000 узлов; > 10000 ребер) с использованием igraph
пакет с алгоритмом компоновки Фрухтермана-Рейнгольда. Некоторые посторонние узлы усложняют визуализацию, 99% узлов скручиваются вместе, а 1% посторонних узлов расположены далеко. Например, 99,9% узлов располагаются между 0 и 10, но 0,1% узлов располагаются за пределами 10000. Проблема заключается в том, как управлять этими выбросными узлами, чтобы представить все узлы.
Вот пример, в котором узлы выброса на 0,2% затрудняют полную презентацию.
> library(igraph)
> ig <- erdos.renyi.game(12000,1/10000,directed=TRUE,loops=FALSE)
> set.seed(12)
> ig.layout <- layout_with_fr(ig)
> apply(ig.layout,2,quantile,c(0,0.001,0.01,0.1,0.9,0.99,0.999,1))
[,1] [,2]
0% -54.7584289 -58.192821
0.1% -49.8806632 -51.090376
1% -29.7822097 -33.073435
10% -0.2196407 -1.170996
90% 10.1564691 10.513665
99% 2026.5245335 737.739440
99.9% 16433.7302032 13168.400710
100% 22614.7986797 22284.309659
1 ответ
Один из способов "контролировать" выбросы - это избавиться от них. Это уменьшит вашу первоначальную проблему, но вы все равно застрянете с большим графиком, который трудно визуализировать. Но давайте разберемся с одной вещью за раз. Во-первых, выбросы.
К сожалению, вы установили начальное значение после создания графика. Я буду двигать set.seed
сначала заявление, чтобы результаты были воспроизводимыми.
library(igraph)
set.seed(12)
ig <- erdos.renyi.game(12000,1/10000,directed=TRUE,loops=FALSE)
ig.layout <- layout_with_fr(ig)
apply(ig.layout,2,quantile,c(0,0.001,0.01,0.1,0.9,0.99,0.999,1))
[,1] [,2]
0% -5.359639e+01 -9.898871e+01
0.1% -4.996891e+01 -5.046219e+01
1% -3.040131e+01 -2.934615e+01
10% -1.221806e-02 1.513951e-02
90% 1.207328e+01 1.130579e+01
99% 1.111746e+03 6.994646e+02
99.9% 1.418739e+04 1.182382e+04
100% 1.968552e+04 2.025938e+04
Я получаю результат, сопоставимый с вашим. Более того, график сильно искажен выбросами.
plot(ig, layout=ig.layout, vertex.size=4, vertex.label=NA,
edge.arrow.size=0.4)
Но что это за выбросы?
igComp = components(ig)
table(igComp$csize)
1 2 3 4 5 6 7 10489
1041 137 42 8 5 1 1 1
Ваш график имеет один очень большой компонент и довольно много мелких компонентов. "Выбросы" - это узлы в небольших, не связанных друг с другом компонентах. Я предлагаю, чтобы, если вы хотите увидеть график, исключите эти маленькие компоненты. Просто посмотрите на большой компонент.
C1 = induced_subgraph(ig, which(igComp$membership ==1))
set.seed(12)
C1.layout <- layout_with_fr(C1)
apply(C1.layout,2,quantile,c(0,0.001,0.01,0.1,0.9,0.99,0.999,1))
[,1] [,2]
0% -18.111038 -30.5068075
0.1% -11.257167 -14.4507491
1% -4.570292 -3.2830470
10% 0.124789 0.1836629
90% 7.182714 7.1506193
99% 12.291679 13.1523646
99.9% 26.812703 23.6325447
100% 35.186445 26.8564644
Теперь макет более разумный.
plot(C1, layout=C1.layout, vertex.size=4, vertex.label=NA,
edge.arrow.size=0.4)
Теперь "выбросы" исчезли, и мы видим ядро графика. У вас сейчас другая проблема. Трудно взглянуть на 10500 узлов и разобраться в этом, но по крайней мере вы можете увидеть это ядро. Я желаю вам удачи в дальнейшем исследовании.