visNetwork shinyApp
本次會用到的三個關于網絡的R包:visNetwork,igraph, geomnet;其中前兩個R包均已經詳細介紹過:
- igraph:
- visNetwork:
- geomnet是一個基于ggplot2的網絡可視化包,這兒只是使用geomnet中自帶的數據
#構建網絡節點和邊數據
rm(list = ls())
# Libraries ---------------------------------------------------------------
library(visNetwork)
#devtools::install_github("cran/geomnet")
library(geomnet)
library(igraph)
library(dplyr)
# 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
head(nodes)
id label
1 Myriel Myriel
2 Napoleon Napoleon
3 MlleBaptistine MlleBaptistine
4 MmeMagloire MmeMagloire
5 CountessDeLo CountessDeLo
6 Geborand Geborand
#Edges
edges <- as.data.frame(lesmis[1])
colnames(edges) <- c("from", "to", "width")
head(edges)
from to width
1 Myriel Napoleon 1
2 Myriel MlleBaptistine 8
3 Myriel MmeMagloire 10
4 MlleBaptistine MmeMagloire 6
5 Myriel CountessDeLo 1
6 Myriel Geborand 1
#使用社群檢測方法(Louvain )對網絡進行分析,獲取每個節點所屬組
#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"
#保存網絡節點和邊的數據;
- 后面shiny程序會調用
save(nodes, file = "nodes.RData")
save(edges, file = "edges.RData")
#結果查看:
- visNetwork
visNetwork(nodes, edges)
visNetwork-visNetwork()
- visIgraph: igraph包函數,使用graph對象作圖
- 輕松實現圖算法
- 快速處理具有數百萬頂點和邊的大型圖
- 允許通過R等高級語言進行快速設計模型。
visIgraph(graph)
visIgraph
#添加一些自定義操作
- visNodes:全局節點屬性設置
- visEdges:全局邊屬性設置
- visOptions:當與網絡互動時,網絡的反應。例如,如果單擊一個節點會發生什么,出現提示等。
- visLayout:定義網絡的外觀。例如層次化的。此外,我們可以提供一個種子(random Seed),保證網絡可重復生成。
- visIgraphLayout:使用igraph布局來計算坐標和快速響應數據變化。
#Shiny 整合
##global.R:
library(shiny)
library(visNetwork)
##server.R:
server <- shinyServer(function(input, output) {
output$network <- renderVisNetwork({
load("nodes.RData")
load("edges.RData")
visNetwork(nodes, edges) %>%
visIgraphLayout() %>%
visOptions(nodesIdSelection = TRUE, selectedBy = "group")
})
})
##ui.R:
ui <- shinyUI(
fluidPage(
visNetworkOutput("network")
)
)
##運行shiny
shinyApp(ui = ui, server = server)
visNetwork shinyApp
#原文:
Interactive Network Visualization with R
系列文章:
R語言進行網絡分析的基礎包 igraph
networkD3 繪制動態網絡
網絡-visNetwork包繪制炫酷的動態網絡圖