R igraph绘制一个大图 - 阈值?

时间:2014-12-07 03:00:49

标签: r igraph threshold

我有一个60k节点的大图。该图形为距离矩阵60kX60k。

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

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

最好的方法是什么?

我进行了0.1的手动阈值处理,并移除了距离大于0.1的所有边缘。现在,当我尝试做这个情节时,我的电脑挂了。理想情况下,我只想指定边数,并希望igraph创建具有该边数内最近节点的绘图。

非常感谢..

1 个答案:

答案 0 :(得分:0)

首先,我是igraph软件包的忠实拥护者。对我来说,这是一个救命稻草。

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

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

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