我使用add_trace()函數在中爲循環在plotly的scatter3d模式下爲3d網絡圖創建線。每個add_trace在網絡中的兩個節點之間繪製一條單獨的線。該方法正在工作,但有大量的循環,單個循環的速度似乎正在很快放緩。在for循環中優化add_trace()?
示例數據可以在這裏下載:https://gist.github.com/pravj/9168fe52823c1702a07b
library(igraph)
library(plotly)
G <- read.graph("karate.gml", format = c("gml"))
L <- layout.circle(G)
vs <- V(G)
es <- as.data.frame(get.edgelist(G))
Nv <- length(vs)
Ne <- length(es[1]$V1)
Xn <- L[,1]
Yn <- L[,2]
network <- plot_ly(type = "scatter3d", x = Xn, y = Yn, z = rep(0, Ne), mode = "markers", text = vs$label, hoverinfo = "text", showlegend = F)
for(i in 1:Ne) {
v0 <- es[i,]$V1
v1 <- es[i,]$V2
x0 <- Xn[v0]
y0 <- Yn[v0]
x1 <- Xn[v1]
y1 <- Yn[v1]
df <- data.frame(x = c(x0, x1), y = c(y0, y1), z = c(0, 0))
network <- add_trace(network, data = df, x = x, y = y, z = z, type = "scatter3d", mode = "lines", showlegend = F,
marker = list(color = '#030303'), line = list(width = 0.5))
}
這個例子是相當快的,但是當我有幾百邊緣或更多,各個迴路的執行開始從根本上減緩。我嘗試了不同的優化方法(向量化等),但似乎沒有圍繞add_trace函數本身的緩慢工作。
有什麼建議嗎?
謝謝@dww - 偉大的解決方案! –
@GaborSzalai,你的歡迎。作爲未來的指針,如果你將問題簡化爲一個簡單的例子,你可以幫助人們更有效地回答問題。 'igraph'與這個問題無關,所以最好只提供一些數據(就像我上面所做的那樣)以及重現問題所需的最少量的代碼。看看[這](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)一些很棒的提示 – dww