Визуализация iGraph и выравнивание надписей - PullRequest
0 голосов
/ 29 июня 2018

код

library(igraph)

g <- graph.tree(n = 2 ^ 3 - 1, children = 2)
node_labels <- c("", "Group A", "Group B", "(1)Text", "(2)I am a longer text", "(3)I am a long long long text", "(4)X")
lay = layout.reingold.tilford(g)  

plot(g,
     vertex.size = 4,                  # node size
     vertex.color = '#C4D8E2',          # node color
     vertex.label = node_labels,        # node labels
     vertex.label.dist = 5,             # node label size
     vertex.label.font = 2,             # node label type (bold)
     vertex.label.degree=0.0,
     margin=c(0,0,0,0),
     layout=-lay[, 2:1]
)

дает мне график с метками. Как выровнять метки 1 .. 4, чтобы они были выровнены по левому краю, прямо рядом с кругом, а не по центру? № 3 не является правильным с моей точки зрения. Переключение на ggraph было бы альтернативой, но здесь вращение меток не сработало.

enter image description here

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Вот код с расчетом:

library(igraph)

g <- graph.tree(n = 2 ^ 3 - 1, children = 2)
node_labels <- c("", "Group A", "Group B", "(1)Text", "(2)I am a longer text", "(3)I am a long long long text", "(4)X")
lay = layout.reingold.tilford(g)  

t1 <- sapply(as.vector( node_labels), FUN = strwidth,units='in')
t2 <- (t1 - min(t1))/ (max(t1) - min(t1))*3+0.9


plot(g,
     vertex.size = 4,                  # node size
     vertex.color = '#C4D8E2',          # node color
     vertex.label = node_labels,        # node labels
     vertex.label.dist = t2,             # node label size
     vertex.label.font = 2,             # node label type (bold)
     vertex.label.degree=0.0,
     margin=c(0,0,0,0),
     layout=-lay[, 2:1]
)

Это немного лучше, но я не могу сделать это идеально.

0 голосов
/ 29 июня 2018

Если вы можете вручную изменить расстояние для каждой метки, как показано ниже -

plot(g,
     vertex.size = 4,                  
     vertex.color = '#C4D8E2',          
     vertex.label = node_labels,        
     vertex.label.dist = c(0,0,0,0,8,12,0), # vector of distance
     vertex.label.font = 2,            
     vertex.label.degree=0.0,
     margin=c(0,0,0,0),
     layout=-lay[, 2:1]
)

Или вы можете захотеть создать функцию для получения этой длины из каждой вершины. Это я оставляю вам на импровизацию.

t1 <- sapply(node_labels, FUN = nchar)
t2 <- (t1 - min(t1))/ (max(t1) - min(t1))
t2 <- t2*12


plot(g,
     vertex.size = 4,                  
     vertex.color = '#C4D8E2',          
     vertex.label = node_labels,        
     vertex.label.dist = t2, # vector of distance
     vertex.label.font = 2,            
     vertex.label.degree=0.0,
     margin=c(0,0,0,0),
     layout=-lay[, 2:1]
)
...