使用R包networkD3绘制炫酷的动态关系网络
引言
在數據可視化領域,關系網絡數據的可視化一直是一個受到廣泛關注的話題。
我們經常會看到這樣的復雜網絡關系圖。
?
也會經常看到一些影視作品的人物關系圖,例如:
?
我們可以從圖中清晰地了解到不同人物之間的關系,但是這樣靜態的圖片無法滿足我們的一些深層次需求,比如:
如何快速找到一個人物(節點)?
能否單擊某個節點,只顯示該節點及其相鄰節點?
能否點擊一個節點彈出該節點相應的描述?
這些功能是靜態的網絡圖無法實現的,它通常需要引入JavaScript,來實現交互功能。
如果我們不懂JavaScript,應該怎么辦呢?
別擔心,有句話說“總有一個R包能幫助你解決問題”,使用networkD3包,可以輕松幫助你實現繪制炫酷動態網絡的夢想。
networkD3包基于D3.JS(最流行的可視化庫之一)構建,還可以和R中常見的網絡可視化包例如network、igraph等連用,支持管道操作符%>%(dplyr中常用,讀者可自行學習)和ggplot2語法,是一個非常靈活的網絡可視化包,包的作者在Stackoverflow上也非常活躍,經常會解答一些使用者提出的問題。
下面我們一起來學習一下吧~
實例操作
包的準備
#安裝并加載包
install.packages('networkD3')
library('networkD3')
數據的準備
網絡的基本元素是邊和節點,在人物關系圖中,人物就是節點,而他們之間的關系(朋友、家人)就是邊。
通常我們需要提供兩個數據集,節點數據集和邊數據集,因為節點數據集可以從邊數據集中獲取,所以至少我們需要一個邊數據集,現在讓我們創建一個。
#起點
src
#終點
target
#創建邊數據集
networkData
現在我們創建了一個邊數據集networkData,如下圖所示。
我們可以利用這個數據,生成一個最簡單的動態網絡。
繪制簡單網絡
simpleNetwork(networkData)
生成結果如下圖所示:
?
我們可以看到,使用simplenetwork已經可以生成一個最基本的動態網絡圖,還可以通過修改其中的一些參數,來修改節點、邊的顏色、透明度、節點之間的距離、字體字號等等,但如果我們有更深次的需求,比如將不同節點分組,并用不同的顏色表示;或者用邊的粗細來表示關系的親疏;或者我們文章開篇說的交互式的體驗,比如,搜索一個節點,或者點擊某節點出現描述,我們就需要使用networkD3包的另一個函數forceNetwork。
復雜網絡定制
我們將首先使用networkD3自帶的數據集為大家說明一下forceNetwork的基本語法。首先,我們導入數據
#邊數據集
data(MisLinks)
#節點數據集
data(MisNodes)
我們分別看一下這兩個數據集的結構。點數據集MisNodes,共包含三列,節點名稱,節點分組,節點大小(重要性、集中度)。
邊數據集MisLinks,共包含三列,依次是起點、終點、邊的粗細(大小、權重)。
我們需要注意的是,在邊數據集里,我們用節點的ID來代替節點本身,networkD3包是從0開始編號的,因此邊數據集的第一條(1,0)對應到節點數據集則是(Napoleon,Myriel)。
在繪圖前,我們應當先將數據整理成上述形式,然后將數據集傳入到forceNetwork中。
以下的參數是必須提供的:
forceNetwork(
#邊數據集
Links = MisLinks,
# 節點數據集
Nodes = Misnodes,
#邊數據集中起點對應的列
Source = "source",
# 邊數據集中終點對應的列
Target = "target",
# 邊數據集中邊的寬度對應的列
Value = "value",
# 節點數據集中節點名稱對應的列
NodeID = "name",
# 節點數據集中節點分組對應的列
Group = "group",
)
上述代碼運行后,我們得到一張關系圖:
?
為了更好滿足我們的定制需求,forceNetwork還提供了其他的一些參數供我們修改,我們可以有選擇地把這些參數加入forceNetwork()里,=后面的內容大家都可以根據自己的需要進行修改,達到最滿意的視覺效果。
下面給出一些參數的示例:
# 圖寬度
width = 1200
# 圖高度
height = 500
# 圖是否允許縮放
zoom = T
# 圖是否有邊界
bounded=T
# 圖是否顯示圖例
legend=T
# 鼠標沒有停留時其他節點名稱的透明度
opacityNoHover = 1
# 所有節點初始透明度
opacity = 1
# 節點斥力大小(負值越大斥力越大)
charge=-50
# 節點顏色,可以建立不同分組和顏色的一一映射關系
ColourScale
.domain(["A", "B"])
.range(["#FF6900", "#694489"]);'
# 節點比例大小
Nodesize = "size"
# 節點絕對大小
radiusCalculation = JS(" d.nodesize")
# 節點名稱的字體
fontFamily = "黑體"
# 節點名稱的字號
fontSize = 16
# 邊是否顯示箭頭
arrows = F
# 邊顏色,Cols可以是一個預先設置的列表
linkColour = Cols
# 鼠標點擊事件
clickAction = clickJS
加入這些參數后,我們可以說是“為所欲為”了。
networkD3最大的亮點,在于clickAction = clickJS這一句,你可以設置自己的鼠標點擊事件,比如節點放大,彈出對話框,點擊節點顯示節點描述,加入搜索框等等。
這些事件都是用JavaScript語言寫的,如果你對此一無所知也不用擔心,你可以先在別人的代碼基礎上進行修改,如果有興趣的話再進一步深入。
案例展示
下面展示一個用networkD3包繪制的動態網絡關系圖。
基本的界面:
?
搜索節點:
?
在圖的右上角顯示節點描述:
?
networkD3包生成的結果將是一個html文件,即網頁文件(當然你也可以把它保存成靜態圖片的格式),這個文件里已經包括了數據,你只要將這個文件發給別人,別人就可以看到你繪制好的圖了。如果你有一個個人網站,將網頁上傳到網站,就可以建立一個炫酷的網絡可視化展示界面啦。
將網絡數據可視化的最終目的是為了向他人更清晰地呈現數據本身,而networkD3包用最簡單的幾行代碼幫我們實現了這個目的,這么有趣又實用的工具,不想一起探索一下嗎?
參考文獻
Package ‘networkD3’, https://cran.r-project.org/web/packages/networkD3/networkD3.pdf
CUSTOM NETWORK CHART | NETWORKD3, https://www.r-graph-gallery.com/253-custom-network-chart-networkd3/
Network visualization with R, http://kateto.net/network-visualization
Introduction to Network Analysis with R, https://www.jessesadler.com/post/network-analysis-with-r/
▼歡迎關注《統計咨詢》公眾號▼
- 發表于:?2018-03-26
- 原文鏈接:http://kuaibao.qq.com/s/20180323B0AM3P00?refer=cp_1026
總結
以上是生活随笔為你收集整理的使用R包networkD3绘制炫酷的动态关系网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 周杰伦歌词预测 #博学谷IT学习技术支持
- 下一篇: 机房环境监控系统机房守护者!