改变 ggplot 堆积面图的堆叠顺序

5
我有以下数据:
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)

"factor_var" 的级别为:

> levels(df$factor_var)
[1] "fac1" "fac2" "fac3"

我使用以下代码制作了一个堆积面积图:

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"))

返回结果如下:
该函数返回以下结果:enter image description here 图例显示“factor_var”按照之前看到的级别排序,但是区域并没有按照相同顺序堆叠。我怎样才能产生一个输出,使红色在底部,灰色次之,然后蓝色叠在顶部,就像图例中展示的一样?
(注:这是我需要的顺序(factor_var为有序变量),不仅仅是出于美观原因而将堆栈与图例顺序匹配。)
编辑:所需结果如下所示。 enter image description here 解决方案!!
重新排列数据框是创建所需结果的必要条件:
newdata <- df[order(df$cont_var, df$factor_var),]

非常感谢您的帮助。
2个回答

6
您可以通过添加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))

这会得到以下结果:

在此输入图片描述


或者,在绘图前您可以设置因子水平:
# 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"))

这将会给出:

在此输入图片描述


这对上面的例子有效。但是我的真实数据有点复杂 - 图例中有 9 个级别,它们按正确顺序显示,但实际上以以下顺序绘制(从底部到顶部):级别 5、4、3、2、1、6、7、8、9。很抱歉我不能在这里准确地再现它,因为我的数据很敏感。 - user2568648
通过更新和 levels(dat$factor_var),我想要的堆叠顺序已经排好了,但是第五个级别仍然被绘制在底部! - user2568648

2

这个能行吗?

df$factor_var <- rep(c("fac1","fac2","fac3"),3)
df$factor_var <- factor(df$factor_var, sort(unique(df$factor_var), decreasing = T))

你提供的测试数据表明,这个结果一致地显示fac1为红色并在底部等等。

与Jaaps的建议一样,这个重新排列因子的顺序是我想要绘制的,通过levels(df$factor_var)确认,但是级别5仍然被绘制在底部! - user2568648
在给出的例子中,实际上fac3的值应该在底部,而fac1应该在顶部,需要改变的不是颜色的顺序,而是值的顺序 - 请参见添加的第二个图(通过操作值生成)。 - user2568648
好的,我误解了你。你的解决方案(对数据框进行排序)让我想到了几个月前得出的一个普遍结论:我必须对因子、标签和数据(三者都要)进行排序才能获得所需的结果。其中任何一个缺失几乎总是会导致图表上出现混乱。 - Jakub P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接