统计转换和位置调整是ggplot2包中的重要概念,统计转换通常使用stat参数来引用,位置调整通常使用position参数来引用。

bin是分箱的意思,在统计学中,数据分箱是一种把多个连续值分割成多个区间的方法,每一个小区间叫做一个bin(bucket),这就意味着每个bin定义一个数值区间,连续值会落到相应的区间中。

一,统计转换图层

使用stat_函数可以减少图层的使用,从而引起对统计变换的注意,而不是视觉外观。

1,移除重复值

使用stat_unique()移除重复值:

stat_unique(mapping = NULL, data = NULL, geom = "point",
  position = "identity", ..., na.rm = FALSE, show.legend = NA,
  inherit.aes = TRUE)

参数注释:

  • geom:指定几何图层,默认值是point
  • position:位置调整,默认值是identity(不做位置调整)

使用unique的两种方式:

ggplot(dat, aes(x, y)) + geom_point(size=5,alpha=0.2,stat = "unique")
ggplot(dat, aes(x, y))+stat_unique(geom="point",size=5,alpha=0.2)

2,不改变数据

identity是对数据不做任何改变:

stat_identity(mapping = NULL, data = NULL, geom = "point",
  position = "identity", ..., show.legend = NA, inherit.aes = TRUE)

使用identity的两种方式:

stat="identity"
stat_identity()

3,计数

stat图层中有两种计数方式:

  • stat_count() :不需要分箱,计算每个x位置的数量,适用于离散或连续的x轴数据;
  • stat_bin():通过把x轴分箱并计算每个箱中的观测数量,适用于连续的x轴数据。

