R语言调用pdf()函数时如何为同一PDF内不同页面设置不同方向
实现方案
基础R的pdf()设备初始化后全局页面尺寸就固定了,不支持在同一个设备内直接给不同页面单独设置方向/宽高,下面两个方案都可以实现需求,按需选择即可:
方案1:分单页生成后合并(推荐,100%兼容所有绘图场景)
这个方案不需要调整原有绘图逻辑,把不同方向的图表分别输出为单页临时PDF,最后合并为目标文件即可,基础plot、ggplot2、lattice等所有绘图方式都适用,生成的文件能被PDF阅读器自动识别每页方向,不会出现排版错位。
如果没装pdftools包先运行安装命令,已安装可跳过:install.packages("pdftools")
可直接运行的示例代码:
library(pdftools) # 生成临时文件存放单页PDF page1 <- tempfile(fileext = ".pdf") page2 <- tempfile(fileext = ".pdf") # 第一页:纵向,按需求设置宽高(高>宽即为纵向) pdf(file = page1, width = 5, height = 8) plot(x = 1:10, y = 1:10) abline(v = 0) text(x = 0, y = 1, labels = "Random text") dev.off() # 第二页:横向,交换宽高即可(宽>高即为横向) pdf(file = page2, width = 8, height = 5) plot(x = 20:40, y = 10:30) dev.off() # 合并所有单页到目标输出路径 pdf_combine(c(page1, page2), output = "/Downloads/My Plot.pdf") # 清理临时文件 unlink(c(page1, page2))
需要加更多页的话,按同样逻辑新增临时文件、绘图、加入合并列表即可。
方案2:单设备调整图区参数(无额外依赖,仅适合简单基础绘图)
如果不想安装第三方包,可以在初始化pdf()设备时设置足够容纳横、纵两种尺寸的正方形页面,之后每页通过par()调整绘图区域的宽高比,模拟横/纵排版效果。缺点是实际页面尺寸始终是固定的正方形,PDF阅读器无法自动识别页面方向,需要手动旋转,且边距需要反复调试,容易出现多余空白,对排版精度要求高的场景不推荐。
示例代码:
# 初始化设备时设置足够大的正方形页面 pdf(file = "/Downloads/My Plot.pdf", width = 8, height = 8) # 第一页:纵向绘图区 par(pin = c(4, 7), mar = c(4,4,2,2)) plot(x = 1:10, y = 1:10) abline(v = 0) text(x = 0, y = 1, labels = "Random text") # 第二页:横向绘图区 par(pin = c(7, 4), mar = c(4,4,2,2)) plot(x = 20:40, y = 10:30) dev.off()
内容的提问来源于stack exchange,提问作者tamarack
相关产品推荐
相关产品推荐

