R: динамически корректировать выходной размер PDF, чтобы отобразить область внутри функции - PullRequest
0 голосов
/ 29 августа 2018

У меня есть функция, подобная функции в 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")

Спасибо!

1 Ответ

0 голосов
/ 04 сентября 2018

У меня есть решение для лучшего масштабирования.

В качестве основы вы должны использовать свой объект данных - это не просто data.frame, это больше внутри. Например, ваш pca.obj содержит также список x pca.obj$x -> есть точки на графике

pca.obj$x[,1] будет для ПК1
pca.obj$x[,3] будет для ПК3

теперь вы можете использовать их для вычисления диапазона очков

> 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")

черная рамка, чтобы показать реальное пространство вокруг.
базовая версия: enter image description here

новый: enter image description here

...