2019-06-17用R進行交互式網(wǎng)絡可視化

原文見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)
image.png

用管道函數(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)
image.png

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é)果的截屏坦敌。


image.png

結(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搭儒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子提茁,更是在濱河造成了極大的恐慌淹禾,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茴扁,死亡現(xiàn)場離奇詭異铃岔,居然都是意外死亡,警方通過查閱死者的電腦和手機峭火,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門毁习,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卖丸,你說我怎么就攤上這事蜓洪。” “怎么了坯苹?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摇天。 經(jīng)常有香客問我粹湃,道長恐仑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任为鳄,我火速辦了婚禮裳仆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘孤钦。我一直安慰自己歧斟,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布偏形。 她就那樣靜靜地躺著静袖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俊扭。 梳的紋絲不亂的頭發(fā)上队橙,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音萨惑,去河邊找鬼捐康。 笑死,一個胖子當著我的面吹牛庸蔼,可吹牛的內(nèi)容都是我干的解总。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼姐仅,長吁一口氣:“原來是場噩夢啊……” “哼花枫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起萍嬉,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤乌昔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后壤追,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磕道,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年行冰,在試婚紗的時候發(fā)現(xiàn)自己被綠了溺蕉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡悼做,死狀恐怖疯特,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肛走,我是刑警寧澤漓雅,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響邻吞,放射性物質(zhì)發(fā)生泄漏组题。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一抱冷、第九天 我趴在偏房一處隱蔽的房頂上張望崔列。 院中可真熱鬧,春花似錦旺遮、人聲如沸赵讯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽边翼。三九已至,卻和暖如春跷敬,著一層夾襖步出監(jiān)牢的瞬間讯私,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工西傀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斤寇,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓拥褂,卻偏偏與公主長得像娘锁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子饺鹃,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • feisky云計算莫秆、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,815評論 0 5
  • 工欲善其事,必先利其器悔详∧魇海總結(jié)一下,方便多了茄螃。R語言還是很牛逼的缝驳,可以干很多事情。有一把順手的刀還是很重要的归苍。 0....
    Liam_ml閱讀 4,605評論 1 60
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,446評論 0 13
  • 說說繁體說說心情用狱。 一開始使用繁體是為了裝逼,當然現(xiàn)在也不能說沒有這個想法拼弃,只是更少了吧夏伊。 我使用繁體與他人打字聊...
    培陽冰琳閱讀 146評論 0 0
  • 一.jQuery特效函數(shù) 1.show(duration,callback)顯示元素;使用cookie只顯示一次....
    當如初見_163a閱讀 227評論 0 0