在具有 pos 和 neg 值的堆积条中排序,ggplot2

Order in stacked bar with both pos and neg values, ggplot2

我的情况似乎不符合之前关于 ggplot2 中堆叠条形图顺序的任何讨论。

我知道堆叠条和图例中两个组件的顺序遵循分配给“fill=”的因子变量的水平。但是我的数据集在某些级别上有正值,在其他级别上有负值。负值的堆积条内的顺序似乎颠倒了水平的顺序。

请允许我举例说明:

d <- data.frame(
               group=c(rep(1,4),rep(2,4),rep(3,4)),
               category=c(rep(c("male_for","male_against","female_for","female_against"),3)),
               n=c(rep(c(2,-2),6))
               )

d$category <- factor(d$category,c("male_for","female_for","male_against","female_against"))

ggplot(d)+ geom_bar(aes(group,n,fill=category),stat="identity")

click here to see the image (not sure why it doesn't embed. sorry

可以看到,因子变量“category”中水平的顺序是male_for、female_for、male_against、female_against。传说中的顺序也是如此。但是,我猜是因为反对组的负值,图表下半部分的堆叠顺序与因子中定义的水平相反。

谁能想出一个解决方案,使条形图的下半部分仍然遵循图例中的顺序(即在因子中定义)?

非常感谢!

颜色是按字母顺序分配的,但您的图例是按因素顺序分配的。由于通常因子顺序是按字母顺序分配的,所以这个问题可能令人沮丧!

解决这个问题的方法不止一种。这是一种方法 - 顺便说一下 我使用了 geom_col() 因为这确实是您在这里使用的...区别?没有stat="identity".

# I picked viridis, because I like their colors - but any would work
library(viridis)
library(tidyverse)

colorPal <- viridis::viridis_pal(end = .8)(4)   # 4 colors; no neon yellow

ggplot(d, aes(group, n, fill = category)) + 
  geom_col() + 
  scale_fill_discrete(type = colorPal,
                      limits = c("male_for",
                                 "female_for",
                                 "male_against",
                                 "female_against"))