【问题标题】:R: dynamically adjust output pdf size to plot area inside a functionR:动态调整输出pdf大小以绘制函数内的区域
【发布时间】:2018-08-29 02:04:37
【问题描述】:

我有一个类似于下面 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】:

    我有一个更好的扩展解决方案。

    作为基础,你应该使用你的数据对象 - 不是一个简单的 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 与 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")
    

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

    新:

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多