Rmarkdown中如何调整循环内特定ggplot绘图的尺寸?
循环中单独调整特定ggplot绘图尺寸的方法
在循环里要单独调整某张ggplot的尺寸、且不想修改全局选项,有几个实用的解决办法:
方法1:用ggsave()单独输出时指定尺寸
如果需要把特定图保存为不同尺寸的文件,直接在循环里加判断逻辑,遇到目标图时用ggsave()指定宽高,其他图正常打印即可:
# 假设循环变量是i,当i等于你要调整的目标变量名时执行特殊处理 if (i == "目标变量名") { p <- ggplot(df_stat, aes(x = value, y = nrow(df_stat))) + stat_halfeye() + stat_slab(aes(fill = stat(level)), .width = seq(0.01, 1, by=0.01)) + labs(x = i, y = NULL) + geom_vline(xintercept = 4, colour="red", size=1) + theme_classic() + theme(axis.text.y = element_blank(), axis.ticks.y = element_blank(), axis.line.y = element_blank(), axis.line.x = element_blank(), legend.position="none") # 指定尺寸保存文件,单位可以是in、cm等 ggsave(paste0("plot_", i, ".png"), plot = p, width = 8, height = 4, dpi = 300) } else { # 其他图正常打印 print(ggplot(df_stat, aes(x = value, y = nrow(df_stat))) + stat_halfeye() + stat_slab(aes(fill = stat(level)), .width = seq(0.01, 1, by=0.01)) + labs(x = i, y = NULL) + geom_vline(xintercept = 4, colour="red", size=1) + theme_classic() + theme(axis.text.y = element_blank(), axis.ticks.y = element_blank(), axis.line.y = element_blank(), axis.line.x = element_blank(), legend.position="none")) }
方法2:转换为grob对象修改尺寸后绘制
如果只是在绘图窗口中显示不同尺寸、不需要保存文件,可以把ggplot转换为grob对象,调整其宽高属性后再绘制:
先加载grid包:
library(grid)
然后在循环中处理目标图:
if (i == "目标变量名") { p <- ggplot(df_stat, aes(x = value, y = nrow(df_stat))) + stat_halfeye() + stat_slab(aes(fill = stat(level)), .width = seq(0.01, 1, by=0.01)) + labs(x = i, y = NULL) + geom_vline(xintercept = 4, colour="red", size=1) + theme_classic() + theme(axis.text.y = element_blank(), axis.ticks.y = element_blank(), axis.line.y = element_blank(), axis.line.x = element_blank(), legend.position="none") # 将ggplot转为grob对象 g <- ggplotGrob(p) # 修改宽高(单位可设为in、cm等) g$widths <- unit(8, "in") g$heights <- unit(4, "in") # 绘制修改后的grob grid.draw(g) } else { # 其他图正常打印 print(ggplot(df_stat, aes(x = value, y = nrow(df_stat))) + stat_halfeye() + stat_slab(aes(fill = stat(level)), .width = seq(0.01, 1, by=0.01)) + labs(x = i, y = NULL) + geom_vline(xintercept = 4, colour="red", size=1) + theme_classic() + theme(axis.text.y = element_blank(), axis.ticks.y = element_blank(), axis.line.y = element_blank(), axis.line.x = element_blank(), legend.position="none")) }
方法3:用patchwork包设置单图尺寸
如果你已经在使用patchwork包,也可以把单个图放入patch中指定尺寸:
先加载patchwork包:
library(patchwork)
然后在循环中处理:
if (i == "目标变量名") { p <- ggplot(df_stat, aes(x = value, y = nrow(df_stat))) + stat_halfeye() + stat_slab(aes(fill = stat(level)), .width = seq(0.01, 1, by=0.01)) + labs(x = i, y = NULL) + geom_vline(xintercept = 4, colour="red", size=1) + theme_classic() + theme(axis.text.y = element_blank(), axis.ticks.y = element_blank(), axis.line.y = element_blank(), axis.line.x = element_blank(), legend.position="none") # 设置图的尺寸,支持相对值或绝对单位 print(p + plot_width(8) + plot_height(4)) } else { # 其他图正常打印 print(ggplot(df_stat, aes(x = value, y = nrow(df_stat))) + stat_halfeye() + stat_slab(aes(fill = stat(level)), .width = seq(0.01, 1, by=0.01)) + labs(x = i, y = NULL) + geom_vline(xintercept = 4, colour="red", size=1) + theme_classic() + theme(axis.text.y = element_blank(), axis.ticks.y = element_blank(), axis.line.y = element_blank(), axis.line.x = element_blank(), legend.position="none")) }
三个方法各有适用场景:ggsave()适合需要保存文件的需求,grob修改适合仅窗口显示的场景,patchwork适合已经使用该包的用户,按需选择即可。
内容的提问来源于stack exchange,提问作者Robxaa798
相关产品推荐
相关产品推荐

