R 4.1.1版本flexdashboard循环生成ggplot大小不一致问题问询
问题原因
这个现象是R 4.x版本配套的knitr/flexdashboard包更新渲染逻辑导致的:旧版本会将同一块内循环输出的所有ggplot统一分配相同尺寸,新版本默认按照流式布局自动为连续输出的图形交替分配适配高度,就会出现大小交替的问题。
解决方法
方法1:统一固定代码块的图形输出参数
在R代码块头部直接设置统一的fig.height、fig.width参数,同时添加results='asis'配置即可解决,修改后的代码块如下:
```{r fig.height=5, fig.width=8, fig.align='center', results='asis', echo=FALSE} library(ggplot2) data("mtcars") plots <- list() # 弃用的aes_q替换为ggplot2官方推荐的.data代词写法,适配新版本ggplot2 for (i in 1:(ncol(mtcars) - 1)){ plots[[i]] <- ggplot(data = mtcars) + geom_point(aes(x = .data[[names(mtcars)[1]]], y = .data[[names(mtcars)[1+i]]])) } for (i in 1:length(plots)){ print(plots[[i]]) # 插入换行符避免渲染时图形粘连 cat("\n\n") }
#### 方法2:动态生成独立图形块 如果需要更灵活的布局控制,可以用`knitr::knit_expand`为每个图形生成独立的R代码块,flexdashboard会对所有独立块应用相同的默认尺寸配置,完全避免大小不一致问题: ```r ```{r echo=FALSE, results='asis'} library(ggplot2) data("mtcars") # 先生成所有绘图对象 plots <- list() for (i in 1:(ncol(mtcars) - 1)){ plots[[i]] <- ggplot(data = mtcars) + geom_point(aes(x = .data[[names(mtcars)[1]]], y = .data[[names(mtcars)[1+i]]])) } # 动态生成每个图的独立代码块 for (i in seq_along(plots)) { cat(knitr::knit_expand(text = c( "```{r plot_{{i}}, fig.height=5, fig.width=8, echo=FALSE}", "plots[[{{i}}]]", "```\n\n" ), i = i)) }
### 额外说明 如果修改后依然存在问题,可以将相关依赖包更新到CRAN最新稳定版: `install.packages(c("flexdashboard", "knitr", "ggplot2"))` --- 内容的提问来源于stack exchange,提问作者multi
相关产品推荐
相关产品推荐

