如何在R中可视化大型networking?

networking可视化在实践中在科学中变得常见。 但是随着networking规模的不断扩大,常见的可视化技术变得越来越有用。 有太多的节点/顶点和链接/边缘。 往往可视化的努力最终产生“毛球”。

已经提出了一些新的方法来解决这个问题,例如:

  • 边缘捆绑:
    • http://vis.stanford.edu/papers/divided-edge-bundling或
    • https://gephi.org/tag/edge-bundling/
  • 分层边缘捆绑:
    • http://graphics.cs.illinois.edu/sites/graphics.dev.engr.illinois.edu/files/edgebundles.pdf
  • 组属性布局:
    • http://wiki.cytoscape.org/Cytoscape_3/UserManual
    • 如何在igraph中进行分组布局?

我相信还有更多的办法。 因此,我的问题是: 如何克服毛球问题,即如何使用R来可视化大型networking?

以下是一些模拟示例networking的代码:

# Load packages lapply(c("devtools", "sna", "intergraph", "igraph", "network"), install.packages) library(devtools) devtools::install_github(repo="ggally", username="ggobi") lapply(c("sna", "intergraph", "GGally", "igraph", "network"), require, character.only=T) # Set up data set.seed(123) g <- barabasi.game(1000) # Plot data g.plot <- ggnet(g, mode = "fruchtermanreingold") g.plot 

在这里输入图像说明

这个问题是关于可视化GraphViz太大的无向图? 。 然而,在这里我不是在寻找一般的软件build议,而是在具体的例子(使用上面提供的数据)中search哪些技术,通过使用R来帮助大型networking的可视化 (相当于这个线程中的例子: R:Scatterplot with太多点 )。

BioFabric(www.BioFabric.org)使用水平线代替节点来表示非常大的networking的另一种方式。 然后使用垂直线段显示边缘。 这项技术的快速D3演示显示在: http : //www.biofabric.org/gallery/pages/SuperQuickBioFabric.html 。

BioFabric是一个Java应用程序,但是一个简单的R版本可以在: https : //github.com/wjrl/RBioFabric 。

这是一段R代码:

  # You need 'devtools': install.packages("devtools") library(devtools) # you need igraph: install.packages("igraph") library(igraph) # install and load 'RBioFabric' from GitHub install_github('RBioFabric', username='wjrl') library(RBioFabric) # # This is the example provided in the question: # set.seed(123) bfGraph = barabasi.game(1000) # This example has 1000 nodes, just like the provided example, but it # adds 6 edges in each step, making for an interesting shape; play # around with different values. # bfGraph = barabasi.game(1000, m=6, directed=FALSE) # Plot it up! For best results, make the PDF in the same # aspect ratio as the network, though a little extra height # covers the top labels. Given the size of the network, # a PDF width of 100 gives us good resolution. height <- vcount(bfGraph) width <- ecount(bfGraph) aspect <- height / width; plotWidth <- 100.0 plotHeight <- plotWidth * (aspect * 1.2) pdf("myBioFabricOutput.pdf", width=plotWidth, height=plotHeight) bioFabric(bfGraph) dev.off() 

下面是由提问者提供的数据的BioFabric版本的一个镜头,虽然用m> 1的值创build的networking更有趣。 插图详细显示了networking左上angular的特写; 节点BF4是networking中最高级别的节点,默认的布局是从该节点开始的networking的宽度优先search(忽略边缘方向),并且相邻节点按照节点越小的顺序遍历。 请注意,我们可以立即看到,例如,节点BF4的邻居的大约60%是度为1.我们还可以从严格的45度下边缘看到,这个1000个节点的networking具有999个边缘,因此是树。

示例数据的BioFabric演示

充分披露:BioFabric是我写的一个工具。

这是一个有趣的问题,我不知道你列出的大部分工具,所以谢谢。 您可以将HivePlot添加到列表中。 这是一个确定性的方法,包括在固定数量的轴(通常是2或3)上投影节点。 看一个链接页面,有很多视觉例子。

在这里输入图像说明

如果在数据集中有一个分类节点属性,那么它会更好,因此您可以使用它来select节点转到哪个轴。 例如,在学习大学的社交networking时,一方面是学生,另一方面是教师,第三方面是pipe理人员。 当然,它也可以用离散的数字属性(例如,各自的轴上的年轻人,中年人和老年人)来工作。

那么你需要另一个属性,这次必须是数字的(或者至less是有序的)。 它用于确定节点在其轴上的位置。 你也可以使用一些拓扑度量,比如度或传递性(聚类系数)。

如何build立一个hiveplot http://www.hiveplot.net/img/hiveplot-undirected-01.png

该方法是确定性的事实是有趣的,因为它允许比较不同的networking代表不同的(但可比的)系统。 例如,您可以比较两所大学(只要您使用相同的属性/度量来确定坐标轴和位置)。 它还允许通过select不同的属性/度量组合来生成可视化文件,从而以各种方式描述相同的networking。 实际上,这是可视化networking的推荐方式,这得益于所谓的蜂巢面板。

在本文开头提到的页面中列出了一些能够生成这些configuration单元的软件,包括Java和R中的实现。

最近我一直在处理这个问题。 结果,我想出了另一个解决scheme。 按社区/群集折叠graphics。 这种方法类似于上面OP所概述的第三个选项。 作为一个警告的话,这种方法将最好的无向图。 例如:

 library(igraph) set.seed(123) g <- barabasi.game(1000) %>% as.undirected() #Choose your favorite algorithm to find communities. The algorithm below is great for large networks but only works with undirected graphs c_g <- fastgreedy.community(g) #Collapse the graph by communities. This insight is due to this post http://stackoverflow.com/questions/35000554/collapsing-graph-by-clusters-in-igraph/35000823#35000823 res_g <- simplify(contract(g, membership(c_g))) 

这个过程的结果如下图所示,其中顶点的名称代表社区成员资格。

 plot(g, margin = -.5) 

在这里输入图像说明

以上显然比这个可怕的混乱更好

 plot(r_g, margin = -.5) 

在这里输入图像说明

要将社区链接到原始顶点,您需要类似于以下的内容

 mem <- data.frame(vertices = 1:vcount(g), memeber = as.numeric(membership(c_g))) 

海事组织这是一个不错的方法有两个原因。 首先,理论上可以处理任何大小的graphics。 查找社区的过程可以在折叠图上不断重复。 其次,采用交互式方法将产生非常可读的结果。 例如,可以想象用户能够点击折叠graphics中的顶点来展开显示其所有原始顶点的社区。

另一个有趣的包是networkD3 。 在这个图书馆里有很多代表图的手段。 特别是,我发现forceNetwork是一个有趣的选项。 它是互动的,因此可以让你真正探索你的networking。 这对于EDA来说太棒了,但是对于最终的工作来说,它可能太“虚晃”了。