浅析ggplot `aes(group=var)`的用法


我们都知道ggplot功能非常强大,可以自动完成很多任务,比如根据fillcolor自动添加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)常见于以下两种情况

一是覆盖默认分组。如果geomxy为离散变量,默认会基于它们进行分组,如果我们想基于其他变量进行分组时,需要显示指定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)


一路嘿嘿

Bioinformatics, R enthusiast. Thoughts on reasarch, personal experience and other distractions.

Tags

blogdown font ggplot git github github pages Homebrew html hugo icon liner algebra linux machine learning R scholar sublime text 3 tidyverse