如何控制网络布局算法的异常节点?
How to control outlier nodes for network layout algorithms?
使用 igraph
包和 Fruchterman-Reingold 布局算法呈现大图(>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
"control" 异常值的一种方法是摆脱它们。这将减少您最初的问题,但您仍然会被难以可视化的大图所困。但是,让我们一次处理一件事。首先,异常值。
不幸的是,您在生成图形后设置了种子。我将首先移动 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
您的图表有一个非常大的组件和许多小组件。 "outliers" 是小的、断开连接的组件中的节点。我的建议是,如果你想看图表,就去掉这些小组件。只看大组件。
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)
现在 "outliers" 消失了,我们看到了图表的核心。你现在有一个不同的问题。很难看到 10500 个节点并理解它,但至少你可以看到这个核心。祝你好运,进一步探索。
使用 igraph
包和 Fruchterman-Reingold 布局算法呈现大图(>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
"control" 异常值的一种方法是摆脱它们。这将减少您最初的问题,但您仍然会被难以可视化的大图所困。但是,让我们一次处理一件事。首先,异常值。
不幸的是,您在生成图形后设置了种子。我将首先移动 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
您的图表有一个非常大的组件和许多小组件。 "outliers" 是小的、断开连接的组件中的节点。我的建议是,如果你想看图表,就去掉这些小组件。只看大组件。
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)
现在 "outliers" 消失了,我们看到了图表的核心。你现在有一个不同的问题。很难看到 10500 个节点并理解它,但至少你可以看到这个核心。祝你好运,进一步探索。