2 min read

plotting pedigree using DiagrammeR and visNetwork packages

DiagrammeR包提供了一个可以直接读取pedigree数据,画图的功能。这个包的问题是,没有一个使用指南,自己摸索起来很麻烦。

从实际测试结果来看,visNetwork包更加有用,有详细的使用指南,可以跟shiny结合,能够在网页上点击,这是我比较感兴趣的。

1.加载DiagrammerR和visNetwork包

rm(list = ls())
require(DiagrammeR)
require(visNetwork)
require(data.table)
require(optiSel)
knitr::opts_knit$set(fig.height=12, fig.width=12)

2.读取系谱数据

ped_1 <-  fread(file="datasets/ped1.csv")
#设置Sire和Dam列中0为NA
ped_1[Sire=="0",Sire:=NA]
ped_1[Dam=="0",Dam:=NA]
#利用optisel包中的系谱处理函数,对系谱进行预处理,如果包括性别,列表头用Sex表示
#addNum=TRUE,生成一个数字化系谱,下边两个包DiagrammeR和visNetwork要求节点从1开始连续编码
ped_1_pre <-  as.data.table(prePed(ped_1,addNum = TRUE))

3.生成节点和边数据

DiagrammeR和visNetwork包需要两种类型数据:节点数据以及edge数据。后者表示节点的走向。

节点数据:id需要连续从1开始编号,label表示该节点的名称。预留一个sex字段,可以据此字段设置雌雄个体不同的形状、颜色等信息。

node_1 <- data.table(id=ped_1_pre$numIndiv,label=ped_1_pre$Indiv,sex=ped_1_pre$Sex)
edge_1_sire <- ped_1_pre[,c("numIndiv","numSire")]
edge_1_dam <- ped_1_pre[,c("numIndiv","numDam")]
setnames(edge_1_sire,c("numIndiv","numSire"),c("from","to"))
setnames(edge_1_dam,c("numIndiv","numDam"),c("from","to"))
edge_1 <- rbind(edge_1_sire,edge_1_dam)
#edge_1中数据来自optiSel包prePed函数生成的数字系谱,其中默认缺失的个体编号为0,需要处理为NA
edge_1[to==0,to:=NA]
#排序
edge_1[order(from)] 
##      from to
##   1:    1 NA
##   2:    1 NA
##   3:    2 NA
##   4:    2 NA
##   5:    3 NA
##  ---        
## 116:   58 56
## 117:   59 54
## 118:   59 55
## 119:   60 59
## 120:   60 58

以下4-6主要是针对DiagrammeR包的操作。

4.生成空的图形

i_graph_1 <-  create_graph()
i_graph_1 %>% is_graph_empty()
## [1] TRUE

5.增加节点数据

i_graph_1 <- i_graph_1 %>% add_nodes_from_table(table = node_1,label_col = label)

6.增加边数据

i_graph_1 <- i_graph_1 %>% add_edges_from_table(table = edge_1,from_col = from,to_col = to,from_to_map = id_external)
## Warning: Prefixing `UQ()` with the rlang namespace is deprecated as of rlang 0.3.0.
## Please use the non-prefixed form or `!!` instead.
## 
##   # Bad:
##   rlang::expr(mean(rlang::UQ(var) * 100))
## 
##   # Ok:
##   rlang::expr(mean(UQ(var) * 100))
## 
##   # Good:
##   rlang::expr(mean(!!var * 100))
## 
## This warning is displayed once per session.

6. 绘图

支持两种图形输出引擎:

第一种采用的是visNetwork。

i_graph_1 %>% render_graph(output = "visNetwork")

第二种graphviz,是默认的输出引擎。

i_graph_1 %>% render_graph(output = "graph")

从上边两张图可以看出,生成的图形,并不符合我们的要求。理想的系谱树,应该是树状的。

因此尝试设定布局参数为tree。

i_graph_1 %>% render_graph(layout = "tree",output = "graph")

但是也存在一个问题,没有找到如何控制输出树状图大小,以及世代间距离的方法。

DiagrammeR的文档还不是很完善。没有一个指南,使用这个包很麻烦。

补充:其实是有一个使用指南的,在这里,描述的很详细。

因此尝试直接利用visNetwork包来作图。

7.直接利用visNetwork包来绘图

visNetwork做出来的图,很炫。是动态的,可以用鼠标来拖动每个节点。

其中有几个参数很重要:

direction表示图形的绘制方向,DU表示从下到上。

sortMethod表示如何排序,directed表示按照from to的方式排序。

levelSeparation 表示不同层间的距离,这个需要手动尝试。如果不设置,图会很小。

visNetwork(node_1,edge_1) %>%  visEdges(arrows = "to")  %>% visHierarchicalLayout(direction = "DU",sortMethod = "directed",levelSeparation = 250, nodeSpacing = 150)

8.visNetwork进阶

8.1 雄性和雌性个体设置不同的形状和颜色

雄雌个体节点形状分别设置为square、dot;颜色分别设置为绿色和红色。

node_1[sex=="male",shape:="square"]
node_1[sex=="female",shape:="dot"]
node_1[sex=="male",color:="#42c58c"]
node_1[sex=="female",color:="#e1409b"]

第一种配色:

visNetwork(node_1,edge_1) %>%  visEdges(arrows = "to")  %>% visHierarchicalLayout(direction = "DU",sortMethod = "directed",levelSeparation = 250, nodeSpacing = 150)

第二种配色:

node_1[sex=="male",color:="#119ecc"]
node_1[sex=="female",color:="#f4b131"]
visNetwork(node_1,edge_1) %>%  visEdges(arrows = "to")  %>% visHierarchicalLayout(direction = "DU",sortMethod = "directed",levelSeparation = 250, nodeSpacing = 150)

第二种配色,不用树状:

node_1[sex=="male",color:="#119ecc"]
node_1[sex=="female",color:="#f4b131"]
node_1[label=="G010D804",color:="red"]
visNetwork(node_1,edge_1) %>%  visEdges(arrows = "to") %>% visOptions(highlightNearest = list(enabled=TRUE,degree=2))

第三种配色:

node_1[sex=="male",color:="green"]
node_1[sex=="female",color:="red"]
visNetwork(node_1,edge_1) %>%  visEdges(arrows = "to")  %>% visHierarchicalLayout(direction = "DU",sortMethod = "directed",levelSeparation = 250, nodeSpacing = 150)

第四种配色:

node_1[sex=="male",color:="#0c8a7a"]
node_1[sex=="female",color:="#ff8d7a"]
visNetwork(node_1,edge_1) %>%  visEdges(arrows = "to")  %>% visHierarchicalLayout(direction = "DU",sortMethod = "directed",levelSeparation = 250, nodeSpacing = 150)

8.2选择展示的节点

visNetwork(node_1,edge_1) %>%  visEdges(arrows = "to")  %>% visOptions(highlightNearest = TRUE, nodesIdSelection = TRUE) %>%visHierarchicalLayout(direction = "DU",sortMethod = "directed",levelSeparation = 250, nodeSpacing = 150)

8.3 选择展示符合特定条件的个体

譬如雌性个体或者雄性个体

visNetwork(node_1,edge_1) %>%  visEdges(arrows = "to")  %>% visOptions(highlightNearest = TRUE, nodesIdSelection = TRUE, selectedBy = "sex") %>% visHierarchicalLayout(direction = "DU",sortMethod = "directed",levelSeparation = 250, nodeSpacing = 150)