在 ggplot2 中绘制 position="identity" geom_col - 一些系列隐藏在其他系列后面,即不可见

Plotting position="identity" geom_col in ggplot2 - some series hiding behind others i.e. not visible

我正在尝试以条形图格式绘制年度时间序列。

我有7组年度数据,它们是有顺序的(所以,同一个数据集每年最低值,同一个数据集每年最高值)

我可以把它画成折线图,一切看起来都很好...

但是当我将其绘制为堆叠条形图时,绘制顺序意味着一些条形不可见。我这辈子都不知道如何覆盖它。 factor 和 levels 都试过了,还是破解不了

如果我绘制为 position="dodge" 我可以看到组中较早的几个较小,所以当我使用 position="identity" 时它们是 'behind'(即不可见) ".

在绘制 position="identity" 时是否有从大到小排序的方法?

这段代码创建了一个与我的前几行类似的数据框:

temp2 <- as.data.frame(matrix(1:70, 5, 14))
colnames(temp2) <- c("FY", "B", "L1", "L2", "L3", "L4", "M1", "M2", "M3", "M4", 
                     "H1", "H2", "H3", "H4")
temp2$FY <- 1976:1980
temp2$B <- c(800, 935, 650, 850, 650)
temp2$L1 <- temp2$B * 1.0149
temp2$L2 <- temp2$B * 1.0161
temp2$L3 <- temp2$B * 1.0191
temp2$L4 <- temp2$B * 1.0269
temp2$H1 <- temp2$B * 0.9323
temp2$H2 <- temp2$B * 0.9269
temp2$H3 <- temp2$B * 0.9135
temp2$H4 <- temp2$B * 0.8787
temp2$M1 <- temp2$B * 0.9867
temp2$M2 <- temp2$B * 0.9856
temp2$M3 <- temp2$B * 0.9827
temp2$M4 <- temp2$B * 0.9754
temp2 <- gather(temp2, Type, Rain, 
               B:H4, factor_key=TRUE)
temp2 <- ddply(temp2, .(FY, Type), summarise,
               Rain = sum(Rain, na.rm=TRUE))

那么如果我这样做:

ggplot(temp2, aes(x=FY, y=Rain, colour=Type)) + geom_line()

...我得到一个正常的折线图,您可以在其中看到所有系列。 但是,如果我这样做:

ggplot(temp2, aes(x=FY, y=Rain, fill=Type)) + geom_col(position="identity")

...然后一些条隐藏在其他条的后面。

ggplot(temp2, aes(x=FY, y=Rain, fill=Type)) + geom_col(position="dodge")

... 显示第 2、3、4、5 根柱线通常高于第一个柱线,但后 8 根柱线较低。我需要以某种方式重新排序我的数据,方法是按“类型”中的值对我从不同数据帧计算出的预定义顺序进行排序。

希望清楚。

编辑: (这是使用我的完整数据集,但希望你能理解要点) position="dodge"

很明显每个“包”有 7 个系列。

但是在 position="identity" 中只出现了 5 个。每张图的轮廓可能会干扰系列之间的微小差异? position="identity"

您可以使用 forcats::fct_reorder()Rain 对值进行排序。这仅适用于 Type 值在 Year 中处于相同相对顺序的情况。在下面的闪避图中可以最好地看出这一点。

library(ggplot2)
library(plyr)
library(tidyr)
library(forcats)

ggplot(temp2, aes(x = FY, y = Rain,
                  fill = fct_reorder(Type, Rain),
                  colour = fct_reorder(Type, Rain))) + 
  geom_col(position="identity")


ggplot(temp2, aes(x = FY, y = Rain, fill = fct_reorder(Type, Rain))) + 
  geom_col(position="dodge")

reprex package (v2.0.1)

于 2022-05-09 创建