重新排序绘图中的重叠条,以便较长的条在后面 -R

Reorder Overlaid Bars in Plot so Longer Bars are in back -R

我有一个要叠加的条形图。问题是较长的条覆盖较短的条。 excel 中有一个函数允许将较长的条推到后面,将较短的条推到最前面。我如何在 R 中做到这一点?

我的代码如下:

ggplot(df2) +geom_bar(aes(x = id, y = `Feb-20`), position = "identity",stat="identity", fill = 'green') +
  geom_bar(aes(x = id, y = `Mar-20`), position = "identity", stat="identity",fill = 'navy') +
  geom_bar(aes(x = id, y = `Apr-20`), position = "identity", stat="identity", fill = 'red') 

并生成此图表:

现在,我看到了一些通过改变透明度来解决这个问题的方法。由于我有三个因素,所以更改 alpha 不是很清楚:

如何更改条形图的叠加顺序,使较长的条形图在后面?

如果您要绘制条形图,我建议您切换到 geom_col,但提供 x=y= 美学。 See here for the documentation explanation。话虽如此,它会以任何一种方式工作。基本上:

  • Tidy Data:我无法确认,但您的数据集 df2 似乎没有按照 Tidy Data Principles 组织,这使得使用 ggplot2 和许多其他数据分析方法,事情就容易多了。不要让你的 y 值在 df2$Mar-20df2$Apr-20 之间拆分,你应该有一列用于类别(我们称之为 df2$date)和一列用于实际值 df2$y .然后你会接到一个 geom_bar 的电话,给出 aes(x=id, y=y)。您可以通过 reshape2 包中的 dplyr::gather()melt 执行此操作。

  • 排列数据: 在任何其他影响(例如因子水平的排序)之外,ggplot2 中的绘图函数将根据 x=y= 美学的实际数据框的排列绘制数据。这意味着如果您预先根据特定的非因子值对数据进行排序,这将决定 ggplot2 绘制的顺序。因此,您应该在绘图之前根据降序 df2$y 对绘图进行排序,以使最大的条形图最先绘制,最小的条形图最后绘制,这意味着最小的将在前面。

这是一个包含虚拟数据的完整示例:

library(ggplot2)
library(dplyr)

set.seed(1234)
df <- data.frame(
  x=rep(LETTERS[1:10],3),
  y=sample(1:100,30,replace=TRUE),
  id=c(rep('Group1',10),rep('Group2',10),rep('Group3',10))
)

df %>%
arrange(-y) %>%
ggplot(aes(x,y)) + theme_bw() +
  geom_bar(aes(fill=id),stat='identity',position=position_identity())

尝试不使用 arrange() 函数的 ggplot() 函数,您会发现效果就是您想要的。