标度工具箱
和调整默认的标度一样,可以用新的标度完全覆盖它们。标度可以被严格的分为四组
- 连续位置标度,用来映射整数、数值、日期/时间输入到x轴和y轴
- 颜色标度,用来映射连续数据和离散数据到颜色上
- 人工标度,用来映射离散数据到所选的尺寸、线型或颜色中
- 同一型标度,用来绘制变量但不对它们进行放缩,如果数据是颜色名向量的话,这会很有用
1. 连续位置标度
每幅图都有两个位置标度,x和y。最常见的连续位置标度是scale_x_continuous()和scale_y_continuous(),它们线性地将数据映射到x和y轴。变换之后,可以得到最有意思的衍生效果。所有连续标度都需要一个trans参数,从而可以使用一系列变换
# 从燃料经济转为燃料消费
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
scale_y_continuous(trans = "reciprocal")
ggplot(diamonds, aes(price, carat)) + # x 和 y 轴进行对数变换
geom_bin2d() + scale_x_continuous(trans = "log10") +
scale_y_continuous(trans = "log10")
这种转换通过一种==“变换器(transformer)”==来实现,它描述变换本身和它的逆,以及绘制标签的方式
下表列出了较为常用的变换器
名称 | 变换函数f (x) | 逆变换函数f-1(y) |
---|---|---|
asn | tanh-1(x) | tanh(y) |
exp | ex | log(y) |
identity | x | y |
log | log(x) | ey |
log10 | log10(x) | 10y |
log2 | log2(x) | 2y |
logit | l o g ( x 1 − x ) log(\frac{x}{1-x} ) log(1−xx) | 1 1 + e ( y ) \frac {1}{1 + e(y)} 1+e(y)1 |
pow10 | 10x | log10(y) |
probit | ϕ ( x ) \phi(x) ϕ(x) | ϕ − 1 ( y ) \phi ^-1^ (y) ϕ−1(y) |
reciprocal | x-1 | y-1 |
reverse | -x | -y |
sqrt | x1/2 | y2 |
一些常见的变换有简写:scale_x_log10()、scale_x_sqrt()、scale_x_reverse()(y与之很类似)
当然,也可以自行变换。举例来说,可以直接绘制log10(x),而不使用scale_x_log10()。这两种做法将在绘图区域生成完全相同的结果,但坐标轴和刻度标签却是不同的。如果使用变换后的标度,坐标轴将按照原始的数据空间进行标注;如果变换了数据,坐标轴将按照变换后的数据空间进行标注
在这两种情况下,变换均在计算统计摘要之前发生。若要在计算统计摘要之后实行变换,可以使用coord_trans()。参看线性坐标系统了解更多细节
日期和时间值基本上属于连续型,但在标注坐标轴时有着特殊的处理方式。ggplot2支持属于date类的日期值和属于POSIXct类的日期时间值:如果时间值是其它格式的,则需使用as.Date()或as.POSIXct()对其进行转换。scale_x_date()与scale_x_datetime(0的工作原理和scale_x_continuous()相似,但是有特殊的date_breaks和date_labels参数来控制与日期相关的单位
- date_breaks和date_minor_breaks()允许通过时间单元单位(年、月、星期、天、小时、分钟、秒)使用位置中断。例如,date_breaks = "2 weeks"在每两周之间放置一个刻度线标记
- date_labels使用与strptime()和format()中相同的格式化字符串来控制标签的展示方式
编码 | 含义 |
---|---|
%S | 秒(00-59) |
%M | 分钟(00-59) |
%l | 小时,12小时制(1-12) |
%I | 小时,12小时制(01-12) |
%p | 上午/下午 |
%H | 小时,24小时制(00-23) |
%a | 缩写的周几(Mon-Sun) |
%A | 全称的周几(Monday-Sunday) |
%e | 某月中的某天(1-31) |
%d | 某月中的某天(01-31) |
%m | 以数值表示的月份(01-12) |
%b | 缩写的月份(Jan-Dec) |
%B | 全称的月份(January-December) |
%y | 不含世纪的年份(00-99) |
%Y | 含世纪的年份(0000-9999) |
如果想展示像14/10/1979这样的日期,可用"%d/%m/%Y"字符串
base <- ggplot(economics, aes(date, psavert)) +
geom_line(na.rm = TRUE) +
labs(x = NULL, y = NULL)
base # 默认中断和标签
base + scale_x_date(date_labels = "%y", date_breaks = "5 years")
base + scale_x_date(limits = as.Date(c("2004-01-01", "2005-01-01")), date_labels = "%b %y", date_minor_breaks = "1 months")
base + scale_x_date(limits = as.Date(c("2004-01-01", "2004-06-01")), date_labels = "%m/%d", date_minor_breaks = "2 weeks")