使用Graphviz在R中具有不同颜色的graphnode

Posted

技术标签:

【中文标题】使用Graphviz在R中具有不同颜色的graphnode【英文标题】:graphnode with different colors in R using Graphviz 【发布时间】:2017-10-24 23:27:30 【问题描述】:

我正在使用 R 语言研究生物网络。对于可视化,我使用 Graphviz。我可以使用此示例代码为特定节点着色:

source("https://bioconductor.org/biocLite.R")
library(KEGGgraph)
library("KEGG.db")
tmp <- tempfile()

pName <- "MAPK signaling pathway"

pId <- mget(pName, KEGGPATHNAME2ID)[[1]]

x<-retrieveKGML(pId, organism = "hsa", destfile = tmp, method = "wget",quiet =TRUE)

mapkKGML <- system.file("extdata/hsa04010.xml", package = "KEGGgraph")

mapkG <- parseKGML2Graph(mapkKGML,expandGenes=TRUE)
anz <- nodes(mapkG)[c(1:5,11:25,41:45)]
mapkGsub <- subGraph( anz, mapkG)

library(Rgraphviz)
outs <- sapply(edges(mapkGsub), length) >0
ins <- sapply(inEdges(mapkGsub), length)>0
ios <- outs|ins


if(require(org.Hs.eg.db))
   ioGeneID <- translateKEGG2GeneID(names(ios))
   nodesNames <- sapply(mget(ioGeneID, org.Hs.egSYMBOL, ifnotfound = NA), "[[",1)
else
  nodesNames <- names(ios)


names(nodesNames) <- names(ios)

atri                <- getDefaultAttrs()
atri$node$shape     <- "ellipse"
atri$node$label     <- nodesNames
atri$edge$weight    <- "0.3"
atri$edge$minlen    <- "2"
atri$graph$rankdir  <- "LR"
atri$graph$size
atri$graph$nodesep  <- "0.05"
atri$graph$ranksep  <- "0.2"
atri$edge$arrowsize <- "0.4"
atri$node$fontsize  <- "18"
atri$node$height    <- "2"
atri$node$width     <- "3.5"

noAttrs <- list()
noAttrs$label <- nodesNames
noAttrs$label
ncolor <- c("green", "blue")
names(ncolor) = nodes(mapkGsub)[1:2]
noAttrs$fillcolor <- ncolor

png(filename="170524_MAPK_Pathway_FS.png")
 plot(mapkGsub,nodeAttrs=noAttrs,attrs=atri)
dev.off()

结果如下:MAPK Pathway Example 现在我想用两种不同的颜色为每个节点着色。我尝试使用属性 colorList 来自 Graphviz http://www.graphviz.org/content/attrs#kcolorList 但它对我不起作用。 将填充颜色更改为'green;0.5:red' 并设置atri$node$style &lt;- "filled" atri$node$gradientangle &lt;- 0 会引发此错误

Fehler in polygon(x.theta, y.theta, density = NA, border = fg, col = bg,  : 
ungültiger Farbname in 'green;0.5:red'

有没有人用 R 和 Graphviz 属性来解释我多色节点的用法?

【问题讨论】:

【参考方案1】:

graphviz 图形的所有方面都取决于 .dot 文件中的内容。这是一个具有多种颜色的 .dot 文件的示例

strict graph  
graph [outputorder=edgesfirst];
"1_1_1"  [color=red,shape=point,];
"2_1_67"     [color=blue,shape=point,];
"1_1_1" -- "2_1_67"  [color=black,len=1]; 

这里是一些 Python 代码的 sn-p 可以用来生成这个文件 - 在这个代码中,我有一个节点列表和一个边列表,我在这些节点中存储了特定的数据确定它们的颜色以及其他一些东西应该是什么

import networkx as nx
g=nx.Graph()
for node in nodes:
    splitnode=node.split("_")
    if splitnode[0]=="2":
        g.add_node(node,color='blue',shape='point',width=.1)
    if splitnode[0]=="1":
        g.add_node(node,color='red',shape='point',width=.1)
for edge in edges:
    if labels:
        g.add_edge(edge[0],edge[1],len=edge[2],color='black',label=str(edge[2]))
    else:
        g.add_edge(edge[0],edge[1],len=edge[2],color='black')
nx.drawing.nx_agraph.write_dot(g,'tmp.dot')

如果您使用neato -Tpng &lt;input&gt; -O 渲染上面的点文件,它将生成一个看起来像This 的图像。

我了解您正在使用 R 而不是 python,很抱歉我不了解 R 并且无法更有效地回答您的问题。要点是您需要以某种方式获取 .dot 文件中节点定义中节点的颜色。

【讨论】:

谢谢,但我必须让我的问题更清楚。我想用两种不同的颜色为 1 个节点着色,比如左半部分节点是绿色的,另一半是红色的。来自 Graphviz 网站的描述说属性 colorList 接受每个节点的多种颜色,就像我的帖子中一样。

以上是关于使用Graphviz在R中具有不同颜色的graphnode的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化:在曲线的不同区域位置添加不同的阴影区域并自定义不同阴影区域的颜色(Filling in the area under a line graph)

如何在 scikit-learn 的随机森林的 graphviz-graph 中找到一个类?

NetworkX graphviz_layout 不工作?

doxygen+graphviz轻松绘制函数调用图(call graph)

doxygen+graphviz轻松绘制函数调用图(call graph)

根据 R 中的值绘制条件颜色 [重复]