R等geom_area,根据数字变量排序

时间:2017-11-28 17:15:48

标签: r ggplot2

我正在尝试使用geom_area创建一个ggplot,其中堆叠图层的顺序应该遵循数字变量的条目。事实上,在我的情况下,我希望这个变量是每个类别的标准偏差,这样更常数的类别位于图的底部,而最变量的类别位于顶部。

以下是我为这个简单的例子所写的内容:

dx <- data.frame(x=rep(1:8,3),y=rep(c(2,3,2,4,3,5,3,2,2,3,2,4,3,50,3,2,2,3,2,4,3,20,3,2)),z=c(rep("bread",8),rep("butter",8),rep("fish",8)), 
             zz=c(rep(1,8),rep(3,8),rep(2,8)))
dx_sd <- aggregate(dx$y, by = list(dx$z), FUN = sd)

for (i in 1:nrow(dx_sd)){
dx$sd[dx$z == dx_sd$Group.1[i]] <-
dx_sd$x[i]}

dx <- dx[order(-dx$sd),]
ggplot() + geom_area(data=dx, aes(x=x, y=y, fill=z))

在下图中,我想要面包在底部,鱼在中间,黄油在顶部。

wrong plot

如果有人能帮助我解决这个问题,我将非常感激。非常感谢你提前。

1 个答案:

答案 0 :(得分:1)

转换为factor以给出订单:

ggplot() + geom_area(data=dx, aes(x=x, y=y, fill=factor(z, levels = c("butter", "fish", "bread"))))

或者,如果您想根据zz或任何其他变量保持动态,您可以转换为因子并使用forcats::fct_reorder重新排序:

dx %>% 
  dplyr::mutate(z = as.factor(z) %>% forcats::fct_reorder(zz, .desc = T)) %>% 
  ggplot()+ geom_area(aes(x=x, y=y, fill=z))