【问题标题】:Change stacking order in ggplot stacked area graph更改ggplot堆叠区域图中的堆叠顺序
【发布时间】:2015-07-15 13:49:51
【问题描述】:

我有以下数据:

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

返回以下结果:

图例显示“factor_var”按照之前看到的级别排序,但这些区域没有按相同的顺序堆叠。我怎样才能产生一个底部有红色然后灰色然后蓝色堆叠在顶部的输出,就像图例中的情况一样?

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

编辑:所需结果如下所示

解决方案!

重新排序数据框对于创建所需的结果是必要的:

newdata <- df[order(df$cont_var, df$factor_var),]

非常感谢您的帮助。

【问题讨论】:

    标签: r ggplot2 r-factor


    【解决方案1】:

    您可以通过在代码中添加 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。很抱歉,我无法在此处准确复制它,我的数据很敏感。
    • 随着更新和levels(dat$factor_var),级别按我想要的堆叠顺序排列,但第 5 级仍然绘制在底部!
    【解决方案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 级仍绘制在底部!
    • 在给出的示例中,实际上 fac3 的值应该在底部,而 fac1 在顶部,需要更改的不是颜色顺序,而是值的顺序 - 参见第二张图添加(通过操作值)。
    • 好吧,我误会你了。您的解决方案(订购 data.frame)让我想起了几个月前得出的一般结论:我必须对因素、标签和数据(三者)进行排序才能获得所需的结果。缺少其中一个几乎总是会导致图表出现混乱。
    猜你喜欢
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多