我有一个要覆盖的条形图。问题是较长的条覆盖了较短的条。 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。话虽这么说,它将以任何一种方式起作用。基本上:
整洁的数据:我无法确认,但是看来您的数据集df2
并未按照Tidy Data Principles进行组织,这使ggplot2
和许多其他数据分析方法变得更加容易。而不是让y值在df2$Mar-20
和df2$Apr-20
之间分配,您应该有一列用于类别(将其称为df2$date
)和一列用于实际值df2$y
。然后,您将有一个呼叫geom_bar
,即得到aes(x=id, y=y)
。您可以通过dplyr::gather()
包中的melt
或reshape2
来执行此操作。
[排列数据:在不受任何其他影响(例如因子水平的排序)的影响下,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())
尝试使用不具有ggplot()
功能的arrange()
功能,您会看到效果就是您想要做的。