本次会用到的三个关于网络的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)
- visIgraph: igraph包函数,使用graph对象作图
- 轻松实现图算法
- 快速处理具有数百万顶点和边的大型图
- 允许通过R等高级语言进行快速设计模型。
visIgraph(graph)
#添加一些自定义操作
- 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)
#原文:
Interactive Network Visualization with R
系列文章:
R语言进行网络分析的基础包 igraph
networkD3 绘制动态网络
网络-visNetwork包绘制炫酷的动态网络图