在igraph中,如何将顶点标签放置在圆形布局之外

4

我有一个环形的 igraph 布局。我想要顶点标签显示在圆形区域外面。尝试了调整 vertex.label.cexvertex.label.degree,但没有起作用。请给予建议!

3个回答

8

vertex.label.degree需要进行一些严肃(但直接)的调整才能实现此目的。这里有一个来自这个代码片段的例子。虽然不是我的代码(我相信是@kieran的),但它是一个完全可用的示例。

### Here's one way to do it.

library(igraph)
library(ggplot2)
library(scales)

## The igraph docs say that vertex.label.degree controls the position
## of the labels with respect to the vertices. It's interpreted as a
## radian, like this:
##
## Value is : Label appears ... the node
## -pi/2: above
## 0: to the right of
## pi/2: below
## pi: to the left of
##
## We can generalize this. vertex.label.degree can take a vector as
## well as a scalar for its argument. So we write a function to 
## calculate the right position for a label based on its vertex's location
## on the circle.

## Get the labels aligned consistently around the edge of the circle
## for any n of nodes.
## This code borrows bits of ggplot2's polar_coord function
## start = offset from 12 o'clock in radians
## direction = 1 for clockwise; -1 for anti-clockwise.

radian.rescale <- function(x, start=0, direction=1) {
  c.rotate <- function(x) (x + start) %% (2 * pi) * direction
  c.rotate(scales::rescale(x, c(0, 2 * pi), range(x)))
}

### Example
## Generate some fake data
n <- 15
g <- erdos.renyi.game(n, 0.5)
## Obviously labeling in this way this only makes sense for graphs
## laid out as a circle to begin with
la <- layout.circle(g)

lab.locs <- radian.rescale(x=1:n, direction=-1, start=0)
plot(g, layout=la, vertex.size=2, vertex.label.dist=1,
     vertex.label.degree=lab.locs)

enter image description here


1
这是一个关于如何沿着圆形旋转标签的示例(请参见此gist):
## One way to rotate text labels.

library(igraph)

### Example
## Generate some fake data
n <- 75
g <- erdos.renyi.game(n, 0.5)
V(g)$name = paste("long_name", 1:n, sep="_")
## Obviously labeling in this way this only makes sense for graphs
## laid out as a circle to begin with
la <- layout.circle(g)

par(mar=c(8,6,6,6))
plot(g, layout=la, vertex.size=2, vertex.label="")

## Apply labels manually
#Specify x and y coordinates of labels, adjust outward as desired
x = la[,1]*1.3
y = la[,2]*1.3

#create vector of angles for text based on number of nodes 
# (flipping the orientation of the words half way around so none appear 
# upside down)
angle = ifelse(atan(-(la[,1]/la[,2]))*(180/pi) < 0,  
   90 + atan(- (la[,1]/la[,2]))*(180/pi), 270 + atan(-la[,1]/la[,2])*(180/pi))

#Apply the text labels with a loop with angle as srt
for (i in 1:length(x)) {
    text(x=x[i], y=y[i], labels=V(g)$name[i], adj=NULL, 
    pos=NULL, cex=.7, col="black", srt=angle[i], xpd=T)
}

0
这是一个非常有用的例子,但它并不能解决我所有的问题。看一下这个在GitHub代码中的小改动:
### Here's one way to do it.

library(igraph)
library(ggplot2)

## The igraph docs say that vertex.label.degree controls the position
## of the labels with respect to the vertices. It's interpreted as a
## radian, like this:
##
## Value is : Label appears ... the node
## -pi/2: above
## 0: to the right of
## pi/2: below
## pi: to the left of
##
## We can generalize this. vertex.label.degree can take a vector as
## well as a scalar for its argument. So we write a function to 
## calculate the right position for a label based on its vertex's location
## on the circle.

## Get the labels aligned consistently around the edge of the circle
## for any n of nodes.
## This code borrows bits of ggplot2's polar_coord function
## start = offset from 12 o'clock in radians
## direction = 1 for clockwise; -1 for anti-clockwise.

radian.rescale <- function(x, start=0, direction=1) {
    c.rotate <- function(x) (x + start) %% (2 * pi) * direction
    c.rotate(scales::rescale(x, c(0, 2 * pi), range(x)))
}

### Example
## Generate some fake data
n <- 75
g <- erdos.renyi.game(n, 0.5)
V(g)$name = "long_name"
## Obviously labeling in this way this only makes sense for graphs
## laid out as a circle to begin with
la <- layout.circle(g)

lab.locs <- radian.rescale(x=1:n, direction=-1, start=0)
plot(g, layout=la, vertex.size=2, vertex.label.dist=1,
    vertex.label.degree=lab.locs)

在顶部和底部,标签基本上变得无法阅读,因为它们重叠在一起。有什么建议可以更改代码以解决此问题吗?


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