R ggbiplot для результатов PCA: почему результирующий график такой узкий и как настроить ширину?

Итак, я делаю анализ PCA и обычно рисую результаты с помощью ggplot2, но недавно я обнаружил ggbiplot, который может показывать стрелки с переменными.

ggbiplot, кажется, работает нормально, хотя он показывает некоторые проблемы (например, невозможность изменить размер точки, следовательно, весь слой, который я делаю в MWE).

Проблема, с которой я столкнулся сейчас, заключается в том, что в то время как графики ggplot2 регулируют ширину графика в соответствии с областью построения, ggbiplot этого не делает. С моими данными график ggbiplot ужасно узок и оставляет ужасно широкие вертикальные поля, хотя он расширяет тот же интервал оси x, что и график ggplot2 (фактически это тот же график).

Здесь я использую данные iris, поэтому мне пришлось сделать ширину png очень большой, чтобы проблема, с которой я столкнулся, стала очевидной. Пожалуйста, проверьте MWE ниже:

data(iris)
head(iris)
pca.obj <- prcomp(iris[,1:4],center=TRUE,scale.=TRUE)
pca.df <- data.frame(Species=iris$Species, as.data.frame(pca.obj$x))
rownames(pca.df) <- NULL
png(filename="test1.png", height=500, width=1000)
print(#or ggsave()
  ggplot(pca.df, aes(x=PC1, y=PC2)) +
  geom_point(aes(color=Species), cex=3)
)
dev.off()
P <- ggbiplot(pca.obj,
         obs.scale = 1, 
         var.scale=1,
         ellipse=T,
         circle=F,
         varname.size=3,
         groups=iris$Species, #no need for coloring, I'm making the points invisible
         alpha=0) #invisible points, I add them below
P$layers <- c(geom_point(aes(color=iris$Species), cex=3), P$layers) #add geom_point in a layer underneath (only way I have to change the size of the points in ggbiplot)
png(filename="test2.png", height=500, width=1000)
print(#or ggsave()
    P
)
dev.off()

Этот код создает следующие два изображения.

Выход ggplot2 (желаемая ширина графика): test1

вывод ggbiplot (участок слишком узкий для области построения): test2

Посмотрите, как, в то время как ggplot2 регулирует ширину графика в соответствии с областью графика, ggbiplot этого не делает. С моими данными график ggbiplot чрезвычайно узок и оставляет большие вертикальные поля.

Мой вопрос здесь: как заставить ggbiplot вести себя как ggplot2? Как настроить ширину графика в соответствии с желаемой областью построения (размер png) с помощью ggbiplot? Спасибо!


person DaniCee    schedule 14.09.2017    source источник
comment
Я думаю, что по умолчанию используется соотношение сторон 1: 1, используя что-то вроде coord_fixed() - у меня не установлен ggbiplot, и я не могу вспомнить, переопределит ли что-то вроде p + coord_cartesian() текущее соотношение сторон.   -  person Marius    schedule 14.09.2017
comment
У меня было то же самое с сюжетом PCA от factominer. изменить невозможно!   -  person agenis    schedule 14.09.2017
comment
+ тема(аспект.соотношение=...)   -  person Andre Elrico    schedule 14.09.2017


Ответы (1)


Измените аргумент ratio в coord_equal() на значение меньше 1 (по умолчанию в ggbiplot()) и добавьте его на свой график. Из описания функции: «Коэффициенты выше единицы делают единицы по оси Y длиннее, чем единицы по оси X, и наоборот».

P + coord_equal(ratio = 0.5)

ПРИМЕЧАНИЕ: как отметил @Brian в комментариях, "изменение соотношения сторон исказит интерпретацию длины векторов главных компонентов, поэтому оно установлено равным 1".

person markus    schedule 14.09.2017
comment
Есть ли способ получить эту информацию, чтобы сделать это автоматически (вместо того, чтобы сначала проверять выходной график, а затем изменять его)? Таким образом, он автоматически вписывается в область графика, например, ggplot2... - person DaniCee; 14.09.2017
comment
@DaniCee изменение соотношения сторон приведет к искажению интерпретации длины векторов основных компонентов, поэтому для него установлено значение 1. - person Brian; 14.09.2017
comment
@ Брайан, это действительно интересный момент! Я мог бы просто сделать наоборот и использовать coord_fixed() при использовании ggplot2 и оставить ggbiplot как есть - person DaniCee; 15.09.2017