我想移动边缘标签的位置,使其不在它的顶部。 这是一个小例子:
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)
在我的例子中,标签位于边缘,我希望它们垂直于边缘移动一点。
答案 0 :(得分:1)
igraph绘图具有用于放置边缘标签的参数edge.label.x
和edge.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)
调整距离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"))