Объекты Phyloseq ggplot2 не позволяют добавлять определенные элементы
Я хотел бы изменить графики, созданные пакетом phyloseq (загрузите его с github). Графики Phyloseq являются объектами ggplot2, поэтому я думаю, что я мог бы добавить элементы, добавив объекты ggplot2 к объекту, созданному phyloseq. В некоторых случаях это работает, но не в других, и я не понимаю, почему. Например:
require(phyloseq)
require(grid)
require(ggplot2)
require(plyr)
#use the GlobalPatterns dataset from the Phyloseq package
GP <- GlobalPatterns
#do some preprocessing to the data
wh0 <- genefilter_sample(GP, filterfun_sample(function(x) x > 5), A = 0.5 * nsamples(GP))
GP1 <- prune_taxa(wh0, GP)
GP1 <- transform_sample_counts(GP1, function(x) 1e+06 * x/sum(x))
phylum.sum = tapply(taxa_sums(GP1), tax_table(GP1)[, "Phylum"], sum, na.rm = TRUE)
top5phyla = names(sort(phylum.sum, TRUE))[1:5]
GP1 <- prune_taxa((tax_table(GP1)[, "Phylum"] %in% top5phyla), GP1)
#ordination for NMDS plot using a Bray-Curtis distance
GP.ord <- ordinate(GP1, "NMDS", "bray")
#create plot
p3 <- plot_ordination(GP1, GP.ord, type = "biplot", color = "SampleType", shape = "Phylum", title = "biplot")
Теперь я попытаюсь добавить стрелки envfit() к графику из пакета vegan, см. Предыдущий вопрос здесь:
require(vegan)
# First, lets apply envfit to the human/not human variable
human = get_variable(GP1, "SampleType") %in% c("Feces", "Mock", "Skin", "Tongue")
sample_data(GP1)$human <- factor(human)
nmds.envfit <- envfit(GP.ord$points, env = as.data.frame(sample_data(GP1)$human), perm = 999) #standard envfit
str(nmds.envfit)
#data for the envfit arrows
vec.sp.df<-as.data.frame(cbind((nmds.envfit$factors$centroids*sqrt(nmds.envfit$factors$r)),pvals=nmds.envfit$factors$pvals)) #this is necessary, see Gavin Simpson in the link provided above
env.scores.nmds <- as.data.frame(vec.sp.df[vec.sp.df$pvals<0.05,]) #extracts relevant scores from envifit
#extracts relevant scores from envifit
env.scores.nmds <- cbind(env.scores.nmds, env.variables = c("Not Human", "Human")) #and then gives them their names
env.scores.nmds
mult<- 1 #can change this if the arrows need to be a different length
###Now let us add these vectors to p3
p3 + geom_segment(data = env.scores.nmds,
aes(x = 0, xend = mult*MDS1, y = 0, yend = mult*MDS2),
arrow = arrow(length = unit(0.75, "cm")), colour = "black") + #arrows for envfit. doubled the length for similarity to the plot() function. NB check ?envfit regarding arrow length if not familiar with lengths
geom_text(data = env.scores.nmds, #labels the environmental variable arrows * "mult" as for the arrows
aes(x = mult*MDS1, y = mult*MDS2, label=env.variables),
size = 6,
hjust = -0.5)
Однако это возвращает ошибку: "Ошибка в eval(expr, envir, enclos): объект 'id.type' не найден"
Если мы попытаемся добавить другой тип элемента ggplot2, он будет работать:
p3+ geom_hline(yintercept=0.75)
1 ответ
Сообщение об ошибке уже позволяет узнать, что нужно исправить в добавленном слое.
Объект ggplot2, который вы хотите изменить, имеет переменную столбца, id.type
, в любом p3$data
или в $data
слот одного из его слоев, и это эстетический аргумент отображения, который неявно передается вашему новому слою, если вы его не перезаписали. Учитывая, что добавленный вами слой определяет x и y в обоих случаях, я подозреваю, что id.type
переменная огранки или цвета В последних версиях ggplot2 вы можете включить аргумент inherit.aes=FALSE
чтобы избежать этого унаследованного отображения, и в этом случае вам будет не хватать неуказанного отображения. Последствия различаются в зависимости от того, что это было (например, если фасет, то слой появляется на обеих панелях, я думаю; и если цвет, то слой получает назначенный цвет по умолчанию).
Кроме того, вы можете добавить id.type
столбец с данными для ваших новых слоев. Это зависит от того, какого результата вы хотите достичь.