Как управлять узлами выбросов для алгоритмов компоновки сети? - PullRequest
0 голосов
/ 25 февраля 2019

Представление большого графика (> 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 Ответ

0 голосов
/ 25 февраля 2019

Один из способов «контролировать» выбросы - это избавиться от них.Это уменьшит вашу первоначальную проблему, но вы все равно застрянете с большим графиком, который трудно визуализировать.Но давайте разберемся с одной вещью за раз.Во-первых, выбросы.

К сожалению, вы установили начальное значение после того, как вы сгенерировали график.Сначала я перемещу оператор 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)

Original graph

Но что это за выбросы?

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)

Big Component

Теперь «выбросы» исчезли, и мы видим ядро ​​графика.У вас сейчас другая проблема.Трудно взглянуть на 10500 узлов и разобраться в этом, но по крайней мере вы можете увидеть это ядро.Я желаю вам удачи в дальнейшем исследовании.

...