浅析ggplot `aes(group=var)`的用法
我们都知道ggplot功能非常强大,可以自动完成很多任务,比如根据fill
或color
自动添加legend,并自动对数据进行分组,然后对每个分组进行处理。但是某些情况下,自动分组会产生奇怪的图形,这时候就需要显式设置group
以实现目的.
默认分组
默认分组分为两种
- 根据所有离散变量的组合对数据进行分组,如
x
为离散变量时,根据x
的值对data
进行分组,等价于dplyr::group(data, x)
. - 根据图形属性(映射到分类数据)分组,如
fill
。以箱型图为例(boxplot
),它用于图形表征离散数据的几个统计特征,默认情况下会根据x
轴的分类数据进行分组,如下所示
library(ggplot2)
# sample data
diamonds2 <- dplyr::filter(diamonds,
cut %in% c("Fair", "Ideal"),
clarity %in% c("I1", "IF")
)
p1 <- ggplot(diamonds2, aes(x = cut, price)) +
geom_boxplot()
p2 <- ggplot(diamonds2, aes(x = cut, price, fill = clarity)) +
geom_boxplot()
cowplot::plot_grid(p1, p2, nrow = 1)
默认分组结果不对,显式指定group
需要显式指定aes(group)
常见于以下两种情况
一是覆盖默认分组。如果geom
中x
或y
为离散变量,默认会基于它们进行分组,如果我们想基于其他变量进行分组时,需要显示指定group
覆盖默认分组。
如下图所示,我们首先基于Occasion
进行分组画各个情况下男孩的身高情况(箱图)。随后我们想对每个男孩不同时期身高变化情况,这时候需要基于Subject
进行分组画出线图,那么画线图时必须指定group
p1 <- ggplot(nlme::Oxboys, aes(Occasion, height)) +
geom_boxplot()
p2 <- p1 + geom_line(aes(group = Subject), colour = "blue")
cowplot::plot_grid(p1, p2, nrow = 1)
二是不需要分组。如果图中存在分类变量,但是我们不想进行分组,那么可指定group
为任意常数,表示不进行分组,对整体数据进行处理。
如下图所示目的是展示不同切面(cut
)钻石的的比例,但是默认情况下基于cut
变量进行分组,所以在计算比例时是基于本组数据,显然都为1。我们需要显示指定group
为常数,表示基于整体数据计算比例。
p1 <- ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, y = ..prop..))
p2 <- ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, y = ..prop.., group = 1))
cowplot::plot_grid(p1, p2, nrow = 1)