简介
标度(scale)控制着数据到图形属性的映射。标度将我们的数据转化为视觉上可以感知的东西:例如大小、颜色、位置或形状。标度也为我们提供了读图所使用的工具:坐标轴和图例(总的来说可称为引导元素)。
标度的工作原理
要阐明标度的工作原理,首先需要了解标度的定义域(即数据空间)和标度的值域(即图形属性空间),然后说明两者之间进行映射的过程。
输入变量可能是离散型,也可能是连续型的,但只需要关注他们作为标度输入的本质————一个函数的定义域。
标度的值域也可以是离散型或连续型的。对于离散型标度,它的值域是输入值对应的图形属性值组成的一个向量。对于连续型标度,它的值域是穿过某种更复杂空间的一条一维路径。
将定义域映射到值域的过程包括以下阶段:
- 变换:(仅针对连续型的定义域)对数据进行变换后再进行展示往往是有益的,例如对数据取对数或开根号。
- 训练:在这个关键的阶段,将通过学习(learning)得到标度的定义域。有时,学习某个标度的定义域相当简单直接:在一个仅有一个图层且仅呈现原始数据的图形中,这个学习过程包括确定某个(变换后的)连续型变量的最小值和最大值,或者是列出某个类别型变量的所有水平。
- 映射:执行这个映射数据到图形属性的函数。
用法
如果要添加一个不同的标度或修改默认标度的某些特征,我们必须构造一个新的标度,然后使用 + 将其添加到图形上。所有的标度构建器(scale constructor)都拥有一套通用的命名方案。它们以scale
开头,接下来是图形属性的名称(例如,colour、shape或x_),最后以标度的名称结尾(例如,gradient、hue或manual)。
标度详解
标度可大致分为四组:
- 位置标度,用于将连续型、离散型和日期-时间型变量映射到绘图区域,以及构造对应的坐标轴。
- 颜色标度,用于将连续型和离散型变量映射到颜色。
- 手动标度,用于将离散型变量映射到我们选择的符号大小、线条类型、形状或颜色,以及创建对应的图例。
- 同一型标度,用于直接将变量值绘制为图形属性,而不去映射他们。
通用参数
以下参数对所有标度通用。
- name: 设置坐标轴或图例上出现的标签。有三个辅助函数
xlab()
,ylab()
和labs()
可以让我们减少部分键入。下面给出例子:
p <- qplot(cty, hwy, data = mpg, colour = displ)
p
p + scale_x_continuous("City mpg")
p + xlab("City mpg")
p + ylab("Highway mpg")
p + labs(x = "City mpg", y = "Highway", colour = "Displacement")
p + xlab(expression(frac(miles, gallon)))
limits: 固定标度的定义域。连续型标度接受一个长度为2的数值型向量;离散型标度接受一个字符型向量。一旦设定了limits,数据将不再进行任何训练。
breaks和labels:breaks控制着显示在坐标轴或图例上的值,即,坐标轴上应该显示哪些刻度线的值,或一个连续型标度在一个图例中将被如何分段。labels指定了应在断点处显示的标签。若设置了labels,则必须同时指定breaks,只有这样,这两个参数才能被正确匹配。区分两者:breaks影响显示在坐标轴和图例上的元素,而limits影响显示在图形上的元素。
p <- qplot(cyl, wt, data = mtcars)
p
p + scale_x_continuous(breaks = c(5.5, 6.5))
p + scale_x_continuous(limits = c(5.5, 6.5))
p <- qplot(wt, cyl, data = mtcars, colour = cyl)
p
p + scale_colour_gradient(breaks = c(5.5, 6.5))
p + scale_colour_gradient(limits = c(5.5, 6.5))
- formatter: 如果未指定任何标签,则将在每个断点处自动调用格式刷(formatter)来格式化生成标签。对于连续型标度,可用的标签刷为:comma,percent,dollar和scientific;对于离散型标度,则为abbreviate。
位置标度
每幅图形一定拥有两个位置标度,一个指定水平位置(x标度),另外一个指定竖直位置(y标度)。ggplot2提供了连续型、离散型(针对因子型、字符型和逻辑型向量)以及日期型标度。
连续型
最常用的连续型位置标度是scale_x_continuous
和scale_y_continuous
,它们均将数据映射到x轴和y轴。而最有趣的变式是通过变换来生成的。每个连续型标度均可接受一个trans参数,允许指定若干种线性或非线性的变换。下面展示一种图相同而标签不同的例子:
qplot(log10(carat), log10(price), data = diamonds)
qplot(carat, price, data = diamonds) + scale_x_log10() + scale_y_log10()
日期和时间
对于日期坐标轴,有三个参数可用于控制其外观和刻度的位置:major、minor以及format。
离散型
离散型位置标度将输入中的各水平映射为整数。结果的顺序可用参数breaks进行控制,不想要的水平可以使用limits(或使用xlim()
或ylim()
)进行丢弃。
颜色标度
有相当多的方法用来将值映射为颜色:对连续型值有三种基于渐变的方法,对离散型值有两种方法。具体实现细节参考文档。
手动离散型标度
首先演示scale_manual()
的使用方法。
p <- qplot(brainwt, bodywt, data = msleep, log = "xy")
p + aes(colour = vore) + scale_colour_manual(values = c("red", "orange", "yellow", "green", "blue"))
colours <- c(carni = "red", "NA" = "orange", insecti = "yellow", herbi = "green", omni = "blue")
p + aes(colour = vore) + scale_colour_manual(values = colours)
p + aes(shape = vore) + scale_shape_manual(values = c(1, 2, 6, 0, 23))
有时可能需要在同一幅图上展示多个变量并显示一个有用的图例,下面的例子就是这种用法。
huron <- data.frame(year = 1875:1972, level = LakeHuron)
ggplot(huron, aes(year)) + geom_line(aes(y = level - 5), colour = "blue") + geom_line(aes(y = level + 5), colour = "red")
ggplot(huron, aes(year)) + geom_line(aes(y = level - 5, colour = "below")) + geom_line(aes(y = level + 5, colour = "above"))
ggplot(huron, aes(year)) + geom_line(aes(y = level - 5, colour = "below")) + geom_line(aes(y = level + 5, colour = "above")) + scale_colour_manual("Direction", values = c("below" = "blue", "above" = "red"))
同一型标度
当数据能被R中的绘图函数理解时,即数据空间和图形属性空间相同时,可以使用同一型标度(identity scale)。这就意味着此时无法仅从数据本身派生出有意义的图例,所以默认是不绘制图例的。
图例和坐标轴
坐标轴和坐标被共同称为引导元素,它们都是标度的逆函数:它们允许你在图中读出观测并将其映射回原始值。
参考文献
[1][ggplot2:数据分析与图形艺术]