统计转换和位置调整是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