R中如何正确合并两个由ggplot图形组成的绘图列表
报错原因
ggplot2的+运算符仅支持在现有ggplot对象上追加图层、标度、主题、坐标配置类组件,不支持直接叠加两个完整的ggplot对象,这是你触发报错的核心原因。
你原本想通过设置透明背景叠加两个完整绘图的思路还存在坐标轴对齐偏差、配置冲突的隐患,不推荐使用。
解决方法
提供两种可直接运行的方案,你可以按需选择:
方案1:最小改动修改现有代码
不需要重构原有绘图逻辑,循环叠加时不要传入整个ggplot对象,仅提取第二个绘图中的图层、主题组件追加到第一个图即可,同时注意避免重复叠加坐标轴配置产生警告:
# 初始化输出列表 plot_list <- list() for(i in 1:(n/2)){ plot_list[[i]] <- plot_list1[[i]] + plot_list2[[i]]$layers + # 提取第二个图的所有几何图层(点、线) plot_list2[[i]]$theme + # 提取第二个图的透明主题配置 xlim(0, 10) + ylim(0, 100) } # 导出图片,多余的dev.off()可以删掉,ggsave会自动处理图形设备 ggsave(width = 30, height = 10, dpi = 300, file = "test.pdf", arrangeGrob(grobs=plot_list, ncol = 3))
注意:需要把你原来plot_list1和plot_list2构建循环里的xlim()、ylim()配置删掉,避免重复设置坐标产生警告。
方案2:规范写法(推荐)
不需要拆分两个绘图列表再做叠加,直接在单次循环里同时传入两组数据绘制图层,从根源避免对象叠加的报错,也不会出现透明图对齐、配置冲突的问题,代码可维护性更高:
double_plot <- function(){ # 原数据构造部分不变 x1 <- c(1, 2, 3, 4, 5) y1 <- c(10, 20, 30, 40, 50) x2 <- c(2, 4, 6, 8, 10) y2 <- c(15, 20, 25, 30, 35) x3 <- c(1, 2, 3, 4, 5) y3 <- c(20, 40, 60, 80, 100) x4 <- c(1, 2, 3, 4, 5) y4 <- c(13, 23, 33, 43, 53) x5 <- c(2, 4, 6, 8, 10) y5 <- c(15, 35, 55, 75, 95) x6 <- c(1, 2, 3, 4, 5) y6 <- c(35, 40, 45, 50, 55) df1 <- data.frame(x1, y1, x2, y2, x3, y3) df2 <- data.frame(x4, y4, x5, y5, x6, y6) n <- ncol(df1) plot_list <- list() # 单次循环直接绘制两组数据 for(i in 1:(n/2)){ p <- i+(i-1) # 提取两组对应位置的绘图数据 data1 <- data.frame(x = df1[,p], y = df1[,p+1]) data2 <- data.frame(x = df2[,p], y = df2[,p+1]) plot_list[[i]] <- ggplot() + # 第一组红色线+点 geom_point(data = data1, aes(x=x, y=y), size =4) + geom_line(data = data1, aes(x=x, y=y), color="red", size=2) + # 第二组蓝色线+点 geom_point(data = data2, aes(x=x, y=y), size =4) + geom_line(data = data2, aes(x=x, y=y), color="blue", size=2) + xlim(0,10) + ylim(0,100) } ggsave(width = 30, height = 10, dpi = 300, file = "test.pdf", arrangeGrob(grobs=plot_list, ncol = 3)) }
运行后导出的PDF就会包含3张同时带有红、蓝两组数据序列的组合图。
内容的提问来源于stack exchange,提问作者EmaK
相关产品推荐
相关产品推荐

