ggplot2笔记6:标度、轴和图例

ggplot2绘图基础系列:

  • 1初识ggplot2、基本用法以及如何绘制几何对象

  • 2图层的使用——基础、怎样加标签、注释

  • 3工具箱——误差线、加权数、展示数据分布

  • 4语法基础

  • 5通过图层构建图像

Scales, Axes and Legends

6.1 简介

标度(scale)是将数据的取值映射到图形空间,例如颜色、大小和形状表示不同的数值。展现标度的常见做法是绘制图例和坐标轴。

每一种标度都是从数据空间的某个区域(标度的定义域)到图层属性空间的某个值域(标度的值域)的一个函数。标度的定义域提供给这个标度的变量的取值范围。

定义域(变量)可以是连续型、离散型、有序或者无序型。值域则包括我们可以感知的图形属性(颜色、形状、大小、线条等等)

执行标度的过程分为

  1. 变换

  2. 训练

  3. 映射

标度可以粗略地分为四个类别:

  1. 位置标度

  2. 颜色标度

  3. 手动离散型标度

  4. 同一型标度

6.2 修改标度

实际上每个图片生成的命令都有默认的标度,比如这个简单的代码:

ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = class))

实际上它背后的标度是这样的:

ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(colour = class)) +
  scale_x_continuous() +
  scale_y_continuous() +
  scale_colour_discrete()

ggplot2笔记6:标度、轴和图例_第1张图片

如果你想修改x轴y轴的名字:

ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(colour = class)) +
  scale_x_continuous("A really awesome x axis ") +
  scale_y_continuous("An amazingly great y axis ")

ggplot2笔记6:标度、轴和图例_第2张图片

如果你想修改颜色:

ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(colour = class)) +
  scale_x_sqrt() +
  scale_colour_brewer()

ggplot2笔记6:标度、轴和图例_第3张图片

从上面几个例子可以看出来, scale的“命名方案”是在后面添加下划线 _,然后添加要修改的相应对象和属性,下表有一个简单的总结

ggplot2笔记6:标度、轴和图例_第4张图片

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

6.3 引导元素:图例和坐标轴

(Guide:Legends and Axes)

什么是引导元素(guide)

引导元素:生成一个允许读图者从图形属性空间到数据空间进行反向映射的引导元素,从而从图中读取数值

  • 对于位置型图形,引导元素是坐标轴(Axis)

  • 对于其他图形,引导元素主要是图例(Legend)

ggplot2笔记6:标度、轴和图例_第5张图片

6.3.1 标度名称

下面我们创建一个简单的数据框

df <- data.frame(x = 1:2, y = 1, z = "a")

两种修改横坐标名称的代码,首先是简单的命名为 "X axis"

p <- ggplot(df, aes(x, y)) + geom_point()
p + scale_x_continuous("X axis")

另外一种使用了 quote()

p + scale_x_continuous(quote(a + mathematical ˆ expression))  
## `^`后面的字符转换为上标形式

ggplot2笔记6:标度、轴和图例_第6张图片

当修改坐标轴名称、图例名称时,有一个相对简单的方法,就是使用 xlab()ylab()labs()三种函数:

例如

xlab()ylab()可以用来更改x轴和y轴的名称:

df <- data.frame(x = 1:2, y = 1, z = "a")
p <- ggplot(df, aes(x, y)) + geom_point(aes(colour = z))
p + xlab("X axis") + ylab("Y axis")

ggplot2笔记6:标度、轴和图例_第7张图片

如果要将图例名称也更改,就直接用 labs()

p <- ggplot(df, aes(x, y)) + geom_point(aes(colour = z))
p + labs(x = "X axis", y = "Y axis", colour = "Colour\nlegend")
## 用'\n'换行

ggplot2笔记6:标度、轴和图例_第8张图片

如果想去掉坐标轴名称:

p + labs(x = "", y = "")
p + labs(x = NULL, y = NULL)

6.3.2 位置标度和标签(Breaks and Labels)

