在 igraph 中添加图例以注释差异顶点大小
Add legend in igraph to annotate difference vertices size
我在 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
有什么建议吗?
您应该将 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')
编辑:
不幸的是,计算出正确的子弹尺寸并不容易;一种可能的解决方法是绘制白色子弹,然后以与在 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')
免责声明:此代码严重依赖 plot.igraph 函数的源代码,可能会在 igraph 的未来版本中更改。也许你应该为 igraph 搜索另一个 plot 函数,它本身允许添加图例。
任何看到这个的人如果想要节点大小的连续比例而不是离散比例,那么这就是您需要执行的代码:
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')
我在 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
有什么建议吗?
您应该将 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')
编辑:
不幸的是,计算出正确的子弹尺寸并不容易;一种可能的解决方法是绘制白色子弹,然后以与在 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')
免责声明:此代码严重依赖 plot.igraph 函数的源代码,可能会在 igraph 的未来版本中更改。也许你应该为 igraph 搜索另一个 plot 函数,它本身允许添加图例。
任何看到这个的人如果想要节点大小的连续比例而不是离散比例,那么这就是您需要执行的代码:
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')