濤哥文章系列(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的交互式網絡可視化


分享到:


相關文章: