Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Placing vertex.label outside a circular layout in igraph

Tags:

r

igraph

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!

like image 613
Divi Avatar asked Jan 10 '23 18:01

Divi


1 Answers

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

like image 53
hrbrmstr Avatar answered Jan 19 '23 23:01

hrbrmstr