R语言RC类plot方法调用两次ggplot仅显示最新图如何解决
问题原因
ggplot()本质是生成ggplot类型的绘图对象,本身不会直接触发绘图渲染,只有当对象被显式print()、或是在交互环境中作为顶层表达式返回时,才会被渲染为可见图表。- R的函数/方法默认只会返回最后一行表达式的执行结果,你写的
plot方法中第一个ggplot()生成的对象既没有被显式打印,也没有被作为返回值带出方法,直接被丢弃,只有最后一个ggplot对象作为方法返回值被渲染,因此仅能看到最后一次的绘图结果。
修复方案
方案1:显式打印每一个绘图对象(最常用)
给每个ggplot()调用套上print()即可,不管是交互环境调用还是脚本运行都能正常输出多张图,修改后的方法示例:
plot = function() { # 示例第一个绘图:散点图 print(ggplot2::ggplot(.self, ggplot2::aes(x = x, y = y)) + ggplot2::geom_point()) # 示例第二个绘图:直方图 print(ggplot2::ggplot(.self, ggplot2::aes(x = x)) + ggplot2::geom_histogram(bins = 10)) }
方案2:将所有绘图对象存入列表返回
如果你需要后续对生成的图表做二次修改,可将所有绘图对象打包为列表返回,调用时可批量打印或单独取用:
plot = function() { p1 <- ggplot2::ggplot(.self, ggplot2::aes(x = x, y = y)) + ggplot2::geom_point() p2 <- ggplot2::ggplot(.self, ggplot2::aes(x = x)) + ggplot2::geom_histogram(bins = 10) return(list(散点图 = p1, 直方图 = p2)) }
调用时执行print(实例对象$plot())即可一次性输出所有图,也可以通过实例对象$plot()$散点图单独调用第一张图。
方案3:拼接多图为单个对象输出
如果需要将多张图放在同一个画布展示,可以用patchwork包组合绘图对象后返回:
plot = function() { library(patchwork) p1 <- ggplot2::ggplot(.self, ggplot2::aes(x = x, y = y)) + ggplot2::geom_point() p2 <- ggplot2::ggplot(.self, ggplot2::aes(x = x)) + ggplot2::geom_histogram(bins = 10) # 左右拼接,也可以用p1 / p2实现上下拼接 return(p1 + p2) }
内容的提问来源于stack exchange,提问作者OLGJ
相关产品推荐
相关产品推荐

