R 在循环中使用时,如何使scale_手动应用颜色而不绘制绘图?
我试图为数据帧列表生成一个ggplots列表,其中每个绘图应使用不同的调色板,这是我试图通过scale_fill_手册实现的。但是,最后一种颜色应用于所有绘图。我最终发现,只有在将每个图添加到列表之前绘制每个图,它才有效 下面是一个简单的例子: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:
# 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
})