Добавьте легенду в igraph, чтобы комментировать размер вершин разностей

r legend igraph

5191 просмотра

2 ответа

158 Репутация автора

У меня есть график 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')

но закончите легендой без символов, смотрите пример

Любые предложения, как я об этом?

Автор: itamar kanter Источник Размещён: 19.07.2016 06:54

Ответы (2)


7 плюса

49181 Репутация автора

Решение

Вы должны установить 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, которая изначально позволяет добавить легенду.

Автор: digEmAll Размещён: 19.07.2016 07:34

1 плюс

463 Репутация автора

Любой, кто смотрит на это, кто хочет непрерывного масштабирования для размеров узла вместо дискретного масштабирования, вот код, который вам нужен для этого:

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

введите описание изображения здесь

Автор: unknown Размещён: 15.11.2017 01:37
Вопросы из категории :
32x32