r - bnlearn + Rgraphviz : double arrows instead of undirected edges when customizing plots

标签 r bayesian-networks bnlearn

我正在尝试自定义使用 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

无向边被变换。

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

最佳答案

您可以使用 highlight 更改某些属性。 graphviz.plot 的论据,但是,它似乎不允许更改标签大小。您可以全局设置它,但这样做会失去控制。

par(cex=0.05)
graphviz.plot(res, highlight = 
                list(nodes=nodes(res), fill="lightgreen", col="black"))

如您的问题所示,您可以使用 attrs 获得更多控制权。 graphNEL 对象的 plot 方法的参数,但同样存在方向问题。
g <- bnlearn::as.graphNEL(res) # use this to avoid printing of graphviz.plot
plot(g,  attrs=list(node = list(fillcolor = "lightgreen", fontsize=4)))

还尝试使用 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更新节点属性。

所以大家一起:
# 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)

关于r - bnlearn + Rgraphviz : double arrows instead of undirected edges when customizing plots,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48040143/

相关文章:

r - 在 R 中拆分图形网络字符串

r - 获取对角线对称位置的最大值

r - 从 R 中的时间序列数据制作 3D 表面

google-app-engine - 使用 Google Go 的协程创建贝叶斯网络

java - 使用Java实现贝叶斯推理

python - 将任何函数从 R 包导入到 python 中

r - 如何计算堆叠条形图中的百分比?

Rstudio 速度慢得令人痛苦

python - 我应该使用直方图或其他一些高级数学工具(例如贝叶斯网络)进行 Material 分类/识别吗?

R bnlearn eval 内部函数