Настройка веганского графика pca с помощью ggplot2

Я пытаюсь создать собственный график некоторых веганских результатов rda в ggplot2. Я по сути изменяю направления, как показано в Нанесение RDA (веганский) в ggplot, поэтому что я использую метки формы и цвета, чтобы передать некоторую информацию о точках выборки.

Я провел анализ PCA с веганом следующим образом

library(vegan)
library(dplyr)
library(tibble)
library(ggplot2)
cbPalette <- c("#000000", "#E69F00", "#56B4E9", "#009E73",  "#0072B2", "#D55E00", "#CC79A7", "#F0E442")
data(dune)
data(dune.env)
dune.pca <- rda(dune)
uscores <- data.frame(dune.pca$CA$u)
uscores1 <- inner_join(rownames_to_column(dune.env), rownames_to_column(data.frame(uscores)), type = "right", by = "rowname")
vscores <- data.frame(dune.pca$CA$v)

Я могу сделать простую диаграмму

 biplot(dune.pca)

тестовый образец

Теперь, допустим, я хочу узнать больше об условиях управления, которым были подвержены эти различные образцы. Я раскрашиваю и формирую код и рисую с помощью ggplot.

p1 <- ggplot(uscores1, aes(x = PC1, y = PC2, col = Management,
                         shape = Management)) + 
geom_point() +
scale_color_manual(values=cbPalette) +
scale_fill_manual(values=cbPalette) +
scale_shape_manual(values = c(21:25)) +
theme_bw() +
theme(strip.text.y = element_text(angle = 0))
p1

контрольные точки

Далее, я действительно хотел бы добавить несколько стрелок двух графиков, которые показывают нам оси, соответствующие изобилию видов. Я могу использовать ggplot для построения только этих стрелок следующим образом:

p2 <- ggplot() +  geom_text(data = vscores, aes(x = PC1, y = PC2, label = rownames(vscores)), col = 'red') +
geom_segment(data = vscores, aes(x = 0, y = 0, xend = PC1, yend = PC2), arrow=arrow(length=unit(0.2,"cm")),
            alpha = 0.75, color = 'darkred')
p2

тестовые стрелки

Но что мне действительно хотелось бы сделать, так это получить эти стрелки и точки на одном и том же сюжете. В настоящее время я пытаюсь использовать этот код:

p3 <- p1 + geom_text(data = vscores, aes(x = PC1, y = PC2, label = rownames(vscores)), col = 'red') +
geom_segment(data = vscores, aes(x = 0, y = 0, xend = PC1, yend = PC2), arrow=arrow(length=unit(0.2,"cm")),
            alpha = 0.75, color = 'darkred')
p3

К моему раздражению, это дает только пустой график (пустое окно, сообщений об ошибках). Ясно, что я что-то упускаю или что-то неправильно масштабирую. Есть какие-нибудь предложения о том, как лучше всего наложить два последних графика?


person ohnoplus    schedule 18.09.2017    source источник


Ответы (3)


Пытаться:

library(cowplot) #not needed I just had it attached while answering the question hence the theme.
library(ggplot2)

ggplot(uscores1) + 
      geom_point(aes(x = PC1, y = PC2, col = Management,
                     shape = Management)) +
      scale_color_manual(values=cbPalette) +
      scale_fill_manual(values=cbPalette) +
      scale_shape_manual(values = c(21:25)) +
      geom_text(data = vscores, aes(x = PC1, y = PC2, label = rownames(vscores)), col = 'red') +
      geom_segment(data = vscores, aes(x = 0, y = 0, xend = PC1, yend = PC2), arrow=arrow(length=unit(0.2,"cm")),
                   alpha = 0.75, color = 'darkred')+
      theme_bw() +
      theme(strip.text.y = element_text(angle = 0))

введите здесь описание изображения

График p1 передавал col и shape переменные Management в geom_text/geom_segment, поскольку они не были определены там, но в data = vscores нет столбца Management. По крайней мере, я так думаю на основании ошибки:

