jcp*_*jcp 2 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)
Run Code Online (Sandbox Code Playgroud)
图未定制:
到现在为止还挺好.但是,如果我尝试自定义它:
plot(g1, attrs = list(node = list(fontsize=4, fillcolor = "lightgreen")))
Run Code Online (Sandbox Code Playgroud)
自定义图表
无向边缘被转换.
即使我只使用情节(g1),我也会遇到这个问题.问题是这(保存g1然后使用绘图)似乎改变了图形的外观.
您可以使用highlight参数更改某些属性graphviz.plot,但是,它似乎不允许更改标签大小.你可以在全球范围内设置它,但是这样做会失去控制力.
par(cex=0.05)
graphviz.plot(res, highlight =
list(nodes=nodes(res), fill="lightgreen", col="black"))
Run Code Online (Sandbox Code Playgroud)
如你的问题所示,你可以使用attrsgraphNEL对象的plot方法的参数获得更多控制,但同样存在方向问题.
g <- bnlearn::as.graphNEL(res) # use this to avoid printing of graphviz.plot
plot(g, attrs=list(node = list(fillcolor = "lightgreen", fontsize=4)))
Run Code Online (Sandbox Code Playgroud)
还尝试使用全局设置图形图参数graph.par,但是,当我尝试此操作时,fontsize会更改,但颜色不会呈现
graph.par(list(nodes=list(fill="lightgreen", fontsize=10)))
renderGraph( Rgraphviz::layoutGraph(bnlearn::as.graphNEL(res)))
Run Code Online (Sandbox Code Playgroud)
因此,您可以graphviz.plot使用该函数更改返回的节点nodeRenderInfo:
g1 <- graphviz.plot(res)
graph::nodeRenderInfo(g1) <- list(fill="lightgreen", fontsize=8)
Rgraphviz::renderGraph(g1)
Run Code Online (Sandbox Code Playgroud)
但是,这会在分配时绘制网络graphviz.plot.因此,您可以更改graphNEL对象(返回graphviz.plot).默认情况下,graphNEL对象可以全部定向,也可以全部定向,但您可以手动调整边缘.这是做什么的graphviz.plot.通过查看代码bnlearn:::graphviz.backend,它识别无向边,并使用它们呈现它们graph::edgeRenderInfo(graph.plot).您可以使用类似的方法来执行您想要的操作 - 使用该函数nodeRenderInfo更新节点属性.
所以一起:
# this sets all edges to directed
g <- Rgraphviz::layoutGraph(bnlearn::as.graphNEL(res))
# set undirected edges
u <- names(which(graph::edgeRenderInfo(g)[["direction"]] == "both"))
graph::edgeRenderInfo(g)[["arrowhead"]][u] = "none"
graph::edgeRenderInfo(g)[["arrowtail"]][u] = "none"
# update node attributes: fill colour and label fontsize
graph::nodeRenderInfo(g) <- list(fill="lightgreen", fontsize=8)
# render
Rgraphviz::renderGraph(g)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
625 次 |
| 最近记录: |