как правильно построить графики igraph, чтобы сделать их сопоставимыми? - PullRequest
1 голос
/ 30 октября 2019

Итак, как и в заголовке, мне нужно уметь составлять графики некоторых графиков и сравнивать их. Для этого я считал, что достаточно передать координаты, а затем построить их. Затем я обнаружил, что графики отображаются в соответствии с указанными координатами, а также в соответствии с количеством узлов (или количеством подсетей или любым другим параметром, который я не могу понять). Чтобы разобраться в проблеме, приведем пример (часть, связанная с евклидовым расстоянием, прокомментирована, поскольку она требует определенного пакета, но я также опубликовал вывод):

library(igraph)
#library(TSdist)

smallNet <- graph(edges=c(1,2), n=2, directed=F) 

V(smallNet)$name <- c("mint", "pepper")

# first try
dev.new()

V(smallNet)$x <- c(10, 23)
V(smallNet)$y <- c(29, 36)

plot(smallNet, vertex.label.color="midnightblue", vertex.size=40, vertex.color="thistle1", layout=layout_nicely)
#print(paste("distance ", EuclideanDistance(V(smallNet)$x, V(smallNet)$y)))
#[1] "distance  23.0217288664427"


# second try
dev.new()

V(smallNet)$x <- c(1400, 1894)
V(smallNet)$y <- c(3700, 4140)

plot(smallNet, vertex.label.color="midnightblue", vertex.size=40, vertex.color="thistle1", layout=layout_nicely)
#print(paste("distance ", EuclideanDistance(V(smallNet)$x, V(smallNet)$y)))
#[1] "distance  3214.73420363177"

# third try
dev.new()

V(smallNet)$x <- c(10000, 26230)
V(smallNet)$y <- c(13800, 32150)

plot(smallNet, vertex.label.color="midnightblue", vertex.size=40, vertex.color="thistle1", layout=layout_nicely)
#print(paste("distance ", EuclideanDistance(V(smallNet)$x, V(smallNet)$y)))
#[1] "distance  7034.65706342534"

Дело в том, что(евклидовы) расстояния различны, но, если я посмотрю на графики, ничего очевидно не изменится. С другой стороны, что-то должно отличаться, так как расстояние до узла увеличивается.

Я заметил, что добавление нескольких узлов улучшает визуализацию, но все же я считаю, что получаемые графики не так или иначе, соблюдая фактические расстояния. Вот еще один пример кода с большим количеством узлов:

# first try
evenBigger <- graph(edges=c(1,2, 2,3, 3,1, 4,5), n=5, directed=F) 

V(evenBigger)$name <- c("pear", "mango", "blueberry", "coconut", "fig")

dev.new()

V(evenBigger)$x <- c(0, 25, 50, 70, 60)
V(evenBigger)$y <- c(0, 80, 20, 120, 40)

plot(evenBigger, vertex.label.color="midnightblue", vertex.size=40, vertex.color="thistle1", layout=layout_nicely)

# second try
evenBigger <- graph(edges=c(1,2, 2,3, 3,1, 4,5, 6,6), n=6, directed=F) 

V(evenBigger)$name <- c("pear", "mango", "blueberry", "coconut", "fig", "jujube")

dev.new()

V(evenBigger)$x <- c(0, 25, 50, 70, 120, 2000)
V(evenBigger)$y <- c(0, 80, 20, 120, 140, 2000)

plot(evenBigger, vertex.label.color="midnightblue", vertex.size=40, vertex.color="thistle1", layout=layout_nicely)

похоже, что в этих двух новых примерах что-то изменяется, поскольку узел jujube теперь далеко,по сравнению с другими узлами. Сопоставимы ли теперь две сети с графической точки зрения? Если нет (что, я считаю, имеет место) ... что я должен сделать, чтобы сделать их сопоставимыми?

Я попытался установить xlim и ylim, как упомянуто здесь , но это выглядитвроде бы не работает:

