我想根据一个变量的值对我的数据集进行子集,并以该变量的值作为绘图的名称和ggtitle,并保存每个绘图。
最后,我想把所有的图表合并成一页。
下面是一个简化的例子。
y=rnorm(100, 0,1)
x=sample(100, 5, replace = T)
k=5
z=sample(k, 100, replace=T)
z <- factor(z, levels = c(1,2,3,4,5),
labels = c("red", "blue", "green", "purple", "yellow"))
dat=data.frame(y=y, x=x, z=z)
library(ggplot2)
for(i in seq_len(k))
{
dat2 = data.frame(dat[dat$z=='i',])
i <- ggplot(dat2, aes(x=x, y=y)) +
geom_point() +
ggtitle(i)
}
library(gridExtra)
grid.arrange(red, blue, green, purple,yellow, nrow = 2)我在保存变量时遇到了问题,因为我使用了ggtitle()。每个图形的标题应该是不同的颜色:红色、蓝色、green....etc。
谢谢。
发布于 2019-08-05 11:46:06
您的子设置不正确:您使用的是字符串'i',而不是变量i。
您可以简单地使用facet代替for循环和grid.arrange。
dat=data.frame(y=y, x=x, z=z)
ggplot(dat, aes(x = x, y = y)) +
geom_point() +
facet_wrap(~ z)如果要循环和安排,则需要使用列表:
plots <- list()
for(z in levels(z)) {
dat2 = data.frame(dat[dat$z==z,])
plots[[z]] <- ggplot(dat2, aes(x=x, y=y)) +
geom_point() +
ggtitle(z)
}
library(gridExtra)
grid.arrange(plots$red, plots$blue, plots$green, plots$purple, plots$yellow, nrow = 2)请注意,对于循环变量,我使用z的值,而不是1:5。
这样做更得体,因为:
colors <- c("red", "blue", "green", "purple", "yellow")
N <- 100
dat <- data.frame(x = sample(N, 5, replace = T),
y = rnorm(N, 0,1),
z = sample(colors, N, replace=T))
plot_color <- function(col, dat) {
dat2 <- dat[dat$z==col,]
ggplot(dat2, aes(x=x, y=y)) +
geom_point() +
ggtitle(col)
}
plots <- purrr::map(colors, plot_color, dat = dat)
do.call(grid.arrange, c(plots, nrow = 2))发布于 2019-08-05 13:02:56
您可以使用for循环,也可以使用组合框/do.call以更短、更快的速度执行;
myplots = lapply(seq_len(k), function(i){
p <- ggplot(data.frame(dat[dat$z==i,]), aes(x=x, y=y)) +
geom_point() +
ggtitle(i)
ggsave(paste0(i,'.png'),p) # if you want to save each plot
return(p)
})
do.call(grid.arrange, myplots) 在环境中有单独的地块
names(myplots) = seq_len(k)
list2env(myplots)或单独执行此操作(例如在循环/lapply内);
assign('blue',myplots[[1]])https://stackoverflow.com/questions/57357879
复制相似问题