【问题标题】:how to properly plot igraph's graphs to make them comparable?如何正确绘制 igraph 的图表以使其具有可比性?
【发布时间】:2019-10-30 13:30:40
【问题描述】:

所以,正如标题所示,我需要能够绘制一些 igraph 的图表并能够比较它们。为此,我相信传递坐标然后绘制它们就足够了。然后我发现这些图是根据提供的坐标呈现的,但也根据节点的数量(或子网的数量或我无法理解的任何其他参数)呈现。为了理解这个问题,这里举个例子(与欧几里得距离相关的部分被注释了,因为它需要一个特定的包,但我也发布了输出):

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"

关键是(欧几里得)距离是不同的,但是,如果我查看这些图,显然没有任何变化。另一方面,something 肯定是不同的,因为节点的距离在增加。

我注意到添加几个节点可以提高可视化效果,但我仍然相信我得到的图并没有以某种方式尊重实际距离。这是另一个包含更多节点的示例代码:

# 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 节点离得很远。从图形的角度来看,现在这两个网络是否具有可比性?如果不是(我相信是这样)...我应该怎么做才能使它们具有可比性?

我尝试按照here 的说明设置 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)

非常欢迎提出建议!

【问题讨论】:

    标签: r plot igraph


    【解决方案1】:

    igraph 绘图会进行一些重新缩放,从而导致这种非直观的输出。您可以通过打开轴来看到这一点。在这里,我将为您的“第二次尝试”这样做

    ### 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")
    

    请注意,即使您将点放置在 (x,y) = (1400,3700) 和 (1894, 4140) 处,它们也会绘制在 (-1,-1) 和 (1,1) 处。 igraph 自动将 x 和 y 重新缩放到区间 [-1,1]。您可以使用rescale 参数来关闭它。但是,这样做需要进行其他更改。即使您关闭重新缩放,igraph 也会假定 x 和 y 的绘图间隔为 [-1,1]。您需要更改 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")
    

    现在您可以看到,即使形状相似,它们的比例也不同。

    【讨论】:

    • 它有效,谢谢。只是一个简单的问题:我明白你的意思是说节点的大小应该根据情节进行缩放,但你为什么要将大小乘以 8?我相信是你选择的东西,与任何具体的东西无关……我说的对吗?
    • 正确。我选择了 8 倍的范围,因为它看起来不错。
    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多