breaks控制坐标轴上刻度线的单位间隔。每个 breaks都有一个对应的标签 labels

下面从几个例子中说明:

  1. 创建一个数据集,我们来更改x轴单位时间间隔:

df <- data.frame(x = c(1, 3, 5) * 1000, y = 1)
axs <- ggplot(df, aes(x, y)) +
  geom_point() +
  labs(x = NULL, y = NULL)
## 不更改设置
axs
## 添加breaks,设置x轴单位间隔
axs + scale_x_continuous(breaks = c(2000, 4000))
## 添加labels
axs + scale_x_continuous(breaks = c(2000, 4000), labels = c("2k", "4k"))

ggplot2笔记6:标度、轴和图例_第9张图片

  1. 下面的例子标度是除x轴和y轴之外的颜色:

df <- data.frame(x = c(1, 3, 5) * 1000, y = 1)
leg <- ggplot(df, aes(y, x, fill = x)) +
  geom_tile() +
  labs(x = NULL, y  = NULL)
## 不更改设置
leg
## 添加breaks修改标度
leg + scale_fill_continuous(breaks = c(2000, 4000))
## 添加labels修改标度
leg + scale_fill_continuous(breaks = c(2000, 4000), labels = c("2k", "4k"))

ggplot2笔记6:标度、轴和图例_第10张图片

  1. 修改离散型分类标签

在这个例子中,我们想更改y轴上各个点的标签:

df2 <- data.frame(x = 1:3, y = c("a", "b", "c"))
ggplot(df2, aes(x, y)) +
  geom_point()
ggplot(df2, aes(x, y)) +
  geom_point() +
  scale_y_discrete(labels = c(a = "apple", b = "banana", c = "carrot"))

ggplot2笔记6:标度、轴和图例_第11张图片

  1. 去掉x轴的间隔和去掉标签名称

axs + scale_x_continuous(breaks = NULL)
axs + scale_x_continuous(labels = NULL)

ggplot2笔记6:标度、轴和图例_第12张图片

  1. 去掉填充色框和去掉色框的颜色标度

leg + scale_fill_continuous(breaks = NULL)
leg + scale_fill_continuous(labels = NULL)

ggplot2笔记6:标度、轴和图例_第13张图片

6.4 图例

和坐标轴相比,图例(Legends)的变化更加多样

6.4.1 图层和图例的结合

图例可以有多个图层。

show.legend参数是设置是否显示在图例中,在默认状态下,设定值是为 FALSE,意思是不显示;

如下例:

df <- data.frame(x = 1, y = c(1,2,3), z = c("a", "b", "c"))
ggplot(df, aes(y, y)) +
  geom_point(size = 4, colour = "grey20") +
  geom_point(aes(colour = z), size = 2)

show.legend=TRUE,就是这个图层也显示在图例中:

ggplot(df, aes(y, y)) +
  geom_point(size = 4, colour = "grey20", show.legend = TRUE) +
  geom_point(aes(colour = z), size = 2)

ggplot2笔记6:标度、轴和图例_第14张图片

当你设置透明度来处理重叠绘图时,你可能希望图例和图中图形对象的不完全一样,比如:

## 创建数据框,产生1000个服从正态分布的随机数
norm <- data.frame(x = rnorm(1000), y = rnorm(1000))  
## 设置z,整个数据框取子集分成三个部分
norm$z <- cut(norm$x, 3, labels = c("a", "b", "c"))
## 只在函数中设置透明度参数,图例透明度默认为0.1
ggplot(norm, aes(x, y)) +
  geom_point(aes(colour = z), alpha = 0.1)

ggplot2笔记6:标度、轴和图例_第15张图片

使用 guides()函数,设置 guide_legend()中的覆盖映射 override.aes

## list中透明度是1
ggplot(norm, aes(x, y)) +
  geom_point(aes(colour = z), alpha = 0.1) +
  guides(colour = guide_legend(override.aes = list(alpha = 1)))

ggplot2笔记6:标度、轴和图例_第16张图片

除此之外,我们还可以设置,散点中点的形状:

