涛哥文章系列(22):基于R的交互式网络可视化

本文介绍创建交互式网络图的两个关键R包。这些软件包包括:

  • VisNetwork(Almende B.V.、Thieurmel和Robert 2017)。使用vis.js javascript库(http://visjs.org/).)创建交互式网络可视化。
  • networkD3(Allaire等人。(2017年)。从R创建D3 JavaScript网络图。

您将了解如何:

  • 创建经典的交互式网络图
  • 创建交互式桑基图,这对网络流非常有用。
  • 可视化、交互性、分类和回归树

加载演示数据集和R包

我们将使用phone.call2数据[在navdata R包中],该数据是一个列表,其中包含在phone.call数据的@ref(network-visual-essentials)一章中准备的节点和边列表。

首先加载tidyverse R包和phone.call2演示数据集:

注意,navdata包没有了。我的数据从这里下的(https://github.com/kassambara/navdata/blob/master/data/phone.call2.rda),放在工作目录下。

<code>library(tidyverse)
load("phone.call2.rda")

nodes edges /<code>

networkD3 R包

关键功能

可用于轻松创建交互式Sankey图,以及其他网络布局,如树状图、放射状和对角状网络。

关键的R函数和选项

关键R函数:

forceNetwork():创建D3 JavaScript强制定向网络图

<code>forceNetwork(Links, Nodes, Source, Target, 
Value, NodeID, Nodesize, Group)/<code>

关键参数:

  • Links:边缘列表。边ID应从0开始。
  • Nodes:节点列表。节点ID应从0 开始。
  • Source, Target:边数据中的列的名称,分别包含网络源和目标变量。
  • Value:边数据中包含边的权重值的列的名称。用于指示链接的宽度。
  • NodeID:节点数据中包含节点ID的列的名称。用于标记节点。
  • Nodesize:节点数据中的列的名称,其中包含一些用于改变节点半径的值。
  • Group:节点数据中的列的名称,指定每个节点的组。

准备节点和边数据

如上所述,Nodes和Edges列表中的ID应该是从0开始的数值。这可以通过从两个数据框中的现有ID减去1来容易地完成。

1.准备节点和边数据:

<code>nodes_d3 /<code>
涛哥文章系列(22):基于R的交互式网络可视化

<code>edges_d3 /<code>
涛哥文章系列(22):基于R的交互式网络可视化

2.创建交互网络:

<code>library(networkD3)
forceNetwork(
Links = edges_d3, Nodes = nodes_d3,
Source = "from", Target = "to", # so the network is directed.
NodeID = "label", Group = "id", Value = "weight",
opacity = 1, fontSize = 16, zoom = TRUE
)/<code>
涛哥文章系列(22):基于R的交互式网络可视化

请注意,每组都有一种颜色。在这里,当我们指定列“id”作为节点组值时,我们为每个单独的节点指定了不同的颜色。

创建桑基图

您可以创建d3样式的桑基图。桑基图是电话呼叫数据的一个很好的显示。数据中没有太多的节点,因此更容易将电话呼叫的数据流可视化。

创建Sankey图:

<code>sankeyNetwork( 
Links = edges_d3, Nodes = nodes_d3,
Source = "from", Target = "to",
NodeID = "label", Value = "weight",
fontSize = 16, unit = "Letter(s)")/<code>
涛哥文章系列(22):基于R的交互式网络可视化

network3D包中还有其他分层布局,用于可视化树状图形。在下面的示例中,我们首先使用USArrests数据集的示例计算分层聚类:

<code>set.seed(123)
hc % sample_n(15) %>%
scale() %>% dist() %>%
hclust(method = "complete")/<code>

其他网络布局

  • dendroNetwork:
<code>dendroNetwork(hc, fontSize = 15)/<code>

其他备选方案包括:

  • radialNetwork:
<code>radialNetwork( 
as.radialNetwork(hc), fontSize = 15
)/<code>
涛哥文章系列(22):基于R的交互式网络可视化

  • diagonalNetwork:
<code>diagonalNetwork( 
as.radialNetwork(hc), fontSize = 15
)/<code>
涛哥文章系列(22):基于R的交互式网络可视化

VisNetwork R Package

主要功能

  • 创建交互式网络图。
  • 可以根据需要自定义节点和边。
  • 可直接交互地可视化用于以igraph包生成的网络。
  • 可用于可视化使用rpart包生成的递归分区和回归树。
  • 可以将图像和图标用于节点形状。
  • 支持igraph布局

关键R函数和选项

关键R函数

<code>visNetwork(  
nodes = NULL, edges = NULL,
width = NULL, height = NULL,
main = NULL, submain = NULL, footer = NULL
)/<code>

关键参数:

nodes: 节点列表信息. 应至少包含列“id”。有关控制节点的更多选项,请参见visNodes()。数据中还可以包括其他列,例如:

  • “id”:节点的ID,边中需要的信息
  • “label”:节点的标签
  • “group”:节点的组。组可以使用visGroups()来配置。
  • “value”:节点大小
  • “title”:节点的工具提示。

edges:边列表信息。至少需要列“from”和“to”。有关控制边的更多选项,请参见visEdges()。“from”:边开始的节点id

  • “to”:边末端的节点
  • “label” : 边的标签
  • “value”: 节点大小
  • “title”: 节点的工具提示

创建经典网络图

请注意,该函数使用节点列表中的“label”列绘制节点的标签。您可以移动节点,图形将使用一种算法来保持节点的适当间距。还可以放大和缩小打印,并将其四处移动以重新居中。

要始终保持相同的网络,可以使用函数visLayout(randomSeed = 12)

<code>library("visNetwork")
visNetwork(nodes, edges) %>%

visLayout(randomSeed = 12)/<code>
涛哥文章系列(22):基于R的交互式网络可视化

请注意,visNetwork可以使用igraph布局,其中包括大量可能的布局。您可以使用visIgraph()直接可视化图形网络对象。

如果要根据变量控制边缘的宽度,则应在边缘列表数据中包含“width”列。您应该手动计算和缩放边缘宽度。

在下面的R代码中,我们将通过使用igraph布局和更改边缘宽度来自定义visNetwork()输出。首先在边缘列表数据框中添加列宽。将最小宽度设置为1:

<code>edges /<code>

创建具有可变边宽和曲线图布局=“layout_with_fr”的网络图。

<code>visNetwork(nodes, edges) %>%
visIgraphLayout(layout = "layout_with_fr") %>%
visEdges(arrows = "middle") %>%
visLayout(randomSeed = 1234)/<code>
涛哥文章系列(22):基于R的交互式网络可视化

如上所述,您可以可视化使用rpart包生成的分类和回归树。

关键函数:

visTree() [visNetwork版本>=2.0.0]。

例如,要可视化分类树,请键入以下R代码:

<code># Compute
library(rpart)
res # Visualize
visTree(res, main = "Iris classification Tree",
width = "80%", height = "400px")/<code>
涛哥文章系列(22):基于R的交互式网络可视化


分享到:


相關文章: