我正在尝试使用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)
图表未自定义:
到目前为止一切顺利。但如果我尝试自定义它:
plot(g1, attrs = list(node = list(fontsize=4, fillcolor = "lightgreen")))
自定义图表
改变了无向边缘。
即使我只是使用情节(g1),我也会遇到这个问题。问题是这个(保存g1然后使用绘图)似乎改变了图形的外观。
答案 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