如何在ggplot2中用颜色渐变填充形状

时间:2019-08-31 18:58:08

标签: r ggplot2

我试图用与连续变量相对应的颜色渐变填充形状。我没有任何错误,但是它不会显示在图表上。

我尝试使用as.numeric来确保变量是连续的。

NMDS已经计算出并且可以运行。除了颜色渐变之外,其他所有东西都起作用。

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)

1 个答案:

答案 0 :(得分:0)

ggplot2在$函数中不能与aes()运算符配合使用,因此,最好通过在主函数后面附加env$Elevationenv$saison来避免这些问题data.frame

df <- cbind(NMDS.all.taxa, Elevation = env$Elevation, Saison = env$saison)

现在,如果我理解正确,那么问题是geom_point形状没有被填充。 ggplot2中的shape美观度(我认为)与基本R图中的pch参数相同,因此我们可以看到这些值的含义:

enter image description here

因子变量是用级别标签修饰的整数,因此您使用的env$saison会向下传递12作为形状。这些形状仅是线条,没有任何关联。

因此,要解决此问题,我们需要让ggplot知道我们实际想要的形状,例如2124。要将因子变量映射到这些形状,我们将在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))

哪个给了我以下情节:

enter image description here

顺便说一句,使用内置数据集可以轻松说明您的问题。它更符合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))