1 min read

Rgraphviz 学习笔记

graphviz (Graph Visualization Software)是贝尔实验室鼓捣出来的一个用来展示结构化信息的软件。有一个对应的Rgraphviz包,学习一下,这是一个用来画系谱图的好工具。

Rgraphviz包现在已经被收录到Bioconductor平台,不在cran中,因此正常的安装包的流程无法获取该包。需要根据Bioconductor的安装指令进行安装:

source("https://bioconductor.org/biocLite.R")
biocLite("Rgraphviz")

1. Graphviz的简单说明

这个软件包可以生成各种图像格式的文件,以及SVG文件,可以用于web网络展示;也可以生成PDF文件。

graphviz 中国包括了很多布局器:

  • dot 默认的布局方式,主要是用于有向图。(画系谱,这应该是一个主要布局方式)
  • neato 基于spring-model(又称force-based)算法
  • twopi 径向布局
  • circo 圆环布局
  • fdp 无向图

graphviz默认使用一种dot语言来定义图形元素,然后选择上边的布局算法进行布局,最后生成结果。

大体步骤如下: 1. 利用dot脚本,定义一个图,然后向图中,添加节点和边。 2. 定义节点和边各自的属性,比如形状、颜色、填充模式、字体等。 2. 使用布局引擎,调用布局算法,绘制图形。

graphviz中三个基本的元素:图(graph)、节点(node)和边(edge) 参考一篇blog,关于graphviz的入门说明。

2. 初窥Graphviz

knitr::opts_chunk$set(echo = TRUE,fig.align = "center")
suppressPackageStartupMessages(require(Rgraphviz))
set.seed(123)
v <- letters[1:10] #储存节点
m <- 1:4 #
g1 <- randomGraph(v,m,0.2)

不同的布局样式,默认是有向图。

plot(g1)
<U+9ED8><U+8BA4><U+7684><U+6709><U+5411><U+56FE>(dot)

Figure 1: <U+9ED8><U+8BA4><U+7684><U+6709><U+5411><U+56FE>(dot)

第二种布局:neato

plot(g1, "neato" )
<U+7B2C><U+4E8C><U+79CD><U+5E03><U+5C40>(neato)

Figure 2: <U+7B2C><U+4E8C><U+79CD><U+5E03><U+5C40>(neato)

第三种布局,twopi:

plot(g1, "twopi" )
<U+7B2C><U+4E09><U+79CD><U+5E03><U+5C40>(twopi)

Figure 3: <U+7B2C><U+4E09><U+79CD><U+5E03><U+5C40>(twopi)

3. 从头开始画一个图

#定义节点
nodes <- c("A","B","C","D","E","F","G")
#生成一个简单的系谱图
rEG <- new("graphNEL",nodes=nodes,edgemode="directed")
rEG <- addEdge(from="A",to = "B",graph = rEG,weights = 1)
rEG <- addEdge(from="A",to = "C",graph = rEG,weights = 2)
rEG <- addEdge(from="B",to = "D",graph = rEG,weights = 3)
rEG <- addEdge(from="B",to = "E",graph = rEG,weights = 10)
rEG <- addEdge(from="C",to = "F",graph = rEG,weights = 3)
rEG <- addEdge(from="C",to = "G",graph = rEG,weights = 10)
#从上望下画
plot(rEG,attrs=list(graph=list(rankdir="TB")))  #TB from top to bottom
<U+6700><U+7B80><U+5355><U+7684><U+56FE>

Figure 4: <U+6700><U+7B80><U+5355><U+7684><U+56FE>

从下往上画,更符合系谱图的惯例

plot(rEG,attrs=list(graph=list(rankdir="BT"))) #BT from bottom to top

4. 调整节点的颜色

plot(rEG,attrs=list(node=list(color="deepskyblue4",fontcolor="orange",fillcolor="deepskyblue4"),graph=list(rankdir="BT"))) #BT from bottom to top

5. 调整节点的形状

plot(rEG,attrs=list(node=list(shape="ellipse",color="deepskyblue4",fontcolor="orange",fillcolor="deepskyblue4"),graph=list(rankdir="BT"))) #BT from bottom to top

6. 调整边的颜色

plot(rEG,attrs=list(node=list(color="deepskyblue4",fontcolor="orange",fillcolor="deepskyblue4"),edge=list(color="deepskyblue4"),graph=list(rankdir="BT"))) #BT from bottom to top