如何在igraph中分离边缘标签和边缘?

时间:2014-04-14 01:20:45

标签: r label igraph graph-theory

我想移动边缘标签的位置,使其不在它的顶部。 这是一个小例子:

 g <- graph.empty(n=3) 
 g <- graph(c(1,2,3,2,1,3), directed=T)
 E(g)$weight <- c(3,2,5) 
 plot(g, edge.label = E(g)$weight)

在我的例子中,标签位于边缘,我希望它们垂直于边缘移动一点。

3 个答案:

答案 0 :(得分:1)

igraph绘图具有用于放置边缘标签的参数edge.label.xedge.label.y,但是必须在进行绘图时使用的坐标中指定这些参数。为了获得正确的坐标,您需要自己控制布局。 @GaborCsardi在他的评论中建议了类似的内容,但是实现起来非常复杂,我认为它应该得到完整的答案。

## Setup - your example graph
library(igraph)
g <- graph.empty(n=3) 
g <- graph(c(1,2,3,2,1,3), directed=T)
E(g)$weight <- c(3,2,5) 

现在,我们不仅仅是绘制图形,而是捕获顶点的布局,以便可以使用它。我设置了可重复性的随机种子。

set.seed(1234)
LO = layout_nicely(g)

布局为我们可用于绘制的顶点给出了x-y坐标。 我们想要使用这些位置来计算将在其中写入边缘标签的位置。我们将首先计算边缘的中心,然后调整垂直于边缘的位置。一个要点:如果一条边几乎是水平的,则垂直线的斜率几乎是无限的,因此垂直位移的计算可能会引起问题。我们将对此进行测试并回避该问题。

## Start with the centers of the edges (on line)
ELx = rep(0, ecount(g))
ELy = rep(0, ecount(g))
for(i in 1:ecount(g)) {
    ELx[i] = (LO[ends(g,i)[1],1] + LO[ends(g,i)[2],1])/2
    ELy[i] = (LO[ends(g,i)[1],2] + LO[ends(g,i)[2],2])/2 }

## Adjust perpendicular to line
d = 0.03
for(i in 1:ecount(g)) {
    if(abs(LO[ends(g,i)[1],2] - LO[ends(g,i)[2],2]) < 0.1) {
        ## This avoids problems with horizontal edges
        ELy[i] = ELy[i] + shift 
    } else {
        S = (LO[ends(g,i)[2],1] - LO[ends(g,i)[1],1]) / 
            (LO[ends(g,i)[1],2] - LO[ends(g,i)[2],2])
        shift = d / sqrt(1 + S^2)
        ELx[i] = ELx[i] + shift
        ELy[i] = ELy[i] + S*shift
    }
}

现在,我们可以绘制并指定边缘标签的更好位置。默认情况下,对igraph对象的绘制会将x和y轴的布局重新调整为[-1,1]范围。如果发生这种情况,布局中的值将不再对应于图形上的位置。因此,我们将使用rescale=FALSE。但是igraph still 想要绘制在[-1,1]范围内,因此我们还必须设置xlim和ylim。

plot(g, layout=LO, edge.label = E(g)$weight,
    rescale=FALSE, xlim=range(LO[,1]), ylim=range(LO[,2]), 
    edge.label.x=ELx, edge.label.y=ELy)

Graph with shifted edge labels

调整距离d = 0.03在某种程度上是任意的。我选择它以使此图看起来不错。如果您有更复杂的图形,则可能需要调整该距离。

答案 1 :(得分:0)

很抱歉成为这样的人:“如何使用library(x)?”

我的代码使用ggraph吗?

library(igraph)
library(ggraph)

g <- graph.empty(n=3) 
g <- graph(c(1,2,3,2,1,3), directed=T)
E(g)$weight <- c(3,2,5) 

#your plot
plot(g, edge.label = E(g)$weight)


#using ggraph
ggraph(graph = g) +
  geom_node_circle(size = 1, mapping = aes(r =0.03), fill="goldenrod") +
  geom_edge_link(mapping = aes (label = weight),
                 arrow = arrow(type = "closed", angle = 15), 
                 end_cap = circle(8, 'mm'), , 
                 start_cap = circle(8, 'mm'), 
                 colour="grey",
                 label_dodge  = unit(5, "mm"),
                 angle_calc = "along") +
  geom_node_text(mapping = aes(label = "2")) +
  theme_graph()

答案 2 :(得分:0)

您可以通过添加返回字符垂直移动边缘标签。您可以通过添加空格来水平移动它们。例如,

plot(g, edge.label = c(" 3","2\n","5\n"))