我具有以下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")
谢谢!
答案 0 :(得分:1)
我为您提供了更好的扩展解决方案。
作为基础,您应该使用数据对象-不是简单的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")