`Error in eval(expr, envir, enclos) : object 'Management' not found`
person missuse    schedule 18.09.2017
comment
Ваше наблюдение позволило мне понять, что эта проблема очень похожа на мою предыдущую проблему stackoverflow.com/questions/46159950 / . - person ohnoplus; 19.09.2017
comment
Вот еще более минимальное переписывание моего кода, чтобы он заработал: p3 <- p1 + geom_text(data = vscores, aes(x = PC1, y = PC2, label = rownames(vscores)), col = 'red', inherit.aes = F)+ geom_segment(data = vscores, aes(x = 0, y = 0, xend = PC1, yend = PC2), arrow=arrow(length=unit(0.2,"cm")), alpha = 0.75, color = 'darkred', inherit.aes = F) - person ohnoplus; 19.09.2017
comment
Вы должны добавить + coord_fixed(ratio = 1): графики ординации должны иметь одинаковое соотношение сторон. - person Jari Oksanen; 19.09.2017
comment
В дополнение к использованию coord_fixed(ratio = 1) есть еще одно предостережение: в вашем примере используются немасштабированные необработанные оценки, но на графиках вы хотите учитывать собственные значения и оси растяжения с высокими собственными значениями и сжимать оси с низкими собственными значениями. Вы можете сделать все это вручную, но вы должны это сделать. Наши функции построения графиков и оценок делают это автоматически, как и пакет ggvegan. В общем, вы не должны никогда обращаться к оценкам напрямую как dune.pca$CA$v, но вы должны использовать функцию scores, которая также масштабирует оценки, как это необходимо. - person Jari Oksanen; 19.09.2017
comment
Спасибо за указание на это. Теперь мой код для подсчета очков выглядит так: allscores <- scores(dune.pca); uscores <- data.frame(allscores$sites); uscores$ptvis <- rownames(uscores); uscores1 <- inner_join(rownames_to_column(dune.env), rownames_to_column(data.frame(uscores)), type = "right", by = "rowname"); vscores <- data.frame(allscores$species);, и я добавил строку coord_fixed(ratio = 1) в конце. - person ohnoplus; 20.09.2017

Проверьте пакет ggvegan из github. Он все еще находится в версии 0.0 и активно не разрабатывается на данный момент, но если вы скажете

library(ggvegan)
autoplot(dune.pca) # your result object

Вы получаете этот график, который можно настраивать обычным способом ggplot2 с различной эстетикой.

введите здесь описание изображения

person Jari Oksanen    schedule 19.09.2017
comment
Спасибо, доктор Оксанен. GGvegan звучит многообещающе. Меня беспокоит такой подход, поскольку, насколько я могу судить, изменить цвета и формы точек сайта нетривиально. Например, в приведенном выше примере все сайты представляют собой красные квадраты, но я бы хотел, чтобы формы зависели от типа управления. Я могу использовать функцию fortify () для экспорта данных, а затем передать их в ggplot, но затем я сталкиваюсь с той же проблемой, которую описал выше. Кто-нибудь поправьте меня, если я что-то здесь упускаю. Я бы предпочел сделать это с помощью ggvegan, если бы я мог, поскольку это сэкономило бы мне несколько строк кода. - person ohnoplus; 20.09.2017
comment
Методы autoplot() предназначены (я думаю, из-за оригинальной разработки концепции autoplot) дать вам сюжет. Внутри они используют fortify() методы, предоставляемые также ggvegan, для подготовки аккуратной структуры данных, подходящей для построения графиков с помощью ggplot2, где вы можете иметь полный контроль. Посмотрите на код одного из методов автоплота в пакете, чтобы понять, как это сделать. - person Gavin Simpson; 20.09.2017

Вам также следует взглянуть на ggordiplots на GitHub (https://github.com/jfq3/ggordiplots ). Он включает функцию gg_env__fit, которая подгоняет векторы окружающей среды к графику ординации. Все функции в пакете молча возвращают фреймы данных, которые вы можете использовать для изменения графиков в любом случае. В комплект входит виньетка о модификации сюжетов. Вы можете прочитать виньетки, не устанавливая пакет, перейдя на сайт john-quensen.com и просмотрев страницу GitHub.

person J Quensen    schedule 18.12.2017