gpt4 book ai didi

r - Phyloseq ggplot2 对象不允许添加某些元素

转载 作者:行者123 更新时间:2023-12-01 14:28:29 27 4
gpt4 key购买 nike

我想修改由 phyloseq 包生成的图(从 gi​​thub 下载)。 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")

现在我将尝试从 vegan 包中向图中添加一些 envfit() 箭头,请参阅上一个问题 here :

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)

最佳答案

错误消息已经让您知道您需要在添加的层中修复什么。

您要修改的 ggplot2 对象在 p3$data$data 中有一个列变量 id.type其中一层的插槽,这是一个美学映射参数,如果您没有覆盖它,它会隐式传递给您的新层。鉴于您添加的图层在这两种情况下都指定了 x 和 y,我怀疑 id.type 是分面或颜色变量。在最新版本的 ggplot2 中,您可以包含一个参数 inherit.aes=FALSE 以避免这种继承的映射,在这种情况下您将丢失未指定的映射。结果根据它是什么而不同(例如,如果是小平面,那么图层会出现在两个面板中,我认为;如果是颜色,那么图层会被分配默认颜色)。

或者,您可以将 id.type 列添加到新图层的数据中。这取决于您想要达到的结果。

关于r - Phyloseq ggplot2 对象不允许添加某些元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26744821/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com