ggplot(df, aes(x, y)) + geom_point(aes(colour = z))
ggplot(df, aes(x, y)) + geom_point(aes(shape = z))
ggplot(df, aes(x, y)) + geom_point(aes(shape = z, colour = z))

ggplot2笔记6:标度、轴和图例_第17张图片

6.4.2 图例的位置

这部分讲的是把图例放哪儿

决定放哪儿的参数是: theme()中的 legend.position

默认状态是 theme(legend.position="right")

然后我们可以通过“right”, “left”, “top”, “bottom”,把他放在上/下/左,或者去掉“none”,例如:

df <- data.frame(x = 1:3, y = 1:3, z = c("a", "b", "c"))
base <- ggplot(df, aes(x, y)) +
  geom_point(aes(colour = z), size = 3) +
  xlab(NULL) +
  ylab(NULL)
base + theme(legend.position = "right") # the default
base + theme(legend.position = "bottom")
base + theme(legend.position = "none")

ggplot2笔记6:标度、轴和图例_第18张图片

此外,可以通过设置坐标点,指定图例的位置:

df <- data.frame(x = 1:3, y = 1:3, z = c("a", "b", "c"))
base <- ggplot(df, aes(x, y)) +
  geom_point(aes(colour = z), size = 3)
base + theme(legend.position = c(0, 1), legend.justification = c(0, 1))

ggplot2笔记6:标度、轴和图例_第19张图片

6.4.3 Guide函数

guide是引导元素。

guide()函数可以提供很多额外的功能,比如 guide_colourbar()(用于连续型变量); guide_legend()(连续型或离散型变量均可)

用法如下例:

df <- data.frame(x = 1, y = 1:3, z = 1:3)
base <- ggplot(df, aes(x, y)) + geom_raster(aes(fill = z))
base

ggplot2笔记6:标度、轴和图例_第20张图片

下面对图例部分的颜色填充加以设置:

base + scale_fill_continuous(guide = guide_legend())

换成 guide()函数的写法,效果是一样的:

base + guides(fill = guide_legend())

ggplot2笔记6:标度、轴和图例_第21张图片

这些函数可以调整图例中的各种细节。

  • guide_legend()

可以通过 ncolbyrow调整图例的各种排列

df <- data.frame(x = 1, y = 1:4, z = letters[1:4])
# Base plot
p <- ggplot(df, aes(x, y)) + geom_raster(aes(fill = z))
p
p + guides(fill = guide_legend(ncol = 2))
p + guides(fill = guide_legend(ncol = 2, byrow = TRUE))

ggplot2笔记6:标度、轴和图例_第22张图片

可以通过 reverse调整图例方向

df <- data.frame(x = 1, y = 1:4, z = letters[1:4])
p <- ggplot(df, aes(1, y)) + geom_bar(stat = "identity", aes(fill = z))
p
p + guides(fill = guide_legend(reverse = TRUE))

ggplot2笔记6:标度、轴和图例_第23张图片

还有上文提过的 override.aes改变图例图形属性

  • guide_colourbar()

这个参数只能设定连续型变量。

只能设置成颜色渐变型的条形图例。

举个栗子就明白了:

df <- data.frame(x = 1, y = 1:4, z = 4:1)
p <- ggplot(df, aes(x, y)) + geom_tile(aes(fill = z))
p
p + guides(fill = guide_colorbar(reverse = TRUE))
p + guides(fill = guide_colorbar(barheight = unit(4, "cm")))

ggplot2笔记6:标度、轴和图例_第24张图片

6.5 限制范围(limits)

图表上坐标轴的范围往往来自于数据的范围,这是默认生成的。但有时候我们想修改这个范围,或扩大或缩小,使数据涵盖面更广,或更集中更突出

这时,我们可以使用 limits参数:

  1. 对于连续型变量:应当设置为一个数字向量;如果只想设置一个上限或者下限,那就设置另一个值为NA

  2. 对于离散型变量:就要设置字符向量;列出所有的数据点

