6.1 简介
# 标度(scale) 控制着数据到图形属性的映射
# 也为我们提供了读图时所使用的工具:坐标轴和图例
# 没有标度,就没有将数据转化为图形属性的途径
# 执行标度的过程分为三步
# 变换(transformation)
# 训练(training)
# 映射(mapping)
# 具体将在6.2节中阐述
# 关于默认标度以及修改它们的方法,详见6.3
# 标度可以粗略地分为四类
# 位置标度
# 颜色标度
# 手动离散型标度
# 同一型标度
# 常用选项和主要使用方法在6.4节
# 标度的另一个重要角色,是生成一个允许读图者从图形属性空间到数据空间进行反向映射的 引导元素(guide)
# 引导元素的外观皆由标度的参数控制,详见6.5
6.2 标度的工作原理
# 输入变量是离散型,标度定义域是某些值组成的集合
# 输入变量是连续型,标度定义域是一个实值的区间
# 以 msleep数据为例
library(ggplot2)
head(msleep)
summary(msleep)
unique(msleep$vore)
[1] "carni" "omni" "herbi" NA "insecti"
sleep_cycle awake brainwt bodywt
Min. :0.1167 Min. : 4.10 Min. :0.00014 Min. : 0.005
1st Qu.:0.1833 1st Qu.:10.25 1st Qu.:0.00290 1st Qu.: 0.174
Median :0.3333 Median :13.90 Median :0.01240 Median : 1.670
Mean :0.4396 Mean :13.57 Mean :0.28158 Mean : 166.136
3rd Qu.:0.5792 3rd Qu.:16.15 3rd Qu.:0.12550 3rd Qu.: 41.750
Max. :1.5000 Max. :22.10 Max. :5.71200 Max. :6654.000
NA's :51 NA's :27
# 定义域
# 离散型变量vore的定义域为 {carni,herbi,omni}
# 连续型变量bodywt的定义域为 [0.005,6654]
# 值域
# 离散型标度,它的值域是输入值对应的图形属性值组成的一个向量
# 连续型标度,它的值域是穿过某种更复杂空间的一条一维路径
# 将定义域映射到值域的过程包括以下阶段:
# 变换--》训练--》映射
6.3 用法
# 每一种图形属性都拥有一个默认的标度
# 在初始化整个图形和增加新图层时,默认的标度将被自动添加
# 如果要添加一个不同的标度或修改默认标度的某些特征
# 必须构造一个新的标度,然后使用+ 将其添加到图形上。
# 以 scale_开头,接下来是图形属性的名称(例如:colour_,shape_或x_)
# 最后以标度的名称结尾(例如:gradient,hue或manual)
# 示例:离散型数据颜色图形属性的默认标度 scale_colour_hue()
# 示例:填充色Brewer配色标度名为 scale_fill_brewer()
p <- qplot(sleep_total,sleep_cycle,data = msleep,colour = vore)
p
#显示添加默认标度
p + scale_colour_hue()
# 修改默认标度的参数,这里改变了图例的外观
p + scale_colour_hue("What does\nit eat?",breaks = c("herbi","carni","omni",NA),
labels = c("plants","meat","both","don't know"))
# 使用一种不同的标度
p + scale_colour_brewer(palette = "Set1")
6.4 标度详解
# 大致分为四组
# 1,位置标度 映射到绘图区域,以及构造对应的坐标轴
# 2,颜色标度 映射到颜色
# 3,手动标度 映射到符号大小、线条类型、形状或颜色,以及创建对应的图例
# 4,同一型标度 直接将变量值绘制为图形属性,而不去映射它们
6.4.1通用参数
# 1,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)))
# 2,limits:固定标度的定义域
# 任何不在标度定义域内的值 将被丢弃,丢弃过程发生在统计量的计算之前
# 3,breaks和labels
# breaks控制着显示在坐标轴或图例上的值
# 即 坐标轴上应该显示哪些刻度线的值
# labels指定了应在断点处显示的标签
# 如果设置了labels,必须同时指定breaks
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))
6.4.2 位置标度
# 每幅图形一定拥有两个位置标度,一个指定水平位置(x)
# 另一个指定竖直位置(y)
# 修改坐标轴的范围是一项常见任务
# ggplot2提供了辅助函数xlim 和 ylim
# xlim(10,20) 一个从10到20的连续型标度
# ylim(20,10) 一个从20到10的反转后连续型标度
# xlim("a","b","c") 一个离散型标度
# xlim(as.Date(c("2018-05-01","2018-08-01"))) 一个从2018-5-1到2018-8-1的日期型标度
## 连续型
# 最常用的连续型位置标度是 scale_x_continuous 和 scale_y_continuous
# 它们将数据映射到x轴和y轴
# 每个连续型标度可接受一个trans参数,允许进行变换
# 每一种变换都由所谓的“变换器” 来实现
# 变换器描述了变换本身和对应的逆变换,以及如何去绘制标签
# scale_x_log10() 与 scale_x_continuous(trans = "log10") 是等价的
# 我们可以直接绘制log10(x) ,而不使用 scale_x_log10()
# 这两种方法在绘图区域生成完全相同的结果,但坐标轴和刻度标签却是不同的
qplot(log10(carat),log10(price),data = diamonds)
qplot(carat,price,data = diamonds) + scale_x_log10() + scale_y_log10()
## 日期与时间
# 日期和时间值 基本上属于连续型,但在标注坐标轴时有着特殊的处理方式
# 暂时仅支持date类 和 POSIXct类的时间值
# 对于日期坐标轴,有三个参数可用于控制其外观和刻度的位置
# major,minor,format
# major 和minor 以按照时间的单位,指定主要和次要断点的位置,并且允许以这些单位的倍数出现
# 例如:major = "2 weeks" 将在每隔两周的位置放置一个主刻度
# format 指定刻度标签的格式
# 例如:14/10/2018形式显示日期,可以使用字符串“%d/%m/%y”
library(scales)
plot <- qplot(date,psavert,data =economics,geom= "line") + ylab("Personal savings rate") +
geom_hline(xintercept = 0,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"))
## 离散型
# 离散型位置标度将输入中的各水平映射为整数
# 结果的顺序可用参数breaks进行控制
# 不想要的水平可以使用limits(或 xlim(),ylim()) 进行丢弃
6.4.3 颜色标度
# 这里使用 hcl色彩空间的方案,它由三部分构成 色相(hue)、彩度(chroma)、明度(luminance)
# 色相 一个0和360之间的(角度)值,它将一种色彩赋予 颜色属性,如蓝、红、橙等
# 彩度 色彩的纯度,彩度为0是灰色,最大值随明度的变化而不同
# 明度 颜色的明暗程度,明度0为黑,明度1为白
# 连续型
# 根据颜色梯度中的色彩数量划分,共有三类连续型颜色梯度(即 渐变色)
# scale_colour_gradient(),scale_fill_gradient() 双色梯度
# scale_colour_gradient2(),scale_fill_gradient2() 三色梯度
# scale_colour_gradientn(),scale_fill_gradientn() 自定义的n色梯度
f2d <- with(faithful,MASS::kde2d(eruptions,waiting,h = c(1,10), n =50))
f2d
df <- with(f2d,cbind(expand.grid(x,y),as.vector(z)))
df
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
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包生成的调色板
## 离散型
# 默认的配色方案,即scale_colour_hue()
# 可通过沿着hcl色轮选取均匀分布的色相来生成颜色
# 默认配色对多于8种颜色的区分比较困难
# 另一个缺点,所有颜色拥有相同的明度和彩度,黑白打印时,难以分辨
# 另一种方案是使用 ColorBrewer配色
# 对于类别型数据中的点而言,使用调色板 Set1 ,Dark2
# 对面积而言,使用调色板 Set2,Pastel1,Pastel2,Accent
# 使用RColorBrewer::display.brewer.all 可列出所有调色板
point <- qplot(brainwt,bodywt,data = msleep,log = "xy",colour = vore)
point
area <- qplot(log10(brainwt),data = msleep,fill = vore,binwidth = 1)
area
point + scale_colour_brewer(palette = "Set1")
point + scale_colour_brewer(palette = "Set2")
point + scale_colour_brewer(palette = "Pastel1")
area + scale_fill_brewer(palette = "Set1")
area + scale_fill_brewer(palette = "Set2")
area + scale_fill_brewer(palette = "Pastel1")
6.4.4 手动离散型标度
# 离散型标度 scale_linetype() ,scale_size_discrete() 和 scale_shape()
# 这些标度仅仅是按一定的顺序将因子的水平映射到一系列取值中
# 想要定制这些标度,需要使用以下手动型标度创建新的标度
# 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_colour_manual(values = colours)
plot + aes(shape = vore) + scale_shape_manual(values = c(1,2,6,0,23))
6.4.5 同一型标度
# 当你的数据能被R中的绘图函数理解时
# 即 数据空间和图形属性空间相同时,可以使用同一性标度(identity scale)
# 意味着此时无法仅从数据本身派生出有意义的图例,所以默认是不绘制图例
6.5 图例和坐标轴
# 坐标轴和坐标被共同称为 引导元素
# 它们都是标度的逆函数,允许在图中读出观测并将其映射回原始值
# 图例标题(legend title) 和坐标轴名(axis label)是等价的,并且都由标度的名称参数(name)决定
# 图例标示(legend key) 和刻度标签(tick label) 都由标度的断点参数(break)决定
# 图例和坐标轴的内容是由标度控制的,而渲染的细节是由主题系统控制的。
# 以下是最常用的微调选项
# 1,标度name控制着坐标轴名和图例标题,可为字符串或数学表达式,语法详见 plotmath
# 2,breaks和labels是非常重要的标度函数参数,如果默认的断点不合适,设置这些参数即可
# 3,主题设置axis.* 和 legend.* 控制着坐标轴和图例的整体外观
# 4,内部网格线由主要断点和次要断点的参数控住。网格线的外观使用panel.grid.major,panel.grid.minor控制
# 5,图例的位置和对齐是使用主题设置legend.position 来控制的