分箱计数转换默认的几何图形是bar,常用于直方图(geom_histogram(stat = "bin")中:

stat_bin(mapping = NULL, data = NULL, geom = "bar", position = "stack",
  ..., binwidth = NULL, bins = NULL, center = NULL, boundary = NULL,
  breaks = NULL, closed = c("right", "left"), pad = FALSE,
  na.rm = FALSE, show.legend = NA, inherit.aes = TRUE)

参数注释:

  • geom:指定几何图层;
  • bins:分箱的数量,默认值是30;
  • binwidth:分箱的宽度
  • breaks:数值向量,指定分箱的分割点
  • closed:有效值是right和left,用于指定分箱的区间是右边关闭,还是左边关闭。

计数转换的定义,默认值是条形图,常用于条形图(geom_bar(stat = "count"))中:

stat_count(mapping = NULL, data = NULL, geom = "bar",
  position = "stack", ..., width = NULL, na.rm = FALSE,
  show.legend = NA, inherit.aes = TRUE)

4,加和

stat_summary()用于在唯一的x值上求y值的加和,stat_summary_bin()用于对分箱的x值,求y值的加和。

stat_summary_bin(mapping = NULL, data = NULL, geom = "pointrange",
  position = "identity", ..., fun.data = NULL, fun.y = NULL,
  fun.ymax = NULL, fun.ymin = NULL, fun.args = list(), bins = 30,
  binwidth = NULL, breaks = NULL, na.rm = FALSE, show.legend = NA,
  inherit.aes = TRUE)

stat_summary(mapping = NULL, data = NULL, geom = "pointrange",
  position = "identity", ..., fun.data = NULL, fun.y = NULL,
  fun.ymax = NULL, fun.ymin = NULL, fun.args = list(), na.rm = FALSE,
  show.legend = NA, inherit.aes = TRUE)

5,椭圆转换

常用于散点图,把尽量多的散点包裹在椭圆中:

stat_ellipse(mapping = NULL, data = NULL, geom = "path",
  position = "identity", ..., type = "t", level = 0.95, segments = 51,
  na.rm = FALSE, show.legend = NA, inherit.aes = TRUE)

参数注释:

  • type :类型,默认值是t, 用于散点的t分布,norm 用于散点的正态分布,euclid绘制半径等于level的圆,
  • level:水平, 默认值是0.95,用于表示绘制椭圆的置信度,或者,如果type =“euclid”,则表示绘制圆的半径。
  • segments:绘制椭圆使用的段数量

 

二,位置调整图层

位置调整(Position adjustment)有多种实现方式:

  • identity:不调整
  • dodge:垂直方向不调整,只调整水平位置
  • dodge2:时dodge的特例,可以有变化的宽度
  • nudge:在一定的范围内调整水平和垂直位置
  • jitter:抖动,当具有离散位置和相对较少的点数时,抖动很有用
  • jitterdodge:同时jitter和 dodge
  • stack:堆叠
  • fill:填充,用于条形图

每个位置调整都对应一个函数position_xxx()。

1,不调整位置

position="identity"
position=position_identity()

2,dodge调整(避开)

dodge保留垂直方向,而调整水平方向。dodge2是dodge的特例,用于组织箱线图(box plot)、条形图(bar plot)和矩形图(rectangle),可以设置可变的宽度。

position_dodge(width = NULL, preserve = c("total", "single"))

position_dodge2(width = NULL, preserve = c("total", "single"),
  padding = 0.1, reverse = FALSE)

参数注释:

preserve:有效值是total和single,如果设置为total表示避开一个位置上的所有元素的总宽度,single表示避开一个位置上单个元素的宽度。

3,jitter调整(抖动)

在一定的范围内抖动调整,移动的位置是随机的:

position_jitter(width = NULL, height = NULL, seed = NA)

4,jitterdodge调整

该模式是dodge和jitter的组合,同时进行抖动和避开调整

position_jitterdodge(jitter.width = NULL, jitter.height = 0,
  dodge.width = 0.75, seed = NA)

5,nudge调整(移动)

 该模式把位置移动特定的距离,移动的距离是已知的:

position_nudge(x = 0, y = 0)

6,stack调整(堆叠)

用于条形图,堆叠调整是使多个条形图堆叠起来,而填充调整是每个条形图堆叠,并使其都具有相同的高度:

position_stack(vjust = 1, reverse = FALSE)
position_fill(vjust = 1, reverse = FALSE)

三,标度(Scale)

标度(scale)控制数据被转换为可视的属性,使用标度可以覆盖默认的设置,以调整(tweak)轴标签(axis label),或图例键(legend key)的显示属性,或则使用完全不同的方法以实现从数据到美学(aes)的转换,例如,labs()和lims()函数。常用的标度是:x、y、size、shape、linetype、alpha、color和fill,对于每个标度,都有相应的标度函数来控制。

1,标度的标签和范围属性

设置标度的标签属性,例如,对于color标度,设置的是color图例的lable属性:

labs(x='xlab',y='ylab',title='plot title',subtitle ="sub title",caption = "caption",color="the label of scale_color")

设置标度取值的范围,对于color标度,设置的是color取值的范围:

lims(x=c(min,max),y=c(min,max),colour = c("4", "6", "8"))

2,标度函数

在每个标度函数中, 控制每个标度的属性:

  • scale_aplha_xxx()
  • scale_color_xxx()
  • scale_fill_xxx()
  • scale_x_xxx()
  • scale_y_xxx()
  • scale_shape_xxx()
  • scale_size_xxx()
  • scale_linetype_xxx()

(1)设置y轴的标签显示为百分数

设置y轴显示为百分数

scale_y_continuous(labels = scales::percent,limits=c(y.min,1))

 (2)增加辅助坐标

 增加一个辅助坐标

sec_axis(trans = NULL, name = waiver(), breaks = waiver(),  labels = waiver())
dup_axis(trans = ~., name = derive(), breaks = derive(),  labels = derive())

参数注释:

  • trans:转换公式(transformation formula),是对主坐标轴的转换
  • name:辅助坐标轴的名称
  • breaks:设置断点
  • labels:断点的标签
  • derive():导出函数,表示和主坐标轴的name、breaks和labels保持一致

例如,对于转换参数,如果设置为:

  • trans = ~ . * 1, 则表示辅助坐标一一映射主坐标:
  • trans = ~ . + 10, 则表示辅助坐标是主坐标值+10;

示例代码,使用坐标轴标度的sec.axis属性来引用该函数:

ggplot(mtcars, aes(cyl, mpg)) +
  geom_point()+
  scale_x_continuous(sec.axis = sec_axis(~.+10))


四,向导(guide)

向导(guide)用于帮助读者更容易理解坐标轴(axes)和图例(legend),用于对标度进行调整。

1,图例向导

图例(legend)位置绘图区域(plot)之外,是对图层分组的一个说明,图例向导(legend guide)用于控制图例的显示:

guide_legend(title = waiver(), title.position = NULL, title.theme = NULL,
  title.hjust = NULL, title.vjust = NULL, label = TRUE,
  label.position = NULL, label.theme = NULL, label.hjust = NULL,
  label.vjust = NULL, keywidth = NULL, keyheight = NULL,
  direction = NULL, default.unit = "line", override.aes = list(),
  nrow = NULL, ncol = NULL, byrow = FALSE, reverse = FALSE, order = 0,
  ...)

参数说明:

  • title:图例的标题,设置为NULL,那么标题不显示
  • title.position:标题的位置
  • title.theme:用于指定渲染标题的主题对象(theme)
  • title.hjust、title.vjush:标题的水平、垂直调整
  • lable:逻辑值,图例中的小标签是否显示
  • keywidth、keyheight:图例中的key的宽度和高度
  • default.unit:字符类型,用于指定keywidth和keyheight的单位,参考  grid::unit()
  • direction:方向,有效值是"horizontal" 和 "vertical"
  • nrow、ncol:图例摆放的行和列的数量
  • byrow:逻辑值,是否按照行来摆放图例
  • reverse:逻辑值,是否把图例的属性逆转

2,颜色板向导

颜色板向导显示连续的颜色标度,用于设置前景色(scale_colour)和填充色(scale_fill)的标度中:

guide_colorbar(title = waiver(), title.position = NULL,
  title.theme = NULL, title.hjust = NULL, title.vjust = NULL,
  label = TRUE, label.position = NULL, label.theme = NULL,
  label.hjust = NULL, label.vjust = NULL, barwidth = NULL,
  barheight = NULL, nbin = 20, raster = TRUE, frame.colour = NULL,
  frame.linewidth = 0.5, frame.linetype = 1, ticks = TRUE,
  ticks.colour = "white", ticks.linewidth = 0.5, draw.ulim = TRUE,
  draw.llim = TRUE, direction = NULL, default.unit = "line",
  reverse = FALSE, order = 0, available_aes = c("colour", "color",
  "fill"), ...)


参数注释:

  • barwidth、barheight:用于指定颜色板的宽度和高度
  • label:逻辑值,图例中的小标签
  • ticks:逻辑值,图例中的刻度
  • ticks.linewidth:图例中的刻度的线宽
  • draw.ulim、draw.llim:逻辑值,是否显示上限/下限刻度
  • frame.colour :颜色板描边的的颜色,默认值是NULL,不会描边
  • frame.linewidth :颜色板描边的线宽
  • frame.linetype:颜色板描边的线的类型
  • nbin:分箱的数量,值越大,颜色越平滑
  • raster:逻辑值,默认值是TRUE,把颜色板渲染成光栅图,如果设置为FALSE,把颜色板渲染成矩形图的集合。

颜色板向导的用法:

scale_fill_continuous(guide = "colorbar")
scale_fill_continuous(guide = guide_colorbar())
guides(fill = guide_colorbar())

3,标度向导

为每个标度设置向导,两个常用的向导是图例向导(legend)和颜色板向导(colorbar),前者对应的向导函数是guide_legend(),后者对应的向导函数是guide_colorbar(),常用的标度是:size、shape、linetype、alpha、color和fill。对于color和fill,应使用colorbar向导,其他的标度都是legend向导。

guides(...)

标度向导的设置方式多种多样,使用aes()函数来设置图例:

p <- ggplot(dat, aes(x, y, colour = p, size = q, shape = r)) + geom_point()

使用guides()函数来设置图例:

p + guides(colour = "colorbar", size = "legend", shape = "legend")

使用guides()函数和向导函数来设置图例:

p + guides(colour = guide_colorbar(), size = guide_legend(),  shape = guide_legend())

使用标度来设置图例:

p +
 scale_colour_continuous(guide = "colorbar") +
 scale_size_discrete(guide = "legend") +
 scale_shape(guide = "legend")

如果要移除图例,只需要在向导函数设置标度值为"none":

p + guides(colour = "none")

参考文档:

ggplot2 Reference

Layer: stats

Layer:Position adjustment

Data Binning and Plotting

HOW TO SUSS STATS IN GGPLOT2 IN R