df <- data.frame(x = 1:3, y = 1:3)
base <- ggplot(df, aes(x, y)) + geom_point()
## 直接查看图表
base
## 查看其中一个区间,系统会提示你丢失了两个数据点
base + scale_x_continuous(limits = c(1.5, 2.5))
#> Warning: Removed 2 rows containing missing values (geom_point).
## 通过标度设置x轴的范围
base + scale_x_continuous(limits = c(0, 4))

ggplot2笔记6:标度、轴和图例_第25张图片

为了简化上述命令,ggplot2包中提供了一些简化的命令,如, xlim(), ylim()and lims()

我们可以作如下设置:

  1. xlim(10,20):设置x轴10-20连续的范围

  2. ylim(20,10):设置y轴20-10连续的范围

  3. xlim("a","b","c"):设置x轴三个离散的字符点

  4. xlim(as.Date(c("2008-05-01","2008-08-01"))):设置x轴为日期

实际上,图表上的x、y轴范围比我们设置的要稍稍大一点。这是系统自动生成的,为了数据点不会出现在轴上。

如果想修改这一点,可以设置 expand=c(0,0)

ggplot(faithfuld, aes(waiting, eruptions)) +
  geom_raster(aes(fill = density)) +
  theme(legend.position = "none")

ggplot2笔记6:标度、轴和图例_第26张图片

ggplot(faithfuld, aes(waiting, eruptions)) +
  geom_raster(aes(fill = density)) +
  scale_x_continuous(expand = c(0,0)) +
  scale_y_continuous(expand = c(0,0)) +
  theme(legend.position = "none")

ggplot2笔记6:标度、轴和图例_第27张图片

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笔记6:标度、轴和图例_第28张图片

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

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

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

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

ggplot2笔记6:标度、轴和图例_第29张图片

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

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

ggplot2笔记6:标度、轴和图例_第30张图片

其中有一些参数有简写形式,如, 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()指定特殊格式,如下表

ggplot2笔记6:标度、轴和图例_第31张图片

例如,如果你想以 14/10/1979的形式显示日期,可以使用字符串 %d/%m/%y

再举个栗子,经济数据集(时间序列)中,横轴日期的不同表示方式:

base <- ggplot(economics, aes(date, psavert)) +
  geom_line(na.rm = TRUE) +
  labs(x = NULL, y = NULL)
base # 默认间隔和时间表示方式

ggplot2笔记6:标度、轴和图例_第32张图片

base + scale_x_date(date_labels = "%y", date_breaks = "5 years")

ggplot2笔记6:标度、轴和图例_第33张图片

取其中一小段时间 ("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"
)

ggplot2笔记6:标度、轴和图例_第34张图片

取其中一小段时间 ("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"
)

ggplot2笔记6:标度、轴和图例_第35张图片

2. 颜色标度

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

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

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

在ggplot2中,使用了一种名为HCL色彩空间(Hue-Chroma-Luminance)的现代方案,由三个部分构成,分别是色相(hue)、彩度(chroma)以及明度(luminance)

  1. 色相:是一个从0到360的角度值,将一种色彩赋予颜色属性(如红橙黄蓝等等)

  2. 明度:颜色的明暗程度,即看其接近黑色或白色的程度,明度0是黑色,1是白色。

  3. 彩度:色彩的纯度。0是灰色,彩度的最大值随明度变化而不同

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

ggplot2笔记6:标度、轴和图例_第36张图片

Wikipedia上的HCL色彩空间长这样

↓↓↓

ggplot2笔记6:标度、轴和图例_第37张图片

连续型

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

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

举例,使用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

ggplot2笔记6:标度、轴和图例_第38张图片

修改颜色标度:

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

ggplot2笔记6:标度、轴和图例_第39张图片

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

ggplot2笔记6:标度、轴和图例_第40张图片

  1. 三色梯度渐变 —— scale_colour_gradient2()或 scale_fill_gradient2():和双色渐变类似,顺序为低-中-高。中点的默认值是0,但是可以使用参数 midpoint加以设置为任意值。着多个参数对于形成发散型(diverging)配色方案非常有用。

