簡體   English   中英

在R中繪制大量的線條

[英]Plotting huge number of lines in R

我編寫了一個代碼,根據不同的條件在不同顏色的圖形中繪制近100000行。 代碼如下。

for(i in c(160000:260000)){
  if(data[i,]$Char1 == 'A' & data[i,]$Char2 == 'S'){
    if(data[i,]$Q1 < data[i,]$Q2){
      lines(c(i,i),c(data[i,]$P + 2,data[i,]$P + 22),col="green")
    }else{
      lines(c(i,i),c(data[i,]$P - 2,data[i,]$P - 22),col="green")
    }
  }
  if(data[i,]$Char1 == "B" & data[i,]$Char2 == 'S'){
    lines(c(i,i),c(data[i,]$P + 2,data[i,]$P + 22),col='blue')
  }
}

我之前繪制了一張普通圖。 這是

plot(data$P,type="l")

我運行代碼並持續超過2-3小時,它一直運行直到我停止它。 有沒有辦法輕松地用更少的時間完成這項任務?

您可以通過不實際顯示繪圖來節省一些計算時間。 運行

library(scales)
n <- 100000
m <- 20

system.time({
  plot(0, 0, type = 'n', xlim = c(0, 10), ylim = c(0, 10), xlab = '', ylab = '')
  for (i in 1:n) lines(sort(runif(m, max = 10)), sort(runif(m, max = 10)), 
                       col = ifelse(i %% 10 == 0, 'red', alpha('lightblue', 0.1)), 
                       lwd = 0.2)
})

system.time({
  png('plot.png')
  plot(0, 0, type = 'n', xlim = c(0, 10), ylim = c(0, 10), xlab = '', ylab = '')
  for (i in 1:n) lines(sort(runif(m, max = 10)), sort(runif(m, max = 10)), 
                       col = ifelse(i %% 10 == 0, 'red', alpha('lightblue', 0.1)), 
                       lwd = 0.2)
  dev.off()
})

  user  system elapsed 
44.415   0.704  45.435 

  user  system elapsed 
23.115   0.294  23.585 

在我的機器上。 結果

更新

使用CathG的答案會在繪制線條時大幅縮短計算時間:

n <- 100000
data <- data.frame(x0 = runif(n), y0 = runif(n), x1 = runif(n), 
                   y1 = runif(n), col = 1:10)

system.time({
  png('plot.png', 640, 640)
  plot(0, 0, type = 'n', xlab = '', ylab = '', xlim = c(0, 1), ylim = c(0, 1))
  for (i in 1:n) lines(data[i, c(1, 3)], data[i, c(2, 4)], col = data$col, 
                       lwd = 0.1)
  dev.off()
})

system.time({
  png('plot.png', 640, 640)
  plot(0, 0, type = 'n', xlab = '', ylab = '', xlim = c(0, 1), ylim = c(0, 1))
  segments(data$x0, data$y0, data$x1, data$y1, col = data$col, lwd = 0.1)
  dev.off()
})

   user  system elapsed 
119.682   0.822 121.525 

 user  system elapsed 
2.267   0.020   2.303 

我認為你應該首先計算不同的xy (和color ),然后在一次調用中用segments繪制它們,我還認為你應該使用png直接繪制它們,而不是在窗口設備中:

data2 <- data[160000:260000, ]

data2$x0 <- data2$x1 <- 160000:260000

cond1 <- (data2$Char1=="A") & (data2$Char2 == "S") & (data2$Q1 < data2$Q2)
cond2 <- (data2$Char1=="A") & (data2$Char2 == "S") & (data2$Q1 >= data2$Q2)
cond3 <- (data2$Char1=="B") & (data2$Char2 == "S")

data2$y0[cond1] <- data2$P[cond1] + 2
data2$y0[cond2] <- data2$P[cond2] - 2
data2$y0[cond3] <- data2$P[cond3] + 2

data2$y1[cond1] <- data2$P[cond1] + 22
data2$y1[cond2] <- data2$P[cond2] - 22
data2$y1[cond3] <- data2$P[cond3] + 22

data2$color[cond1] <- "green"
data2$color[cond2] <- "green"
data2$color[cond3] <- "blue"

png("nameofyourfile.png")
plot(data$P,type="l")
segments(data2$x0, data2$y0, data2$x1, data2$y1, col=data2$color)
dev.off()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM