提问人:user20650 提问时间:8/22/2017 最后编辑:user20650 更新时间:2/10/2022 访问量:930
在 Rgraphviz 中使用 'pos' 参数来固定节点位置
Use the `pos` argument in Rgraphviz to fix node position
问:
基于这个问题,当一条弧线与另一条弧线重叠时,它会自动弯曲,我正在尝试在绘图中设置属性。pos
RGraphviz
有人可以展示如何正确使用该属性或建议更强大的解决方法吗?谢谢。pos
例
为了与上述链接的问题保持一致,以下示例从网格布局中具有节点的图形开始。bnlearn
library(bnlearn)
library(Rgraphviz)
library(igraph)
# Create graph
adj <- matrix(0L, ncol = 9, nrow = 9, dimnames = list(LETTERS[1:9], LETTERS[1:9]))
adj[upper.tri(adj)] <- 1
e <- empty.graph(LETTERS[1:9])
amat(e) <- adj
g <- as.graphNEL(e)
# layout in grid
ig <- igraph.from.graphNEL(g)
lay <- layout.grid(ig)
lay <- setNames(data.frame(norm_coords(lay, -100, 100, -100, 100)), c("x", "y"))
帮助页面指示应将其设置为?GraphvizAttributes
pos
节点的位置(对于整齐布局,这是节点的初始位置)。使用概念 val,val 指定,其中每个 val 都是一个双精度值。
再往下一点,仅针对属性neato
pin:如果 TRUE 且节点在输入上具有 pos 属性,则 neato 会阻止节点从输入位置移动。此属性的默认值为 FALSE。
我找不到应用这个论点的正确方法。
我尝试过各种方法,但没有成功
# Passed named list with `x` and `y` positions
# To see the `pos` attribute has not been added you can use `AgNode(z)[[1]]`
rownames(lay) <- nodes(e)
pos <- lapply(split(lay, rownames(lay)), unlist)
z <- agopen(g, "gg", nodeAttrs=list(pos=pos,
pin=setNames(rep(TRUE, length(nodes(e))), nodes(e))),
layoutType="neato")
# Passed as a named character string with coordinates pasted together
lay1 <- do.call(paste, c(lay, sep=","))
pos <- paste(lay1, '!') # also tried with `pos = paste(lay)`
names(pos) <- nodes(e)
z <- agopen(g, "gg", nodeAttrs=list(pos=pos,
pin=setNames(rep(TRUE, length(nodes(e))), nodes(e))),
layoutType="neato")
我可以通过这种解决方法获得预期的结果,但它不会很强大。
# write out dot file
z <- agopen(g, "gg")
agwrite(z, "so.dot")
#positions
lay1 <- do.call(paste, c(lay, sep=","))
pos <- paste('pos = "', lay1, '!"')
#read in dot
rd <- readLines("so.dot")
id <- sapply(paste0("label=", nodes(e)) , grep, rd)
#add in positions
for(i in seq(id)) {
rd[id[i]] <- gsub(names(id)[i], paste(names(id)[i], pos[i], sep="\n"), rd[id[i]])
}
# output and render
cat(rd, file="so1.dot", sep="\n")
system("neato so1.dot -n -Tpdf -o so.pdf")
给出预期的结果
答: 暂无答案
评论