R 在循环中使用时,如何使scale_手动应用颜色而不绘制绘图?

R 在循环中使用时,如何使scale_手动应用颜色而不绘制绘图?,r,ggplot2,R,Ggplot2,我试图为数据帧列表生成一个ggplots列表,其中每个绘图应使用不同的调色板,这是我试图通过scale_fill_手册实现的。但是,最后一种颜色应用于所有绘图。我最终发现,只有在将每个图添加到列表之前绘制每个图,它才有效 下面是一个简单的例子: # no extra plotting df <- split(mtcars, mtcars$gear) colours <- c("red", "green", "blue") plots <- list() for(i in 1:

我试图为数据帧列表生成一个ggplots列表,其中每个绘图应使用不同的调色板,这是我试图通过scale_fill_手册实现的。但是,最后一种颜色应用于所有绘图。我最终发现,只有在将每个图添加到列表之前绘制每个图,它才有效

下面是一个简单的例子:

# no extra plotting
df <- split(mtcars, mtcars$gear)
colours <- c("red", "green", "blue")

plots <- list()
for(i in 1:length(df)){
   .plot <- ggplot(df[[i]], aes(x=as.factor(carb), fill=as.factor(gear))) + geom_bar() +
   scale_fill_manual(values=colours[[i]])

   plots[[length(plots)+1]] <- .plot
}

plot1 <- arrangeGrob(grobs=plots)
#无需额外绘图

df更好的选择是

df <- split(mtcars, mtcars$gear)
colours <- c("red", "green", "blue")

plots <- lapply(1:length(df), function(i) {
   .plot <- ggplot(df[[i]], aes(x=as.factor(carb), fill=as.factor(gear))) + 
       geom_bar() +
       scale_fill_manual(values=colours[[i]])
   .plot
})

df感谢您指出问题在于懒惰的计算,以及这个非常优雅和漂亮的解决方案!谢谢对于未来的读者,再见循环:将
ggplotGrob(.plot)
添加到列表中而不是
。plot
也解决了这个问题
df <- split(mtcars, mtcars$gear)
colours <- c("red", "green", "blue")

plots <- lapply(1:length(df), function(i) {
   .plot <- ggplot(df[[i]], aes(x=as.factor(carb), fill=as.factor(gear))) + 
       geom_bar() +
       scale_fill_manual(values=colours[[i]])
   .plot
})