如何让grid.draw函数在RMarkdown代码块中成功渲染行内图片
RMarkdown中VennDiagram图形行内输出解决方案
原因说明
venn.diagram设置filename=NULL时返回的是grid图形系统的grob对象,knitr的默认图形捕获机制对这类手动调用grid绘制的对象适配性不足,会出现控制台能正常显示、但RMarkdown无法输出行内图片的问题。
可用解决方法
方法1:新增画布初始化语句,触发knitr图形捕获
显式加载grid包,在绘制前调用grid.newpage()初始化绘图画布即可,修改后代码如下:require(VennDiagram) library(grid) list1<-c("A", "B", "C", "D") list2<-c("B", "D", "E") list3<-c("A", "D", "Z") p<-venn.diagram( x=list( list1, list2, list3), category.names= c("list1", "list2", "list3"), filename= NULL ) grid.newpage() grid.draw(p)无需调整代码块其他参数,knitr会自动捕获当前画布的输出作为行内图片。
方法2:转为ggplot对象输出,兼容性更强
如果你需要更高的兼容性(比如后续还要调整图形、搭配其他ggplot元素),可以用ggplotify包将grob对象转为ggplot对象,直接输出即可:require(VennDiagram) library(ggplotify) list1<-c("A", "B", "C", "D") list2<-c("B", "D", "E") list3<-c("A", "D", "Z") p<-venn.diagram( x=list( list1, list2, list3), category.names= c("list1", "list2", "list3"), filename= NULL ) # 直接输出ggplot对象,无需调用grid.draw as.ggplot(p)该方法不需要额外调用grid相关函数,RMarkdown对ggplot对象的图形捕获稳定性更高。
如果需要隐藏代码块的源码,只需给代码块添加echo=FALSE参数即可,不会影响图形输出。
内容的提问来源于stack exchange,提问作者ktm
相关产品推荐
相关产品推荐

