第6章 标度、坐标轴和图例
目录
- 6.1 简介
- 6.2 标度的工作原理
- 6.3 用法
- 6.4 标度详解
- 6.5 图例和坐标轴
6.1 简介
标度(scale)控制着数据到图形属性(位置、颜色、形状、大小和线条类型)的映射。
执行标度的过程分为三步:变换、训练和映射。
标度的另外一个重要角色,是生成一个允许读者从图形属性到数据空间进行反向映射的引导元素(guide)
6.2 标度的工作原理
标度的定义域:数据空间; 标度的值域:图形属性空间。
将定义域映射到值域的过程包括以下三个阶段:变换,训练和映射。
6.3 用法
每一种图形属性都拥有一个默认的标度,此标度将在我们每次使用这个图形属性时被自动添加到图形中。
按照图形属性和变量类型排列的各种标度:
颜色(colour)和填充色(fill):brewer, grey, hue,identity,manual(离散型);gradient, gradient2, gradientn(连续性)
位置(position)(x,y): discrete(离散型), continuous,date(连续型)
形状(shape): shape, identity, manual(离散型)
线条类型(linetype): manual,identity,manual(离散型),size(连续型)
标度构建器:以scale_开头,接下来是图形属性的名称,例如colour_, shape_, x_, 最后以标度的名称结尾,如gradient,hue,manual
library(ggplot2)
p <- qplot(sleep_total, sleep_cycle, data = msleep, colour = vore)
p
## 显示添加默认标度
p + scale_colour_hue()
## 修改默认标度的参数,这里改变了图例的外观
p + scale_colour_hue("What does\n it eat?", breaks = c("herbi", "carbi","omni",NA), labels = c("plants", "meat", "both", "don't know"))
## 使用不同的标度
p + scale_colour_brewer(palette = "Set1")
6.4 标度详解
标度大致分为四组:位置标度,颜色标度,手动标度,同一型标度。
6.4.1 通用参数
以下参数对所有标度适用:
name:设置坐标轴或图例上出现的标签,可使用字符串(\n换行)或数学表达式(详见?plotmath),比如expression(frac(x,y))
limits: 固定标度的定义域。限制定义域可以帮助我们移除不想在图形上展示的数据。
breaks和labels: breaks控制着显示在坐标轴或图例上的值,labels指定了应在端点处显示的标签,若设置labels必须设置breaks。
formatter:如果未指定任何标签,则将在每个断点处自动调用格式刷(formatter)来格式化生成标签。对于连续型标度,可用的标签刷为:comma,percent,dollar和scientific;对于离散型则为abbreviate。
6.4.2 位置标度
每一幅图均有两个位置标度:一个指定水平位置,一个指定垂直位置。
修改坐标轴的范围可以使用辅助函数xlim()和ylim(),例如:xlim(10, 20); ylim(20, 10); xlim("a", "b", "c"); xlim(as.Date(c("2008-05-01", "2008-08-01")))
可以使用expand()函数来控制溢出量,用法expand = c(0, 0), 第一个元素是给出的乘式的溢出量,第二个参数给出的是加式的溢出量
连续型
最常用的是scale_x_continuous 和 scale_y_continuous,每个连续型标度均可接受一个trans参数,允许指定若干线性或者非线性变换
scale_x_log10()和scale_x_continuous(trans = "log10")是等价的。
例子:对标度进行对数变换(左图)和对数据进行对数变换的异同,图形主体是完全相同的,但是坐标轴上的标签是不同的。
qplot(log10(carat), log10(price), data = diamonds)
qplot(carat, price, data = diamonds) + scale_x_log10() + scale_y_log10()
日期和时间
仅支持属于date类的日期值和属于POSIXct类的时间值,需要使用as.Date()或as.POSIXct()
对于日期坐标轴,三个参数,major和minor用以按照时间的单位来指定主要和次要断点的位置,并且允许以这些单位的倍数出现;参数format指定了刻度标签的格式,比如"%d/%m/%y"
例子:个人储蓄率的时间序列图形,不同的时间间隔划分
library(scales)
plot <- qplot(date, psavert, data = economics, geom = "line") +
ylab("Personal savings rate") +
geom_hline(yintercept = 0, colour = "grey50")
plot
plot + scale_x_date(breaks = date_breaks("10 years"))
plot + scale_x_date(
limits = as.Date(c("2004-01-01", "2005-01-01")), labels = date_format("%Y-%m-%d")
)
离散型
离散型位置标度将输入中的各水平映射为整数,不想要的水平可以使用limits进行丢弃。
6.4.3 颜色标度
R中的颜色标度为hcl色彩空间,由三部分构成,分别是色相(hue),彩度(chroma)和明度(luminance)。色相被映射为角度,彩度被映射为半径,每个分面中的明度(亮度)是一个常数。
- 连续型:共有三类连续型颜色梯度,scale_colour_gradient(), scale_fill_gradient(),双色梯度;scale_colour_gradient2()和scale_fill_gradient2(),三色梯度;scale_colour_gradientn()和scale_fill_gradientn(),自定义的n色梯度。
例子:二维核密度估计表面,三个色带
library(MASS)
f2d <- with(faithful, MASS::kde2d(eruptions, waiting, h = c(1, 10), n = 50))
df <- with(f2d, cbind(expand.grid(x, y), as.vector(z)))
names(df) <- c("eruptions", "waiting", "density")
erupt <- ggplot(df, aes(waiting, eruptions, fill = density)) +
geom_tile() +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0))
erupt + scale_fill_gradient(limits = c(0, 0.04))
erupt + scale_fill_gradient(limits = c(0, 0.04), low = "white", high = "black")
erupt + scale_fill_gradient2(limits = c(-0.04, 0.04), midpoint = mean(df$density))
例子:自定义的颜色梯度,使用vcd包生成的可被良好感知的调色板创建的梯度性颜色标度
library(vcd)
fill_gradn <- function(pal){
scale_fill_gradientn(colours = pal(7), limits = c(0, 0.04))
}
erupt + fill_gradn(rainbow)
erupt + fill_gradn(div_gradient_pal())
erupt + fill_gradn(heat.colors)
- 离散型
离散型数据默认的配色方案是scale_colour_hue(),可通过沿着hcl色轮选取均匀分布的色相来生成颜色。
例子:展示了应用于点和条形的三种调色板
point <- qplot(brainwt, bodywt, data = msleep, log = "xy", colour = vore)
area <- qplot(log10(brainwt), data = msleep, fill = vore, binwidth = 1)
point + scale_color_brewer(palette = "Set1")
point + scale_color_brewer(palette = "Set2")
point + scale_color_brewer(palette = "Paste11")
area + scale_fill_brewer(palette = "Set1")
area + scale_fill_brewer(palette = "Set2")
area + scale_fill_brewer(palette = "Paste11")
6.4.4 手动离散型标度
scale_shape_manual(), scale_linetype_manual(), scale_colour_manual(),手动型标度拥有一个重要参数values,可以使用这个来指定标度应该生成的值。
例子:使用手动型标度创建自定义颜色标度和自定义形状标度
plot <- qplot(brainwt, bodywt, data = msleep, log = "xy")
plot + 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")
plot + aes(colour = vore) + scale_color_manual(values = colours)
plot + 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 = "below")) +
geom_line(aes(y = level +5, colour = "above")) +
scale_colour_manual("Direction", values = c("below" = "blue", "above" = "red"))
6.4.5 同一型标度
数据空间和图形属性空间相同时,可以使用同一型标度,此时是默认不绘制图例的,但是仍然可以通过使用参数breaks和labels设定。
6.5 图例和坐标轴
坐标轴和图例被共同称为引导元素,它们都是标度的逆函数:它们允许你在图中读出观测并将其映射回原始值。
图例和坐标轴的内容是由标度控制的,而渲染的细节是由主题系统控制的。
标度name控制着坐标轴名称和图例标题,字符串或者数学表达式(?plotmath)
breaks和labels控制着哪些标签显示在坐标轴上
主题设置axis., legend.控制着坐标轴和图例的整体外观
内部网格线由主要断点和次要断点的参数控制。主要网格线是可乘的,次要网格线是可加的。网格线的外观是使用panel.grid.major和panel.grid.minor两个主题设置来控制的。
图例的位置和对齐使用legend.position来控制。