#r #plot #pca #vegan
#r #график #pca #веганский
Вопрос:
Я пытаюсь создать биплот pca для подмножеств данных. В той же среде основных компонентов я хотел бы отобразить только подмножества на основе уровней влажности.
# Packages
library(vegan)
# Sample data
data(dune, dune.env)
dd <- cbind(dune.env, dune)
# Runnig PCA
pca1 <- rda(dd[, -c(1:5)], scale=T)
# Plot
plot(pca1, scaling=3)
# Now, instead the plot above, I'd like to get 5 different plots (one per dd$Moisture level) where I see the principal components scores but only for the subsets based on:
levels(dd$Moisture)
Заранее большое спасибо за любые материалы!!
Комментарии:
1. Это кажется связанным: stat.ethz.ch/pipermail/r-help/2009-February/188236.html
2. Спасибо за ваш комментарий user1981275. Это поможет мне ответить на мой собственный вопрос (надеюсь, это правильно! :)).
Ответ №1:
Существуют несколько более простые способы создания этих фасетных графиков с ordixyplot()
помощью пакета in vegan или ggvegan (в настоящее время alpha, поэтому простые вещи иногда приходится делать вручную).
Пример
# Packages
library("vegan")
library("ggvegan")
# Sample data
data(dune, dune.env)
# PCA
pca1 <- rda(dune, scale = TRUE)
Версия ggvegan
Как я уже сказал, вам нужно немного поработать вручную и в данный момент, но вы получаете легенду бесплатно с ggplot.
## use fortify method to extract scores in ggplot-friendly format
scrs <- fortify(pca1, scaling = 3)
## take only site scores for this
scrs <- with(scrs, scrs[Score == "sites", ])
## add on Moisture variable
scrs <- cbind(scrs, Moisture = dune.env$Moisture)
## for all points on one plot, Moisture coded by colour
plt <- ggplot(scrs, aes(x = Dim1, y = Dim2, colour = Moisture))
geom_point() coord_fixed()
plt
## to facet that plot into multiple panels
plt facet_wrap( ~ Moisture)
Версия ordixyplot()
Внутри сохраняется больше работы ordixyplot()
, чем в версии ggvegan, но вам нужно немного потрудиться, чтобы добавить ключ (легенду), и я никогда не могу вспомнить, как это сделать с помощью решетки.
## Single plot
ordixyplot(pca1, data = dune.env, formula = PC1 ~ PC2, group = Moisture)
## Facet plot
ordixyplot(pca1, data = dune.env, formula = PC1 ~ PC2 | Moisture)
Базовая графика
Для базовой графики существует более простая версия для раскрашивания точек на одном графике. Одна из версий
scrs <- scores(pca1, display = "sites")
cols <- c("red","green","blue","orange","purple")
plot(scrs[,1], scrs[,2], pch = 19,
col = cols[as.numeric(as.character(dune.env$Moisture))])
legend("topright", legend = 1:5, title = "Moisture", pch = 19,
col = cols, bty = "n")
Вы можете узнать больше о построении графиков таким образом, используя базовую графику, в сообщении в блоге, которое я написал несколько лет назад.
Комментарии:
1. @ Гэвин Симпсон. Большое спасибо за ваш вклад, действительно полезный! Также для сообщения в вашем блоге, я уже работал с ним сегодня, это здорово! Несмотря на то, что цвета полезны, я бы на самом деле хотел, чтобы, скажем, каждый цвет был на другом графике, но все в одной среде ПК. Я не могу установить ggvegan из-за моей версии R.
Ответ №2:
# Packages
library("vegan")
# Preparing data
data(dune, dune.env)
dd <- cbind(dune.env, dune)
# Order data frame based on dd$Moisture
dd <- dd[order(dd$Moisture),]
str(dd)
# Runnig PCA
pca1 <- rda(dd[, -c(1:5)], scale=T)
# Plot
biplot(pca1, scaling=3, type = c("text", "points"))
# I need to get 5 different plots (one per dd$Moisture level)
# grab the scores on axes required
site.scr <- scores(pca1, display = "sites", scaling = 3) # x
spp.scr <- scores(pca1, display = "species", scaling = 3) # y
## generate x,y lims
xlims <- range(site.scr[,1], spp.scr[,1])
ylims <- range(site.scr[,2], spp.scr[,2])
## plot what you want, but leave out sites
biplot(mod, display = "species",
xlim=xlims, ylim=ylims,
scaling = 3)
## now add in scores as you want, to simulate we plot:
# Moisture - All together but can be in independetn plots
points(site.scr[1:7,], col = "blue", pch = 2)
points(site.scr[8:11,], col = "green", pch = 2)
points(site.scr[0:0,], col = "orange", pch = 2) # Level 3 not present
points(site.scr[12:13,], col = "grey", pch = 2)
points(site.scr[14:20,], col = "black", pch = 2)