我试图用与连续变量相对应的颜色渐变填充形状。我没有任何错误,但是它不会显示在图表上。
我尝试使用as.numeric
来确保变量是连续的。
ggplot()+
geom_point(data = NMDS.all.taxa, aes(y = NMDS2, x = NMDS1, fill = env$elev.num), shape = env$saison, size = 4)+ #this is the points
geom_path(data = df_ell.all.taxa, aes(x = NMDS1, y = NMDS2, colour = group))+ ##Elipses
scale_fill_gradient2(low = "green", mid = "blue", high = "red", midpoint = 1800)+ ##fill
theme_bw()+
theme(panel.background = element_blank(),
panel.grid.major = element_blank(), #remove major-grid labels
panel.grid.minor = element_blank(), #remove minor-grid labels
plot.background = element_blank()
)
除了形状为空以外,它为我提供了所有内容的NMDS。没有任何错误代码。
要重新创建数据的各个方面:
library(vegan)
Macro_AUG_2019_rep.<- matrix(0:10, ncol = 20, nrow = 50)
env <- data.frame(Traitement = sample(c("n","r"),50, replace = TRUE),
saison = sample(c("S","A"),50, replace = TRUE),
Elevation = sample(1000:1049),
Site = sample(c("lake1","lake2","lake3","lake4","lake5","lake6","lake7"),
50, replace = TRUE))
spe.nmds <- metaMDS(Macro_AUG_2019_rep., distance='bray', k=2, try=999, maxit=500)
NMDS.all.taxa <- data.frame(NMDS1 = spe.nmds$points[,1],
NMDS2 = spe.nmds$points[,2],
group = env$Traitement,
sites = env$Site)
veganCovEllipse <- function(cov, center = c(0, 0), scale = 1.75, npoints = 100) {
theta <- (0:npoints) * 2 * pi/npoints
Circle <- cbind(cos(theta), sin(theta))
t(center + scale * t(Circle %*% chol(cov)))
}
df_ell.all.taxa <- data.frame()
for(g in levels(NMDS.all.taxa$group)){
df_ell.all.taxa <- rbind(
df_ell.all.taxa,
cbind(as.data.frame(with(NMDS.all.taxa[NMDS.all.taxa$group == g, ],
veganCovEllipse(cov.wt(cbind(NMDS1, NMDS2),
wt=rep(1 / length(NMDS1),
length(NMDS1)))$cov,
center=c(mean(NMDS1), mean(NMDS2))))),
group = g)
)
}
NMDS.mean.all.taxa = aggregate(NMDS.all.taxa[ ,c("NMDS1", "NMDS2")],
list(group = NMDS.all.taxa$group),
mean)
答案 0 :(得分:0)
ggplot2在$
函数中不能与aes()
运算符配合使用,因此,最好通过在主函数后面附加env$Elevation
和env$saison
来避免这些问题data.frame
:
df <- cbind(NMDS.all.taxa, Elevation = env$Elevation, Saison = env$saison)
现在,如果我理解正确,那么问题是geom_point
形状没有被填充。 ggplot2中的shape
美观度(我认为)与基本R图中的pch
参数相同,因此我们可以看到这些值的含义:
因子变量是用级别标签修饰的整数,因此您使用的env$saison
会向下传递1
和2
作为形状。这些形状仅是线条,没有任何关联。
因此,要解决此问题,我们需要让ggplot知道我们实际想要的形状,例如21
和24
。要将因子变量映射到这些形状,我们将在aes()
函数内部定义形状。然后,我们可以使用scale_shape_manual()
设置正确的形状。
# I defined the xy mapping in the main `ggplot()` call so that we
# don't need to do this seperately for the path and points
ggplot(data = df, aes(NMDS1, NMDS2))+
geom_point(aes(fill = Elevation, shape = Saison),
size = 4) +
geom_path(data = df_ell.all.taxa,
aes(colour = group)) +
scale_shape_manual(values = c(21, 24)) +
scale_fill_gradient2(low = "green", mid = "blue", high = "red",
# I adjusted the midpoint to match example
midpoint = mean(df$Elevation))
哪个给了我以下情节:
顺便说一句,使用内置数据集可以轻松说明您的问题。它更符合minimal reproducible example的含义,并且可以节省复制数据分析代码的时间。下面的示例:
ggplot(iris, aes(Sepal.Width, Sepal.Length)) +
geom_point(aes(fill = Petal.Width), shape = iris$Species) +
scale_fill_gradient()
答案应该是:
ggplot(iris, aes(Sepal.Width, Sepal.Length)) +
geom_point(aes(fill = Petal.Width, shape = Species)) +
scale_fill_gradient() +
scale_shape_manual(values = c(21, 22, 24))