今天来学习第六章标度部分的最后一节~

6.6 标度工具箱(Scales Toolbox)

除了调整标度的默认选项之外,你也可以重新创建新的标度,主要分为以下四类:

  1. 连续型位置标度:用于将整数、数值、日期/时间数据映射到x轴或者y轴的位置上;
  2. 颜色标度:用于将连续型或离散型变量映射到颜色;
  3. 手动离散型标度:将离散型变量映射到你选择的大小、形状、颜色、线条等;
  4. 同一型标度:当你的数据能被R中的绘图函数理解时,数据空间和图形属性空间相同时,可以使用同一型标度,此时默认不绘制图例的

下面我们四种图例详细说明:

1. 连续型位置标度(Continuous Position Scales)

每个图表都有两个位置标度,即x和y。因此,最常见的连续型位置标度就是scale_x_continuous()scale_y_continuous(),它们可以将数据映射到x轴和y轴。

每个连续型标度都可以接受一个trans参数,允许指定若干种显性或非线性变换。每一种变换都是由所谓的变换器(“transformer”)实现的。下表是比较常用的变换器:

(截图选自《ggplot2(第一版)》)

注意:在最近更新的第二版ggplot2中,表中的倒数命令(recip)已经改为(reciprocal),其他未更新。

如下例,将y轴转换为倒数(reciprocal):

ggplot(mpg, aes(displ, hwy)) +geom_point() +scale_y_continuous(trans = "reciprocal")

将x轴/y轴数值转化成log10:

ggplot(diamonds, aes(price, carat)) +geom_bin2d() +scale_x_continuous(trans = "log10") +scale_y_continuous(trans = "log10")

其中有一些参数有简写形式,如,scale_x_log10()scale_x_sqrt()scale_x_reverse()

另外,变换器同样可以用于coord_trans()中,此时变换将在统计量计算完成后进行,详见第七章

日期和时间值基本上属于连续型,但在标注坐标轴时处理方式稍有不同。我们使用DatePOSIXct类的时间值。如果是其他格式的,则应当使用as.Dateas.POSIXct进行转换。

scale_x_date()scale_x_datetime()的用法和scale_x_continous用法相似。

date_breaks()date_labels()的用法稍有不同:

  • date_breaks()date_minor_breaks():可以设置日期间隔(年、月、星期、日、小时、每分、每秒)作为断点,;例如date_breaks = "2 weeks"
  • date_labels():通过strptime()format()指定特殊格式,如下表

例如,如果你想以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")

取其中一小段时间("2004-01-01" - "2005-01-01"),按1个月为间隔:

base + scale_x_date(limits = as.Date(c("2004-01-01", "2005-01-01")),date_labels = "%b %y",date_minor_breaks = "1 month"
)

取其中一小段时间("2004-01-01" - "2004-06-01"),两个星期为间隔:

base + scale_x_date(
limits = as.Date(c("2004-01-01", "2004-06-01")),
date_labels = "%m/%d",
date_minor_breaks = "2 weeks"
)

2. 颜色标度

除了位置之外,颜色是最常用的图形属性。有很多方法可以将“值”映射成颜色

在最新的版本里,对于连续型变量,有四种基于渐变设置颜色的标度;
对于离散型变量,也有四种设置颜色的标度

这里作者讲了一部分关于色彩学的基础理论。颜色是由不同波长的光混合而成的,人类的眼球有三种不同颜色的感受器,所以我们使用三个数字来表示任意颜色,就是rgb编码,这个色彩空间使用红绿蓝三种光强表示一种颜色,但是它在视觉上的感知并不均匀,由于色彩空间中位置不同,两种间隔一个单位的颜色可以非常相似也可能非常不同,这使得创建连续变量到一个颜色集的映射变得十分困难。

在ggplot2中,使用了一种名为HCL色彩空间(Hue-Chroma-Luminance)的现代方案,由三个部分构成,分别是色相(hue)、彩度(chroma)以及明度(luminance)
1. 色相:是一个从0到360的角度值,将一种色彩赋予颜色属性(如红橙黄蓝等等)
2. 明度:颜色的明暗程度,即看其接近黑色或白色的程度,明度0是黑色,1是白色。
3. 彩度:色彩的纯度。0是灰色,彩度的最大值随明度变化而不同

下图是这个色彩空间的三维形状,每个分面中明度是一个常数,色相被映射成一个角度,彩度被映射成半径,可以看到每个分面的中心都是灰色的,离边缘越近颜色越浓烈:

Wikipedia上的HCL色彩空间长这样

↓↓↓

连续型

在最新版本的ggplot2中,根据颜色梯度中的色彩数量划分,有四类连续性颜色梯度

  1. 双色梯度 —— scale_colour_gradient()scale_fill_gradient():顺序为从低到高,使用lowhigh两个参数控制此梯度两端的颜色

