可视化 iGraph 和标签对齐

3

代码

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,使它们左对齐,紧挨着圆圈而不是居中对齐?从我的角度来看,No 3是正确的。切换到ggraph可能是一种选择,但在这里旋转标签并没有起作用。

enter image description here

2个回答

1
这里是带有计算的代码:
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

如果您可以手动更改每个标签的距离,如下所示 -

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]
)

嗨,Vikash,我将采用这个函数,但我认为这将取决于所使用的字体。我必须找到一些东西来确定字符串的长度。 - xyx
真的,这取决于字体。字体将全局应用于所有标签。您可以考虑使用我提供的替代解决方案,其中我计算字符并使用它来获取距离向量。您可以通过增加t215或减少t26来更改乘法-> t2*12。希望这有所帮助! - Vikash Kumar
这真的很奇怪。我无法让它工作。我试图计算字符串的宽度,但它并不完美。 - xyx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接