原文見https://www.statworx.com/de/blog/interactive-network-visualization-with-r/
網(wǎng)絡無處不在篷帅。我們有社會網(wǎng)絡如臉書革半,競爭產(chǎn)品網(wǎng)絡或組織內(nèi)的各種網(wǎng)絡。對STARWORX公司來講宵距,揭示網(wǎng)絡背后隱藏的結(jié)構(gòu)和類群是再普通不過的任務了然低。過去,用Gephi工具把網(wǎng)絡分析結(jié)果進行可視化椭蹄。它極致的美麗和交互可視化給人印象深刻,我們的想在R中找到同樣高質(zhì)量的可視化方法搁骑,用R shiny app提供給我們的客戶。
首先我們想用igraph來可視化網(wǎng)絡。這個R包包含一系列的網(wǎng)絡分析工具,重點關(guān)注高效、便攜和易用系馆。我們過去把它用于我們的helfRlein包的getnetwork函數(shù)。不幸的是顽照,igraph雖然能創(chuàng)造出優(yōu)雅的網(wǎng)絡可視化效果由蘑,但是他們都是靜止的尼酿。為了構(gòu)建交互可視化的網(wǎng)絡裳擎,可以采用R中特定的包,它們都采用java腳本庫惶我。
我們最喜歡的可視化任務包是visNetwork,它采用vis.js java腳本庫,基于htmlwidgets黎做。它與Shiny蒸殿、R Markdown文本、RStudio可視化包兼容爬骤。visNetwork對個性化你的網(wǎng)絡有很多調(diào)整霞玄,有非常漂亮的輸出和良好的操作性惰爬。在Shiny輸出是這些都是極其重要的撕瞧。進一步可以在這里(http://datastorm-open.github.io/visNetwork/)找到非常棒的文檔。
讓我們?yōu)g覽一下用R Shiny從你的數(shù)據(jù)直到完美可視化必須要經(jīng)過的步驟。為此寇漫,我們采用Misérables Characters網(wǎng)絡為例州胳。這個無向的網(wǎng)絡包含Victor Hugo’s 小說 ?Les Misérables‘中共出現(xiàn)的角色。節(jié)點代表人物瓤湘,節(jié)點中間的連線表示在書中同一個章節(jié)中兩個人物共同出現(xiàn)弛说。每個連線的權(quán)重表示人物共同出現(xiàn)的頻率。
數(shù)據(jù)準備
首先安裝R報冀偶,install.packages("visNetwork")稠曼,加載數(shù)據(jù)lesmis蒲列。數(shù)據(jù)在geomnet包中侥猩。
可是化 Les Miserables 人物的網(wǎng)絡,visNetwork包需要兩個數(shù)據(jù)框划提。一個是網(wǎng)絡的節(jié)點,另一個是網(wǎng)絡的邊伊履。幸運的是加載的數(shù)據(jù)都提供了,我們只需要把它們以正確的格式引入哄辣。
rm(list = ls())
# Libraries ---------------------------------------------------------------
library(visNetwork)
library(geomnet)
library(igraph)
# Data Preparation --------------------------------------------------------
#Load dataset
data(lesmis)
#Nodes
nodes <- as.data.frame(lesmis[2])
colnames(nodes) <- c("id", "label")
#id has to be the same like from and to columns in edges
nodes$id <- nodes$label
#Edges
edges <- as.data.frame(lesmis[1])
colnames(edges) <- c("from", "to", "width")
以下的函數(shù)需要特定的名稱來命名每一列,以檢測到正確的列睛廊。為此,連線必須是帶有至少一列的數(shù)據(jù)框,指明了節(jié)點的邊起始和終止救军。對于節(jié)點财异,需要最少一個唯一的ID,要與邊的起始和終止數(shù)據(jù)保持一致唱遭。
節(jié)點Nodes:
·label: A column that defines how a node is labelled
·value: Defines the size of a node inside the network
·group: Assigns a node to a group; this can be a result of a cluster analysis or a community detection
·shape: Defines how a node is presented. For example as a circle, square or triangle
·color: Defines the color of a node
·title: Sets the tooltip, which occurs when you hover over a node (this can be HTML or character)
·shadow: Defines if a node has a shadow or not (TRUE/FALSE)
邊Edges:
·label, title, shadow
·length, width: Defines the length/width of an edge inside the network
·arrows: Defines where to set a possible arrow on the edge
·dashes: Defines if the edges should be dashed or not (TRUE/FALSE)
·smooth: Smooth lines (TRUE/FALSE)
這些都是最重要的參數(shù)戳寸,他們特別為每個節(jié)點和邊定制。為設(shè)定所有的節(jié)點或邊的形狀拷泽,如同樣的外觀或箭頭疫鹊,可以用visNodes和visEdges來指定輸出的結(jié)果。隨后我們也會展示司致。
另外拆吆,我們想在groups內(nèi)部有更有趣的網(wǎng)絡,可以通過隨后給網(wǎng)絡中的邊加入顏色加以強調(diào)脂矫。因此枣耀,我們用Louvain社區(qū)檢測的方法聚類數(shù)據(jù),得到一個group的列庭再。
#Create graph for Louvain
graph <- graph_from_data_frame(edges, directed = FALSE)
#Louvain Comunity Detection
cluster <- cluster_louvain(graph)
cluster_df <- data.frame(as.list(membership(cluster)))
cluster_df <- as.data.frame(t(cluster_df))
cluster_df$label <- rownames(cluster_df)
#Create group column
nodes <- left_join(nodes, cluster_df, by = "label")
colnames(nodes)[3] <- "group"
可選的輸出
當我們創(chuàng)造輸出時捞奕,進行設(shè)計和功能選擇,為了給出一個可能的印象佩微,我們?yōu)長es Misérables給出兩個深層次的展示結(jié)果缝彬。
visNetwork(nodes, edges)
用管道函數(shù)加上 visNodes, visEdges, visOptions, visLayout 或visIgraphLayout等函數(shù),可以自定義網(wǎng)絡哺眯。
visNetwork(nodes, edges, width = "100%") %>%
visIgraphLayout() %>%
visNodes(
shape = "dot",
color = list(
background = "#0085AF",
border = "#013848",
highlight = "#FF8000"
),
shadow = list(enabled = TRUE, size = 10)
) %>%
visEdges(
shadow = FALSE,
color = list(color = "#0085AF", highlight = "#C62F4B")
) %>%
visOptions(highlightNearest = list(enabled = T, degree = 1, hover = T),
selectedBy = "group") %>%
visLayout(randomSeed = 11)
visNodes 和 visEdges 表述了網(wǎng)絡中節(jié)點和邊的整體外觀谷浅。例如,可以為所有的節(jié)點設(shè)置形狀奶卓,為每一條邊設(shè)定顏色一疯。
用R進行發(fā)布,可能導致花很長時間才能得到網(wǎng)絡夺姑。為解決這個問題墩邀,采用visIgraph函數(shù)。它減少了繪圖時間盏浙,同時事先協(xié)調(diào)運算提供了所有可能的igraph排布眉睹。
用visOptions,可以在我們進行交互時废膘,調(diào)整網(wǎng)絡的應答竹海。例如,在我們點擊一個節(jié)點時會出現(xiàn)什么丐黄。
visLayout可以使得我們定義一個網(wǎng)絡的外觀斋配。是層次聚類或用特殊的算法改進的排布圖。進一步,可以提供一個種子(randomSeed)艰争,因此當你加載時坏瞄,網(wǎng)絡看起來都一樣。
在自定義網(wǎng)絡時甩卓,只有幾個實例函數(shù)鸠匀。R包提供了更多的可視化選項。更多的內(nèi)容見(http://datastorm-open.github.io/visNetwork/)猛频。
Shiny整合
為了給客戶呈現(xiàn)交互式的結(jié)果狮崩,我們想把他們整合到Shiny app中。因此準備了離線的數(shù)據(jù)鹿寻,保存了節(jié)點和邊的文件睦柴,制定了在線Shiny app內(nèi)部的輸出。這里展示了一個用Shiny的一小段代碼毡熏。
global.R:
library(shiny)
library(visNetwork)
server.R:
shinyServer(function(input, output) {
output$network <- renderVisNetwork({
load("nodes.RData")
load("edges.RData")
visNetwork(nodes, edges) %>%
visIgraphLayout()
})
})
ui.R:
shinyUI(
fluidPage(
visNetworkOutput("network")
)
)
以下展示了Shiny app結(jié)果的截屏坦敌。
結(jié)論
除了R中可視化網(wǎng)絡的其它包,visNetwork我情有獨鐘痢法。強大的包能在直接在R中能創(chuàng)造出交互式的網(wǎng)絡狱窘,并用Shiny進行發(fā)布〔聘椋可以把網(wǎng)絡直接整合到Shiny應用中蘸炸,當用visIgaphLayout函數(shù)時進行穩(wěn)定應用。而不再需要外部軟件如Gephi等尖奔。
參考文獻
Knuth, D. E. (1993) ?Les miserables: coappearance network of characters in the novel les miserables“, The Stanford GraphBase: A Platform for Combinatorial Computing, Addison-Wesley, Reading, MA