举例,使用faithfuld数据集(黄石公园老忠实泉两次爆发的间隔时间和每次喷发的时长)做光栅图(Raster),颜色标度为默认值时:

erupt <- ggplot(faithfuld, aes(waiting, eruptions, fill = density)) +geom_raster() +scale_x_continuous(NULL, expand = c(0, 0)) +scale_y_continuous(NULL, expand = c(0, 0)) +theme(legend.position = "none")
## 不修改颜色标度
erupt

修改颜色标度:

## 黑白渐变
erupt + scale_fill_gradient(low = "white", high = "black")

## 其他颜色渐变
erupt + scale_fill_gradient(low = munsell::mnsl("5G 9/2"),high = munsell::mnsl("5G 6/8")
)

  1. 三色梯度渐变 —— scale_colour_gradient2()scale_fill_gradient2():和双色渐变类似,顺序为低-中-高。中点的默认值是0,但是可以使用参数midpoint加以设置为任意值。着多个参数对于形成发散型(diverging)配色方案非常有用。
## 提取faithfuld数据集中density变量的中间值,将其赋予mid
mid <- median(faithfuld$density)## 把mid设置为颜色区段的中间值
erupt + scale_fill_gradient2(midpoint = mid)

  1. 自定义n色梯度——scale_colour_gradientn()scale_fill_gradientn():此标度需要赋予参数colours一个颜色向量。这对于有特殊意义的数据(比如表现地形等)很有用。

其中可以使用另一个包colorspace,和调色盘类似的意思

erupt + scale_fill_gradientn(colours = terrain.colors(7))
erupt + scale_fill_gradientn(colours = colorspace::heat_hcl(7))
erupt + scale_fill_gradientn(colours = colorspace::diverge_hcl(7))

  1. 使用ColorBrewer配色方案——scale_color_distiller()scale_fill_gradient():可以通过设置palette参数调整颜色
erupt + scale_fill_distiller()
erupt + scale_fill_distiller(palette = "RdPu")
erupt + scale_fill_distiller(palette = "YlOrBr")

当数据集中包含缺失值NA时,可以通过改变na.value参数,默认状态下是灰色,可以通过更改设置改变缺失值的颜色

如下例,设置一个文本框,z变量中含有一个缺失值,将z变量映射为颜色图形属性:

df <- data.frame(x = 1, y = 1:5, z = c(1, 3, 2, NA, 5))
p <- ggplot(df, aes(x, y)) + geom_tile(aes(fill = z), size = 5)
p
# 不显示缺失值
p + scale_fill_gradient(na.value = NA)
# 突出缺失值
p + scale_fill_gradient(low = "black", high = "white", na.value = "red")

离散型

离散数据有四种颜色标度。我们使用最基本的条形图来举例。

首先是默认的配色方案:

df <- data.frame(x = c("a", "b", "c", "d"), y = c(3, 4, 1, 2))
bars <- ggplot(df, aes(x, y, fill = x)) +geom_bar(stat = "identity") +labs(x = NULL, y = NULL) +theme(legend.position = "none")
bars

  1. 使用scale_colour_hue()scale_fill_hue()函数来修改配色,它的意思是沿着HCL色轮选取均匀分布的色相来自动生成:
bars + scale_fill_hue(c = 40)
bars + scale_fill_hue(h = c(180, 300))

  1. 使用scale_colour_brewer()scale_fill_brewer()参数,即采用colorbrewer配色方案。对于类别型数据中的点而言,最好使的调色板是“Set1”、“Dark2”;对于面积型数据而言,最好用的调色板是“Set2”、“Pastel1”、“Pastel2”以及“Accent”。使用RColorBrewer::displat.brewer.all可以列出所有调色板。
bars + scale_fill_brewer(palette = "Set1")
bars + scale_fill_brewer(palette = "Set2")
bars + scale_fill_brewer(palette = "Accent")

  1. 使用scale_colour_grey()scale_fill_grey()参数,将离散型变量映射为从黑到白灰度不同的颜色:
bars + scale_fill_grey()
bars + scale_fill_grey(start = 0.5, end = 1)
bars + scale_fill_grey(start = 0, end = 0.5)

  1. 使用scale_colour_manual()scale_fill_manual()参数自制离散型颜色标度。点击网址(https://github.com/karthik/wesanderson
    ),你可以自己设计自己的调色板,然后用在你的作图中。举个例子代码如下:
library(wesanderson)
bars + scale_fill_manual(values = wes_palette("GrandBudapest"))

明亮的颜色更适用于散点图,而不适用于条形图,过于刺眼;淡色适用于条形图,但不适用于散点图。下面举几个栗子,感受一下~

3. 手动离散型标度(The Manual Discrete Scales)