## 提取faithfuld数据集中density变量的中间值,将其赋予mid
mid <- median(faithfuld$density)
## 把mid设置为颜色区段的中间值
erupt + scale_fill_gradient2(midpoint = mid)

ggplot2笔记6:标度、轴和图例_第41张图片

  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))

ggplot2笔记6:标度、轴和图例_第42张图片

  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")

ggplot2笔记6:标度、轴和图例_第43张图片

当数据集中包含缺失值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")

ggplot2笔记6:标度、轴和图例_第44张图片

离散型

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

首先是默认的配色方案:

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

ggplot2笔记6:标度、轴和图例_第45张图片

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

bars + scale_fill_hue(c = 40)
bars + scale_fill_hue(h = c(180, 300))

ggplot2笔记6:标度、轴和图例_第46张图片

ggplot2笔记6:标度、轴和图例_第47张图片

  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")

ggplot2笔记6:标度、轴和图例_第48张图片

  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)

ggplot2笔记6:标度、轴和图例_第49张图片

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

library(wesanderson)
bars + scale_fill_manual(values = wes_palette("GrandBudapest"))

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

ggplot2笔记6:标度、轴和图例_第50张图片

ggplot2笔记6:标度、轴和图例_第51张图片

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 11
   name      genus  vore  order  conservation sleep_total sleep_rem sleep_cycle awake
                                        
 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.00
 3 Mountain… Aplod… herbi Roden… nt                 14.4      2.40       NA      9.60
 4 Greater … Blari… omni  Soric… lc                 14.9      2.30        0.133  9.10
 5 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.60
 7 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 , bodywt 

我们绘制其中两个变量( 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"
  )

ggplot2笔记6:标度、轴和图例_第52张图片

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

(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")

ggplot2笔记6:标度、轴和图例_第53张图片

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

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"))

ggplot2笔记6:标度、轴和图例_第54张图片

再进一步指定颜色并给图例命名,就要添加我们的 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")
)

ggplot2笔记6:标度、轴和图例_第55张图片

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()

ggplot2笔记6:标度、轴和图例_第56张图片


参考资料:

  1. Hadley Wickham(2016). ggplot2. Springer International Publishing. doi: 10.1007/978-3-319-24277-4

  2. 《R语言应用系列丛书·ggplot2:数据分析与图形艺术》

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

更多R语言、可视化作图ggplot2包学习笔记请关注微信公众号,不断更新中哦~

ggplot2笔记6:标度、轴和图例_第57张图片

猜你喜欢

10000+:肠道细菌 人体上的生命 宝宝与猫狗 梅毒狂想曲 提DNA发Nature 实验分析谁对结果影响大  Cell微生物专刊

系列教程:微生物组入门 Biostar 微生物组  宏基因组

专业技能:生信宝典 学术图表 高分文章 不可或缺的人

一文读懂:宏基因组 寄生虫益处 进化树

必备技能:提问 搜索  Endnote

文献阅读 热心肠 SemanticScholar Geenmedical

扩增子分析:图表解读 分析流程 统计绘图

16S功能预测   PICRUSt  FAPROTAX  Bugbase Tax4Fun

在线工具:16S预测培养基 生信绘图

科研经验:云笔记  云协作 公众号

编程模板 Shell  R Perl

生物科普  生命大跃进  细胞暗战 人体奥秘  

写在后面

为鼓励读者交流、快速解决科研困难,我们建立了“宏基因组”专业讨论群,目前己有国内外150+ PI,1500+ 一线科研人员加入。参与讨论,获得专业解答,欢迎分享此文至朋友圈,并扫码加主编好友带你入群,务必备注“姓名-单位-研究方向-职称/年级”。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍末解决群内讨论,问题不私聊,帮助同行。

学习16S扩增子、宏基因组科研思路和分析实战,关注“宏基因组”

点击阅读原文,跳转最新文章目录阅读

你可能感兴趣的:(ggplot2笔记6:标度、轴和图例)