# first try
evenBigger <- graph(edges=c(1,2, 2,3, 3,1, 4,5), n=5, directed=F) 

V(evenBigger)$name <- c("pear", "mango", "blueberry", "coconut", "fig")

dev.new()

V(evenBigger)$x <- c(0, 25, 50, 70, 60)
V(evenBigger)$y <- c(0, 80, 20, 120, 40)

plot(evenBigger, vertex.label.color="midnightblue", vertex.size=40, vertex.color="thistle1", xlim=c(0, 2500), ylim=c(0, 2500), layout=layout_nicely)

# second try
evenBigger <- graph(edges=c(1,2, 2,3, 3,1, 4,5, 6,6), n=6, directed=F) 

V(evenBigger)$name <- c("pear", "mango", "blueberry", "coconut", "fig", "jujube")

dev.new()

V(evenBigger)$x <- c(0, 25, 50, 70, 120, 2000)
V(evenBigger)$y <- c(0, 80, 20, 120, 140, 2000)

plot(evenBigger, vertex.label.color="midnightblue", vertex.size=40, vertex.color="thistle1", xlim=c(0, 2500), ylim=c(0, 2500), layout=layout_nicely)

Предложения очень приветствуются!

1 Ответ

1 голос
/ 30 октября 2019

Графическое построение делает некоторое изменение масштаба, которое приводит к неинтуитивному выводу. Вы можете увидеть это, повернув оси. Здесь я сделаю это для вашей "второй попытки"

### Second try
V(smallNet)$x <- c(1400, 1894)
V(smallNet)$y <- c(3700, 4140)
plot(smallNet, vertex.label.color="midnightblue", 
    vertex.color="thistle1", layout=layout_nicely,
    axes=TRUE, main="Second Try")

Second try with axes

Обратите внимание, что даже если вы поместили точки в (x, y) =(1400, 3700) и (1894, 4140), они нанесены на графики в (-1, -1) и (1,1). igraph автоматически изменяет значения x и y в интервале [-1,1]. Вы можете включить это с помощью параметра rescale. Однако это требует других изменений. Даже если вы отключите масштабирование, igraph предполагает, что интервал печати равен [-1,1] для x и y. Вам нужно изменить xlim и ylim. Кроме того, размер узла указан в единицах на графике и должен быть пропорционален диапазону данных. Я поместил все это в:

par(mfrow=c(1,3))

# first try
V(smallNet)$x <- c(10, 23)
V(smallNet)$y <- c(29, 36)
plot(smallNet, vertex.label.color="midnightblue", 
    vertex.size=8*diff(range(V(smallNet)$x)), 
    vertex.color="thistle1", layout=layout_nicely, 
    xlim=range( V(smallNet)$x), ylim=range( V(smallNet)$y),
    rescale=FALSE, axes=TRUE, main="First Try")

# second try
V(smallNet)$x <- c(1400, 1894)
V(smallNet)$y <- c(3700, 4140)
plot(smallNet, vertex.label.color="midnightblue", 
    vertex.size=8*diff(range(V(smallNet)$x)), 
    vertex.color="thistle1", layout=layout_nicely,
    xlim=range( V(smallNet)$x), ylim=range( V(smallNet)$y),
    rescale=FALSE, axes=TRUE, main="Second Try")

# third try
V(smallNet)$x <- c(10000, 26230)
V(smallNet)$y <- c(13800, 32150)
plot(smallNet, vertex.label.color="midnightblue", 
    vertex.size=8*diff(range(V(smallNet)$x)), 
    vertex.color="thistle1", layout=layout_nicely, 
    xlim=range( V(smallNet)$x), ylim=range( V(smallNet)$y),
    rescale=FALSE, axes=TRUE, main="Third Try")

All three graphs without rescaling

Теперь вы можете видеть, что, хотя форма похожа, они находятся в разных масштабах.

...