离散型标度scale_linetype()scale_size_discrete()scale_shape()基本没有选项。这些标度按照一定的顺序将因子的水平映射到一系列取值中。

如果你要手动定制标度,使用一下几种方式:scale_shape_manual(), scale_linetype_manual(),
scale_colour_manual()。手动型标度有个重要的参数是value,用于指定这个标度该生成的值

加载数据集msleep做例子:

> msleep
# A tibble: 83 x 11name      genus  vore  order  conservation sleep_total sleep_rem sleep_cycle awake<chr>     <chr>  <chr> <chr>  <chr>              <dbl>     <dbl>       <dbl> <dbl>1 Cheetah   Acino… carni Carni… lc                 12.1     NA          NA     11.9 2 Owl monk… Aotus  omni  Prima… NA                 17.0      1.80       NA      7.003 Mountain… Aplod… herbi Roden… nt                 14.4      2.40       NA      9.604 Greater … Blari… omni  Soric… lc                 14.9      2.30        0.133  9.105 Cow       Bos    herbi Artio… domesticated        4.00     0.700       0.667 20.0 6 Three-to… Brady… herbi Pilosa NA                 14.4      2.20        0.767  9.607 Northern… Callo… carni Carni… vu                  8.70     1.40        0.383 15.3 8 Vesper m… Calom… NA    Roden… NA                  7.00    NA          NA     17.0 9 Dog       Canis  carni Carni… domesticated       10.1      2.90        0.333 13.9
10 Roe deer  Capre… herbi Artio… lc                  3.00    NA          NA     21.0
# ... with 73 more rows, and 2 more variables: brainwt <dbl>, bodywt <dbl>

我们绘制其中两个变量(brainwt, bodywt)关系的散点图,手动将变量vore设置其中的颜色:

plot <- ggplot(msleep, aes(brainwt, bodywt)) +scale_x_log10() +scale_y_log10()
plot +geom_point(aes(colour = vore)) +scale_colour_manual(values = c("red", "orange", "green", "blue"),na.value = "grey50")

有一些情况下我们需要手动修改颜色并手动增加图例,如下:

(LakeHuron是一个时间序列数据)

huron <- data.frame(year = 1875:1972, level = as.numeric(LakeHuron))
ggplot(huron, aes(year)) +geom_line(aes(y = level + 5), colour = "red") +geom_line(aes(y = level - 5), colour = "blue")

添加图例,和上面的代码貌似很像,实则不同,上面的颜色是我们指定的红蓝,而下面的颜色是默认生成的:

huron <- data.frame(year = 1875:1972, level = as.numeric(LakeHuron))ggplot(huron, aes(year)) +geom_line(aes(y = level + 5, colour = "above")) +geom_line(aes(y = level - 5, colour = "below"))

再进一步指定颜色并给图例命名,就要添加我们的scale_colour_manual命令了:

ggplot(huron, aes(year)) +
geom_line(aes(y = level + 5, colour = "above")) +
geom_line(aes(y = level - 5, colour = "below")) +
scale_colour_manual("Direction",
values = c("above" = "red", "below" = "blue")
)

4.同一型标度(The Identity Scale)

这是一种很特殊的情况

当你的数据能被R中的绘图函数理解时,即数据空间和图形属性空间相同,能使用同一型标度scale_identity

luv colors颜色数据集包含所有和R本身位置相对应的数据,这里的数据本身就是颜色值(我们也就没必要创造有意义的图例)。下面显示数据集的前6行:

head(luv_colours)
#> L u v col
#> 1 9342 -3.37e-12 0 white
#> 2 9101 -4.75e+02 -635 aliceblue
#> 3 8810 1.01e+03 1668 antiquewhite
#> 4 8935 1.07e+03 1675 antiquewhite1
#> 5 8452 1.01e+03 1610 antiquewhite2
#> 6 7498 9.03e+02 1402 antiquewhite3

点的颜色代表他们自身,即数据空间和图形属性空间完全重合:

ggplot(luv_colours, aes(u, v)) +geom_point(aes(colour = col), size = 3) +scale_color_identity() +coord_equal()


参考资料:

  1. Hadley Wickham(2016). ggplot2. Springer International Publishing. doi: 10.1007/978-3-319-24277-4
  2. 《R语言应用系列丛书·ggplot2:数据分析与图形艺术》

——————-我是求关注的分界线————–

更多R语言、可视化作图ggplot2包学习笔记请关注微信公众号:

ggplot2读书笔记9:第六章 标度(二)相关推荐

  1. 强化学习(RLAI)读书笔记第十六章Applications and Case Studies(不含alphago)

    强化学习(RLAI)读书笔记第十六章Applications and Case Studies(不含alphago) 16.1 TD-Gammon 16.2 Samuel's Checkers Pla ...

  2. 强化学习(RLAI)读书笔记第十六章Applications and Case Studies(alphago)

    强化学习(RLAI)读书笔记第十六章Applications and Case Studies(alphago) 16.6 Mastering the Game of Go 16.6.1 AlphaG ...

  3. 【Effective Objective-C 2.0读书笔记】第六章:块(Blocks)和大中枢派发(GCD)

    继续这本书的读书笔记,希望在其中也加入自己的一些总结,以加深理解.之前这一章写了很多了,保存到草稿箱中,不知道为何丢失了,真是可惜,看来CSDN的MarkDown编辑器还存在一些bugs,在它打上补丁 ...

  4. 马丁福勒《UML精粹》读书笔记_第六章

    第六章 对象图 什么是对象图? 对象图是在一个时间点上系统中各个对象的一个快照. 对象图也可被看做是不带消息的通信图(这点并不好理解,等"通信图"一章再说). 对象图和类图的区别? ...

  5. 《网络空间内生安全》读书笔记:第六章 内生安全与可靠性技术

    第六章 内生安全与可靠性技术 网络空间最大的安全威胁是**基于目标对象内生安全问题的不确定攻击* 网络空间最大的防御难题是在缺乏先验知识条件下能否可靠应对基于未知的未知因素的不确定攻击 最大的理论挑战 ...

  6. 《谈判力》读书笔记:第六章 如果对方实力强大怎么办?(确定你的最佳替代方案)

    第三部分 原则谈判法中常见的问题 第六章 如果对方实力强大怎么办?(确定你的最佳替代方案) 6.1保护自己 你赶飞机时,目的似乎变得极为重要. 但回头想想,自己完全可以乘下一班飞机.谈判往往让你面临相 ...

  7. Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧...

    第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息 屏幕大小:屏幕对角线长度,单位"寸": 分辨率:手机屏幕像素点个数,例如720x1280分辨率: PPI(Pixels ...

  8. java现有一个泛型类 提供数组排序功能,java编程思想读书笔记 第十六章 数组

    数组,你可以创建并组装它们,通过使用整型索引值访问它们的元素,并且它们的尺寸不能改变. 1.数组为什么特殊 数组与其他种类的容器之间的区别有三方面:效率.类型和保存基本类型的能力.在Java中数组是一 ...

  9. Head First设计模式读书笔记五 第六章 命令模式(单例略过)

    本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: https://blog.csdn.net/u011109881/article/details/59675658 极简命令 ...

  10. 大数据之路、阿里巴巴大数据实践读书笔记 --- 第十六章、数据应用

    本篇主要介绍两个应用:提供给外部商家使用的数据产品平台-生意参谋和服务于阿里巴巴内部的数据产品平台 一.生意参谋 作为大数据公司,阿里巴巴在推动业务数据化的同时,也在不断地帮助商家实现数据业务化.在对 ...

最新文章

  1. Exchange 2007 配置POP3
  2. php sql server配置文件路径,云服务器初始化 第六章:更改MySQL数据文件存放路径...
  3. jtree 默认展开树的全部节点
  4. 一篇blog带你了解java中的锁
  5. Centos 升级MySQL版本或者Yum安装Mysql5.6
  6. 2、SpringBoot整合JDBC
  7. js数组再倒数第二个添加元素_归纳JS中数组的使用(一)元素新增和删除
  8. 找mysql软件的配置文件_mysql 查看当前使用的配置文件my.cnf的方法
  9. oracle+技术面试,Oracle技术面试问题
  10. 5.7-多源复制搭建
  11. SVM-支持向量机(code实现)
  12. 伯克利,斯坦福,宾大联合发表:从观察和交互中学习预测模型
  13. 力软(.NET)敏捷开发框架,让开发变的更简单
  14. python gps显示_MicroPython-GPS教程之TPYBoardv702控制5110显示当前经纬度
  15. Android Studio在运行时显示Please Select Android SDK的解决方法
  16. 最新调研-持续集成和持续交付解决方案市场现状研究分析与发展前景预测报告
  17. App打开小程序,小程序打开App
  18. 云计算基础与应用 第八章 云安全
  19. Memcache教程
  20. Springboot + rxtx 实现串口读写 案例

热门文章

  1. python实现高级计算器_高级计算器功能Tkinter GUI和variab
  2. NOIP大纲整理:(零)历年2000-2016NOIP提高组题目分析
  3. 如何禁止win7自动锁屏
  4. 设计模式之工厂模式(附代码示例)
  5. 前端实现“查看更多”效果
  6. 卷积神经网络结构示意图,卷积神经网络的结构图
  7. matplotlib绘制折线图的柱状图
  8. 2021年 Python工程师平均薪资22K,又涨了11.9%!
  9. USB 虚拟串口简介
  10. Linux 内存管理。