【问题标题】:R igraph plotting a large graph - thresholding?R igraph 绘制大图 - 阈值?
【发布时间】:2014-12-07 03:00:49
【问题描述】:

我有一个包含 60k 个节点的大图。该图采用距离矩阵 60kX60k 的形式。

所有这些距离都在 0 和 1 之间——它们只是 1——余弦相似度。

我想使用 igraph 绘制此图并使用自动阈值处理,以便大距离节点不会在它们之间形成边。

最好的方法是什么?

我进行了 0.1 的手动阈值处理,并删除了距离大于 0.1 的所有边缘。现在,当我尝试执行此绘图时,我的计算机挂起。理想情况下,我只想指定边数,并希望 igraph 用该边数内最近的节点创建图。

非常感谢..

【问题讨论】:

  • 您需要包含一些代码。您可以使用与您的相似的随机图。此外,绘制具有这么多顶点的图形通常没有帮助,除非您通过对顶点进行聚类或其他方式来简化图形。

标签: r igraph threshold


【解决方案1】:

首先,我是igraph 包的忠实粉丝。这对我来说是救命稻草。

话虽如此,我在rigraph 中绘制大图时遇到了类似的问题。我的解决方案是使用plot.default 而不是plot.igraph 绘制图表。但是,这需要一些额外的工作。另外,如果图形很大并且边列表很长,我会在将igraph 对象转换为可以绘制的矩形数组时尝试使用data.table

以下是可复制的示例代码:

library("tictoc")
library("magrittr")
library("igraph")
library("data.table")

set.seed(42)

# no of nodes
n = 2000
# layout
layout = matrix(rnorm(n * 2L), nrow = n)

# sample graph
g = sample_gnp(n, .05)

# plot.igraph
igraph_plot = function() {
    pdf("plot_igraph.pdf")
    plot(
        g, 
        vertex.label = NA, 
        vertex.size = 1.5, 
        vertex.color = "black",
        edge.color = scales::alpha("grey", .3), 
        layout = layout
    )
    dev.off()
}

# plot.default
base_plot = function() {
    
    pdf("plot_base.pdf")
    
    # get edge-list
    el = as.data.table(as_edgelist(g)) %>%
        setnames(c("x","y"))
    
    # add ids to layout
    d_layout = data.table(
        x_coord = layout[, 1L],
        y_coord = layout[, 2L],
        id      = 1:n
    )
    
    # add coordinates to edgelist endpoints
    el_w_layout = merge(
        el, 
        d_layout, 
        by.x = "x",
        by.y = "id",
        all.x = TRUE
    ) %>%
        setnames(
            c("x_coord", "y_coord"), c("x1", "y1")
        ) %>%
        merge(
            d_layout,
            by.x = "y",
            by.y = "id",
            all.x = TRUE
        ) %>%
        setnames(
            c("x_coord", "y_coord"), c("x2", "y2")
        )
    
    # plot frame plot.default
    plot(
        d_layout$x_coord, 
        d_layout$y_coord, 
        axes = F, 
        type = "n", 
        xlab = NA, 
        ylab = NA
    )
    
    # add edges
    segments(
        x0  = el_w_layout$x1,
        x   = el_w_layout$x2,
        y0  = el_w_layout$y1,
        y   = el_w_layout$y2,
        col = scales::alpha("grey", .3)
    )
    # add vertices
    points(d_layout$x_coord, d_layout$y_coord, pch = 19, cex = .5)
    dev.off()
}

运行这段代码给了我:

tic()
igraph_plot()
toc()
2.002 sec elapsed

tic()
base_plot()
toc()
0.277 sec elapsed

【讨论】:

    猜你喜欢
    • 2014-04-07
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    相关资源
    最近更新 更多