【问题标题】:How to control outlier nodes for network layout algorithms?如何控制网络布局算法的异常节点?
【发布时间】:2019-07-18 09:23:39
【问题描述】:

使用带有 Fruchterman-Reingold 布局算法的 igraph 包呈现大图(> 10000 个节点;> 10000 条边)。一些异常节点会使可视化变得困难,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

【问题讨论】:

    标签: r graph igraph outliers graph-layout


    【解决方案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 个节点很难理解它,但至少你可以看到这个核心。祝您进一步探索顺利。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2020-05-21
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      相关资源
      最近更新 更多