Используйте аргумент `pos` в Rgraphviz, чтобы исправить положение узла

Основываясь на этом вопросе. Автоматически изгибая дугу, когда она перекрывается с другой, я пытаюсь установить 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 должен быть установлен как

Положение узла (для разметки neato это начальная позиция узла). Указывается с использованием понятия 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")

Чтобы дать ожидаемый результат

0 ответов

Другие вопросы по тегам