Jupyter封装函数输出不同尺寸ggplot图时repr选项不生效问题
问题根源
IRkernel 对ggplot对象的渲染是延迟执行的:调用print(p)时只是把绘图对象加入待输出队列,不会立刻读取当前的repr.plot.width/repr.plot.height配置,等整个函数/当前代码块全部执行完成后,才会读取最终的全局配置统一渲染所有队列里的图。你在函数内最后一次把尺寸设为2020,所以两张图都会套用这个值,第一次设置的55根本没被读到。
解决方案
方法1:函数内逐图手动指定尺寸渲染
直接调用repr包的绘图渲染接口,每张图生成时就传入对应宽高参数,输出渲染后的结果,跳过全局延迟渲染逻辑:
library(ggplot2) # 示例数据 temp <- mtcars[, 1:3] colnames(temp) <- c("x1", "z", "y1") plotting_function <- function(data_to_vis) { # 输出5*5尺寸的散点图 p1 <- ggplot(data_to_vis, aes(x=x1, y=y1)) + geom_point(size = 3) print(repr::repr_plot(p1, width = 5, height = 5)) # 输出20*20尺寸的分面图 p2 <- ggplot(data_to_vis, aes(x=x1, y=y1)) + geom_point() + facet_wrap(~z) + theme(aspect.ratio = 1) print(repr::repr_plot(p2, width = 20, height = 20)) } plotting_function(temp)
方法2:拆分代码块设置参数
如果不需要把所有逻辑封装在单个函数内,可以把不同尺寸的绘图逻辑拆分到独立的Jupyter代码块,每个块开头单独设置对应repr.plot.*参数。单个代码块执行完成后就会立刻按当前配置渲染块内图表,不会出现后续参数覆盖的问题。
踩坑提示:不要尝试用函数内临时修改option、
on.exit()恢复原配置的写法,这类写法依然绕不开延迟渲染的机制,所有图最终还是会套用同一个尺寸参数。
内容的提问来源于stack exchange,提问作者cs0815
相关产品推荐
相关产品推荐

