문제

I have a circular layout igraph. I want the vertex label to be displayed outside the circular region. Tried playing around the vertex.label.cex and vertex.label.degree but did not work. Please advice!

도움이 되었습니까?

해결책

vertex.label.degree takes some serious (but straightforward) tweaking to do this. Here's an example from this gist. It's not my code (it's @kieran's, I believe), but it's a fully working example.

### 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

다른 팁

Here's an example of how to rotate the labels around the circle (see this 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)
}

This is a very useful example but it does not solve all of my problems. Look at this small change in the GitHub code:

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

At the top and and the bottom the labels become basically unreadable because they overlap. Any suggestions on how to change the code to fix this issue?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top