使用 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,打不开。它说没有页面。
我不习惯使用循环,所以这是我的第一次尝试......我不知道我做错了什么(也许很多事情),有人能帮我弄清楚吗?
预先感谢您的帮助!
戴安娜
使用 patchwork
和 lapply
循环你的样本,一种实现你想要的结果的方法可能如下所示:
- 使用第一个循环创建绘图并将它们存储在列表中
- 使用第二个循环使用
patchwork::wrap_plots
在 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)
)
我想使用 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,打不开。它说没有页面。 我不习惯使用循环,所以这是我的第一次尝试......我不知道我做错了什么(也许很多事情),有人能帮我弄清楚吗?
预先感谢您的帮助!
戴安娜
使用 patchwork
和 lapply
循环你的样本,一种实现你想要的结果的方法可能如下所示:
- 使用第一个循环创建绘图并将它们存储在列表中
- 使用第二个循环使用
patchwork::wrap_plots
在 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)
)