使用 ggplot2 循环保存具有不同亮点的相同图

Loop to save same plot with different highlights using ggplot2

我想使用 ggplot 创建具有相同数据但突出显示特定行的多个密度图。 我的 table 非常大,但有以下列:

Marker  Sample  value
X1      4_HVxLF 0.5
X2      4_HVxLF 0.1
...

.

ggplot(Dta, aes(x=value, group=Sample, color = Sample)) +
  geom_density()+
  xlab("value")+
  ylab("Density")+
  theme_classic()

不容易解读。然后,我的目标是得到这样的东西:。使用的代码是:

ggplot(Dta, aes(x=value, group=Sample, color = Sample)) +
  geom_density()+
  xlab("value")+
  ylab("Density")+
  theme_classic()+
  gghighlight(SampleName == "25_HVxLF",
              unhighlighted_params = list(colour = "grey90"))

所以我尝试构建一个循环来获取一个 PDF,其中包含 4 个图,例如每页 the second one 以及我所有的样本(其中 105 个)。我不能使用 facet_wrap 因为它们太多了。 这是我尝试过的:

Samples <- unique(Dta$Sample)    
pdf('Allplots.pdf', width = 8, height = 11)
    par(mfrow=c(4,2))
    for (i in Samples){
      ggplot(Dta, aes(x=value, group=Sample, 
                             color = Sample)) +
        geom_density()+
        xlab("value")+
        ylab("Density")+
        theme_classic()+
        gghighlight(Sample == Samples[i],
          unhighlighted_params = list(colour = "grey90"))
    }
dev.off()

但是出来的PDF是4kb,打不开。它说没有页面。 我不习惯使用循环,所以这是我的第一次尝试......我不知道我做错了什么(也许很多事情),有人能帮我弄清楚吗?

预先感谢您的帮助!

戴安娜

使用 patchworklapply 循环你的样本,一种实现你想要的结果的方法可能如下所示:

  1. 使用第一个循环创建绘图并将它们存储在列表中
  2. 使用第二个循环使用 patchwork::wrap_plots
  3. 在 2 行和 2 列的网格中将绘图粘合在一起

利用一些虚假的随机示例数据:

library(ggplot2)
library(gghighlight)
library(patchwork)

plot_fun <- function(highlight) {
  ggplot(Dta, aes(x=value, group=Sample, 
                color = Sample)) +
  geom_density()+
  xlab("value")+
  ylab("Density")+
  theme_classic()+
  gghighlight(Sample == highlight,
              unhighlighted_params = list(colour = "grey90"))
}

Samples <- unique(Dta$Sample)

# Make plots
p <- lapply(Samples, plot_fun)

nrow <- 2
ncol <- 2

# Page counter
idx_page <- rep(seq(ceiling(length(p) / nrow / ncol)), each = nrow * ncol, length.out = length(p))

# Export plots as grids of 2 x 2
pdf('Allplots.pdf', width = 8, height = 11)
lapply(unique(idx_page), function(x) {
  wrap_plots(p[idx_page == x], ncol = ncol, nrow = nrow)
})
#> [[1]]
#> 
#> [[2]]
#> 
#> [[3]]
#> 
#> [[4]]
#> 
#> [[5]]
dev.off()
#> quartz_off_screen 
#>                 2

数据

# Random example data
set.seed(123)
n <- 20
Dta <- data.frame(
  Sample = rep(LETTERS[seq(n)], each = 100),
  value = rnorm(100 * n)
)