R:动态调整输出pdf大小以绘制函数内的区域

问题描述 投票:2回答:1

我有一个类似下面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")

谢谢!

r function pdf size pca
1个回答
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")

黑色边框只是为了显示周围的真实空间。 基础版:enter image description here

新:enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.