在igraph中添加图例以注释差异顶点大小

时间:2016-07-19 06:54:36

标签: r legend igraph

我在igraph中有一个图表,其顶点大小是为值编码的 我希望添加一个带有不同大小的符号(在我的情况下为点)的图例。 我尝试了以下代码

require(igraph)
er_graph <- erdos.renyi.game(100, 5/100)
value<-runif(100)
n<-6
size_vec<-seq_len(n)
sizeCut<-cut(value,n)
vertex.size<-size_vec[sizeCut]
plot(er_graph, vertex.label=NA, vertex.size=vertex.size)
legend('topleft',legend=levels(sizeCut),pt.cex=size_vec,col='black')

但以没有符号的图例结束 see example

任何消息我怎么回事?

2 个答案:

答案 0 :(得分:7)

您应该将pch设置为某个值以指示要用于项目符号的字符(请参阅?points以检查可能的值)。
此外,您应缩放pt.cex值,以使子弹对于图例不会太大,并使用pt.bg设置项目符号的背景颜色,例如

# scaled between 1 and 2
scaled <- 1 + ((2-1) * (size_vec - min(size_vec) ) / (  max(size_vec) - min(size_vec) ) )
legend('topleft',legend=levels(sizeCut),pt.cex=scaled,col='black',pch=21, pt.bg='orange')

enter image description here

编辑:

不幸的是,计算正确尺寸的子弹并不容易;一个可能的解决方法是绘制白色项目符号,然后手动将顶点添加到图例中,就像在plot.igraph函数中绘制它们一样:

# N.B. /200 is taken from plot.igraph source code
a <- legend('topleft',legend=levels(sizeCut),pt.cex=size_vec/200,col='white',
            pch=21, pt.bg='white')
x <- (a$text$x + a$rect$left) / 2
y <- a$text$y
symbols(x,y,circles=size_vec/200,inches=FALSE,add=TRUE,bg='orange')

enter image description here

免责声明:此代码严重依赖于plot.igraph函数的源代码,该函数可能会在未来版本的igraph中更改。可能你应该搜索igraph的另一个绘图函数,它本身允许添加一个图例。

答案 1 :(得分:1)

任何想要连续缩放节点大小而不是离散比例的人都需要这样做,这就是你需要做的代码:

require(igraph)
er_graph <- erdos.renyi.game(100, 5/100)
value<-runif(100)
sizeCut<- c(0.2,0.4,0.6,0.8,1.0)
sizeCutScale <- sizeCut*10
vertex.size<-value*10
plot(er_graph, vertex.label=NA, vertex.size=vertex.size)
legend('topleft',legend=unique(sizeCut),pt.cex= sizeCutScale,col='black')
a <- legend('topleft',legend=unique(sizeCut),pt.cex=sizeCutScale/200,col='white',
            pch=21, pt.bg='white')
x <- (a$text$x + a$rect$left) / 2
y <- a$text$y
symbols(x,y,circles=sizeCutScale/200,inches=FALSE,add=TRUE,bg='orange')

enter image description here