bnlearn + Rgraphviz:自定义绘图时

时间:2017-12-31 05:01:20

标签: r bayesian-networks bnlearn r-graphviz

我正在尝试使用bnlearn自定义使用RGraphviz学习的图表。当我有无向边时,当我尝试自定义图形的外观时,RGraphviz将它们转换为两个方向的有向边。

可重现的例子可能是:

set.seed(1)
x1 = rnorm(50, 0, 1)
x2 = rnorm(50, 0, 1)
x3 = x2 + rnorm(50, 0, 1)
x4 = -2*x1 + x3 + rnorm(50, 0, 1)
graph = data.frame(x1, x2, x3, x4)

library(bnlearn)
library(Rgraphviz)

res = gs(graph)
options(repr.plot.width=3, repr.plot.height=3)
g1 <- graphviz.plot(res)

图表未自定义:

enter image description here

到目前为止一切顺利。但如果我尝试自定义它:

plot(g1, attrs = list(node = list(fontsize=4, fillcolor = "lightgreen")))

自定义图表

enter image description here

改变了无向边缘。

即使我只是使用情节(g1),我也会遇到这个问题。问题是这个(保存g1然后使用绘图)似乎改变了图形的外观。

1 个答案:

答案 0 :(得分:5)

您可以使用highlight的{​​{1}}参数更改某些属性,但是,它似乎不允许更改标签大小。你可以在全局范围内设置它,但是这样就失去了控制权。

graphviz.plot

如你的问题所示,你可以使用par(cex=0.05) graphviz.plot(res, highlight = list(nodes=nodes(res), fill="lightgreen", col="black")) 参数为graphNEL对象的plot方法获得更多控制,但同样存在方向问题。

attrs

还尝试使用g <- bnlearn::as.graphNEL(res) # use this to avoid printing of graphviz.plot plot(g, attrs=list(node = list(fillcolor = "lightgreen", fontsize=4))) 全局设置图表绘图参数,但是,当我尝试此操作时,fontsize会更改,但颜色不会呈现

graph.par

因此,您可以使用函数graph.par(list(nodes=list(fill="lightgreen", fontsize=10))) renderGraph( Rgraphviz::layoutGraph(bnlearn::as.graphNEL(res)))

更改graphviz.plot返回的节点
nodeRenderInfo

但是,这会在分配g1 <- graphviz.plot(res) graph::nodeRenderInfo(g1) <- list(fill="lightgreen", fontsize=8) Rgraphviz::renderGraph(g1) 时绘制网络。因此,您可以更改graphviz.plot对象(由graphNEL返回)。默认情况下,graphviz.plot对象全部是定向的或全部是无向的,但您可以手动调整边缘。这就是graphNEL的作用。通过查看graphviz.plot的代码,它可识别无向边,并使用bnlearn:::graphviz.backend呈现它们。您可以使用类似的方法来执行您想要的操作 - 使用函数graph::edgeRenderInfo(graph.plot)来更新节点属性。

所有在一起:

nodeRenderInfo