2019-06-17用R进行交互式网络可视化

原文见https://www.statworx.com/de/blog/interactive-network-visualization-with-r/

网络无处不在。我们有社会网络如脸书,竞争产品网络或组织内的各种网络。对STARWORX公司来讲,揭示网络背后隐藏的结构和类群是再普通不过的任务了。过去,用Gephi工具把网络分析结果进行可视化。它极致的美丽和交互可视化给人印象深刻,我们的想在R中找到同样高质量的可视化方法,用R shiny app提供给我们的客户。

首先我们想用igraph来可视化网络。这个R包包含一系列的网络分析工具,重点关注高效、便携和易用。我们过去把它用于我们的helfRlein包的getnetwork函数。不幸的是,igraph虽然能创造出优雅的网络可视化效果,但是他们都是静止的。为了构建交互可视化的网络,可以采用R中特定的包,它们都采用java脚本库。

我们最喜欢的可视化任务包是visNetwork,它采用vis.js java脚本库,基于htmlwidgets。它与Shiny、R Markdown文本、RStudio可视化包兼容。visNetwork对个性化你的网络有很多调整,有非常漂亮的输出和良好的操作性。在Shiny输出是这些都是极其重要的。进一步可以在这里(http://datastorm-open.github.io/visNetwork/)找到非常棒的文档。

让我们浏览一下用R Shiny从你的数据直到完美可视化必须要经过的步骤。为此,我们采用Misérables Characters网络为例。这个无向的网络包含Victor Hugo’s 小说 ‚Les Misérables‘中共出现的角色。节点代表人物,节点中间的连线表示在书中同一个章节中两个人物共同出现。每个连线的权重表示人物共同出现的频率。

数据准备

首先安装R报,install.packages("visNetwork"),加载数据lesmis。数据在geomnet包中。

可是化 Les Miserables 人物的网络,visNetwork包需要两个数据框。一个是网络的节点,另一个是网络的边。幸运的是加载的数据都提供了,我们只需要把它们以正确的格式引入。

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")

以下的函数需要特定的名称来命名每一列,以检测到正确的列。为此,连线必须是带有至少一列的数据框,指明了节点的边起始和终止。对于节点,需要最少一个唯一的ID,要与边的起始和终止数据保持一致。

节点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)

这些都是最重要的参数,他们特别为每个节点和边定制。为设定所有的节点或边的形状,如同样的外观或箭头,可以用visNodes和visEdges来指定输出的结果。随后我们也会展示。

另外,我们想在groups内部有更有趣的网络,可以通过随后给网络中的边加入颜色加以强调。因此,我们用Louvain社区检测的方法聚类数据,得到一个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"

可选的输出

当我们创造输出时,进行设计和功能选择,为了给出一个可能的印象,我们为Les Misérables给出两个深层次的展示结果。

visNetwork(nodes, edges)
image.png

用管道函数加上 visNodes, visEdges, visOptions, visLayout 或visIgraphLayout等函数,可以自定义网络。

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 表述了网络中节点和边的整体外观。例如,可以为所有的节点设置形状,为每一条边设定颜色。

用R进行发布,可能导致花很长时间才能得到网络。为解决这个问题,采用visIgraph函数。它减少了绘图时间,同时事先协调运算提供了所有可能的igraph排布。

用visOptions,可以在我们进行交互时,调整网络的应答。例如,在我们点击一个节点时会出现什么。

visLayout可以使得我们定义一个网络的外观。是层次聚类或用特殊的算法改进的排布图。进一步,可以提供一个种子(randomSeed),因此当你加载时,网络看起来都一样。

在自定义网络时,只有几个实例函数。R包提供了更多的可视化选项。更多的内容见(http://datastorm-open.github.io/visNetwork/)。

Shiny整合

为了给客户呈现交互式的结果,我们想把他们整合到Shiny app中。因此准备了离线的数据,保存了节点和边的文件,制定了在线Shiny app内部的输出。这里展示了一个用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结果的截屏。


image.png

结论

除了R中可视化网络的其它包,visNetwork我情有独钟。强大的包能在直接在R中能创造出交互式的网络,并用Shiny进行发布。可以把网络直接整合到Shiny应用中,当用visIgaphLayout函数时进行稳定应用。而不再需要外部软件如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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,849评论 0 5
  • 工欲善其事,必先利其器。总结一下,方便多了。R语言还是很牛逼的,可以干很多事情。有一把顺手的刀还是很重要的。 0....
    Liam_ml阅读 4,615评论 1 60
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,451评论 0 13
  • 說說繁體說說心情。 一開始使用繁體是為了裝逼,當然現在也不能說沒有這個想法,只是更少了吧。 我使用繁體與他人打字聊...
    培阳冰琳阅读 151评论 0 0
  • 一.jQuery特效函数 1.show(duration,callback)显示元素;使用cookie只显示一次....
    当如初见_163a阅读 229评论 0 0