【问题标题】:Efficient way to produce a 10x10 plot in R在 R 中生成 10x10 绘图的有效方法
【发布时间】:2020-02-04 15:11:36
【问题描述】:

我编写了以下代码以在 Shiny R 应用程序中生成 10x10 绘图。我执行了一些额外的计算(例如 R 平方的估计),这使得该过程甚至更重/更慢,但我相信有一种完全不同且更有效的方法来创建以下绘图,而不是使用嵌套的 for 循环进行迭代.

output$plot2 <- renderPlot({
    par(mfrow=c(10,10))
    par(mar=c(0,0,0,0)+0.1)
    for (i in 0:9){
      for (j in 0:9){
        plot(df()[,c(paste0("intensity_",i), paste0("intensity_",j))], xlab=NULL, ylab=NULL, main=NULL, yaxt='n',xaxt='n', ann=FALSE)
        abline(fit <- lm(df()[,c(paste0("intensity_",i), paste0("intensity_",j))], data=df()), col='red')
        legend("topleft", bty="n", legend=format(summary(fit)$adj.r.squared, digits=3))
      }
    }
})

上面的代码生成下图:

您能否建议是否有更好的替代方法可以在更短的时间内以更 R 友好的方式产生相同的输出?

*df() 有 10 列和数千条数字记录

【问题讨论】:

  • 您可以将 ggplot2 与 faceting 一起使用,但您的主要问题可能是您正在绘制的点数。您可以尝试删除由于过度绘图而看不见的点:stackoverflow.com/questions/16665420/…
  • 拥有一组数据来运行你的函数并进行几次测试会很有帮助。我怀疑可以通过使用lapply 家族来做一些事情。被矢量化后它应该运行得更快。
  • @AndreaDodet lapply 没有矢量化,当然也不会更快,如果您不需要返回值而只需要副作用(如绘图),可能会更慢。但我希望大部分时间都花在plot 函数上。

标签: r ggplot2 shiny


【解决方案1】:

你可以尝试像对这样的东西,所以你的情节的一半是重复的,所以对于下半部分,我放置了 rsquare 值:

# Rsq for panel
panel.rsq <- function(x, y){
    usr <- par("usr"); on.exit(par(usr))
    par(usr = c(0, 1, 0, 1))
    r <- cor(x, y)
    txt <- paste0("R^2 = ", round(r^2,digits=2))
    cex.cor <- 0.8/strwidth(txt)
    text(0.5, 0.5, txt, cex = cex.cor * r)
}
# Customize upper panel
upper.panel<-function(x, y){
  points(x,y, pch = 19)
  abline(lm(y~x),col="red")
}


df = data.frame(replicate(10,1:100)+replicate(10,rnorm(100,20,5)))
pairs(df, 
      lower.panel = panel.rsq,
      upper.panel = upper.panel)

如果这仍然太慢,您可能必须使用 lattice...

【讨论】:

  • 好主意,没想到这样,我试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
相关资源
最近更新 更多