我有一个60k节点的大图。该图形为距离矩阵60kX60k。
所有这些距离都在0到1之间 - 它们只是1 - 余弦相似度。
我想使用igraph绘制此图形并使用自动阈值处理,以便大距离节点不会在它们之间形成边缘。
最好的方法是什么?
我进行了0.1的手动阈值处理,并移除了距离大于0.1的所有边缘。现在,当我尝试做这个情节时,我的电脑挂了。理想情况下,我只想指定边数,并希望igraph创建具有该边数内最近节点的绘图。
非常感谢..
答案 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