r - R:动态调整输出pdf大小以绘制函数内的区域
问题描述
我有一个类似于下面 MWE 中的函数来生成 PCA 双图,纵横比为 1:1,不会影响其解释;这意味着有时我会根据数据得到更窄或更宽的图。
我希望能够以某种方式检测绘图区域并制作适当宽度和高度的 pdf 以很好地适合绘图,因为否则我会在输出文件中以不需要的额外空间结束。
检查下面的 MWE:
pcaplot <- function(pobj, df, groupvar, filename){
library(ggbiplot)
P <- ggbiplot(pobj,
obs.scale = 1,
var.scale=1,
ellipse=T,
circle=F,
varname.size=3,
var.axes=T,
groups=df[,groupvar],
alpha=0)
P$layers <- c(geom_point(aes(color=df[,groupvar]), cex=5), P$layers)
pdf(file=paste(filename,".pdf",sep=""), height=14, width=14) #USE PROPER WIDTH AND HEIGHT DEPENDING ON PLOT AREA
print(
P
)
dev.off()
}
data(iris)
pca.obj <- prcomp(iris[,1:4], center=TRUE, scale.=TRUE)
pcaplot(pca.obj, iris, "Species", "test")
谢谢!
解决方案
我为您提供了更好的扩展解决方案。
作为基础,您应该使用您的数据对象 - 不是一个简单的 data.frame,它们更多的是在里面。例如,您pca.obj
还包含 x 列表pca.obj$x
-> 有要绘制的点
pca.obj$x[,1]
将用于 PC1
pca.obj$x[,3]
将用于 PC3
现在您可以使用它们来计算点的范围
> pca.obj$x[,1] %>% range() %>% diff()
[1] 6.064723
> pca.obj$x[,3] %>% range() %>% diff()
[1] 1.856603
您可以将这些值用作缩放的基础。(在我的情况下,我还将 *3 设置为 pdf 的大小,以便以相同的比率为字体等提供更好的分辨率)在我的示例中,我将从您的数据中为您提供 Iris PC1 vs PC3
library(magrittr) # for pipe
pcaplot <- function(pobj, df, pca_choices, groupvar, filename){
width_scale <- pobj$x[,pca_choices[1]] %>% range() %>% diff() %>% ceiling() * 3
height_scale <- pobj$x[,pca_choices[2]] %>% range() %>% diff() %>% ceiling() * 3
library(ggbiplot)
P <- ggbiplot(pobj,
choices = pca_choices,
obs.scale = 1,
var.scale=1,
ellipse=T,
circle=F,
varname.size=3,
var.axes=T,
groups=df[,groupvar],
alpha=0)
P$layers <- c(geom_point(aes(color=df[,groupvar]), cex=5), P$layers)
pdf(file=paste(filename,".pdf",sep=""), height=height_scale, width=width_scale) #USE PROPER WIDTH AND HEIGHT DEPENDING ON PLOT AREA
print(P)
dev.off()
}
data(iris)
pca.obj <- prcomp(iris[,1:4], center=TRUE, scale.=TRUE)
pca_choices <- c(1, 3)
pcaplot(pca.obj, iris, pca_choices, "Species", "test")
推荐阅读
- angular - 具有 x 和 y 轴值的 ng2-charts 折线图
- react-native - 反应原生 TextInput 离开我的屏幕
- date - Teradata 使用 CASE 语句需要更改日期格式
- python - 为什么在尝试与位操作相乘时我偏离了 1-2?
- swift - 快速,如何使用 .crossDissolve 动画执行转场?
- docker - LCOW WS2019 中的 Linux 容器启动问题:CreateProcess 期间出错:Windows 系统调用失败:未指定错误 (0x80004005)
- powershell - 将 OUTLOOK.HOL 文件解析为 CSV
- r - 转换数据框列表以获得 df 名称和年度均值的均值
- arrays - 在C中将数字添加到字符串中
- html - 联系表单提交按钮适用于桌面,但不适用于移动设备