更改ggplot堆积区域图中的堆叠顺序

use*_*648 3 r ggplot2 r-factor

我有以下数据:

df <- as.data.frame(c(rep(1,3),rep(2,3),rep(3,3)))
names(df) <- "cont_var"
df$factor_var <- as.factor(rep(c("fac1","fac2","fac3"),3))
df$prop <- c(10,20,70,20,30,50,25,40,35)
Run Code Online (Sandbox Code Playgroud)

"factor_var"的级别为:

> levels(df$factor_var)
[1] "fac1" "fac2" "fac3"
Run Code Online (Sandbox Code Playgroud)

我使用以下内容制作堆积区域图:

library(ggplot)
ggplot(df, aes(x=cont_var, y=prop, fill=factor_var)) +
  geom_area(colour="black",size=.2, alpha=.8) +
  scale_fill_manual(values=c("blue", "grey", "red"))
Run Code Online (Sandbox Code Playgroud)

返回以下结果: 在此输入图像描述

图例显示"factor_var"按照之前看到的级别排序,但区域没有以相同的顺序堆叠.如何在底部生成红色然后灰色然后蓝色堆叠在顶部的输出,如图例中的情况?

(注意:这是我需要的顺序(factor_var是一个有序变量),出于美学原因,它不仅仅是将堆叠与图例顺序相匹配的情况.)

编辑:所需结果如下所示

在此输入图像描述

解决方案

需要重新排序数据帧才能创建所需的结果:

newdata <- df[order(df$cont_var, df$factor_var),]
Run Code Online (Sandbox Code Playgroud)

非常感谢你的帮助.

Jaa*_*aap 5

您可以通过添加guides(fill = guide_legend(reverse=TRUE))到代码来更改图例的顺序:

ggplot(dat, aes(x=cont_var, y=prop, fill=factor_var)) +
  geom_area(colour="black",size=.2, alpha=.8) +
  scale_fill_manual(values=c("blue", "grey", "red")) +
  guides(fill = guide_legend(reverse=TRUE))
Run Code Online (Sandbox Code Playgroud)

这给了:

在此输入图像描述


或者,您可以在绘制之前设置因子级别:

# manually ordering the factor levels
dat$factor_var2 <- factor(dat$factor_var, levels=c("fac3","fac2","fac1"))
# automatcally ordering the factor levels (copied from Jakub P's answer)
dat$factor_var2 <- factor(dat$factor_var, sort(unique(dat$factor_var), decreasing = TRUE))

ggplot(dat, aes(x=cont_var, y=prop, fill=factor_var2)) +
  geom_area(colour="black",size=.2, alpha=.8) +
  scale_fill_manual(values=c("blue", "grey", "red"))
Run Code Online (Sandbox Code Playgroud)

这给了:

在此输入图像描述