ggplot2
工具包在前面几篇推文中,介绍的配色方法都是通过将已生成的颜色序列赋值给绘图函数的参数来实现,这也是一种比较容易理解的方式。而在ggplot2
绘图系统中,除这种方式外,还可以使用它的颜色标度函数进行配色。
标度函数主要用于建立绘图数据与图形属性之间的联系,这类函数命名具有一定的规律性。标度函数涉及的属性类别包括:透明度(alpha)、表观颜色(color或colour)、填充颜色(fill)、线型(linetype)、形状(shape)、尺寸(size)、坐标轴(x、y)。
本篇主要介绍颜色标度函数,其中表观颜色(color或colour)和填充颜色(fill)虽然涂色的位置不同,但对应的标度函数的用法一致,因此在这里不作区分。
颜色标度函数的选取要根据数据类型考虑映射方式。
scale_color_hue()
离散型变量在这里是指因子变量(factor),离散映射默认的颜色标度函数是scale_color_hue()
,采用的是HCL配色模型:
scale_colour_hue(
...,
h = c(0, 360) + 15,
c = 100,
l = 65,
h.start = 0,
direction = 1,
na.value = "grey50",
aesthetics = "colour"
)
h:包含两个元素的向量,表示色相(H)的取值范围;
c、l:饱和度(C)和亮度(L)的取值;
h.start:色相取值的起始值;
direction:1表示在色环上按顺时针取色,-1表示按逆时针取色。
library(ggplot2)
library(patchwork)
df01 <- data.frame(x = c("a", "b", "c", "d"),
y = c(3, 4, 1, 2))
## 默认状况
p01 <- ggplot(df01, aes(x, y, fill = x)) +
geom_bar(stat = "identity") +
labs(x = NULL, y = NULL) +
theme(legend.position = "none")
## 使用颜色标度函数
p11 <- p01 + scale_fill_hue(h = c(120, 240), c = 30)
p01 + p11
scale_color_brewer()
scale_color_brewer()
函数可以直接调用RColorBrewer
工具包的调色板。
scale_color_brewer(
...,
type = "seq",
palette = 1,
direction = 1,
aesthetics = "colour"
)
type:类型参数,即
RColorBrewer
工具包的三类调色板:seq、div、qual;palette:调色板名称或序号,具体见
RColorBrewer
工具包。注:
scale_color_brewer()
中的seq
、div
类型不属于连续映射,而是有序的离散型映射,因此不能用于连续型变量。
p21 <- p01 + scale_fill_brewer(type = "qual", palette = "Set2")
p22 <- p01 + scale_fill_brewer(palette = "OrRd")
p21 + p22
scale_color_grey()
scale_color_grey()
函数使用的是灰度配色模型。
scale_colour_grey(
...,
start = 0.2,
end = 0.8,
na.value = "red",
aesthetics = "colour"
)
start、end:灰度的起始、终止值。
p31 <- p01 + scale_fill_grey()
p32 <- p01 + scale_fill_grey(start = 0, end = 0.5)
p31 + p32
scale_color_manual()
scale_color_manual()
函数采取的是手动赋值的方法,也就是直接把颜色序列赋值给它的参数value
。
p41 <- p01+ scale_fill_manual(values = c("sienna1", "sienna4",
"hotpink1", "hotpink4"))
p42 <- p01 + scale_fill_manual(values = c("tomato1", "tomato2",
"tomato3", "tomato4"))
p41 + p42
scale_color_identity()
scale_color_identity()
函数是一种特殊的离散映射方式,因为它的映射变量本身就是颜色编码。
df02 <- data.frame(x = c("sienna1", "sienna4",
"hotpink1", "hotpink4"),
y = c(3, 4, 1, 2))
## 默认状况
p02 <- ggplot(df02, aes(x, y, fill = x)) +
geom_bar(stat = "identity") +
labs(x = NULL, y = NULL) +
theme(legend.position = "none")
## 使用颜色标度函数
p51 <- p02 + scale_fill_identity()
p02 + p51
对于连续型变量,它的映射方式有两种:
一种是采用连续的调色板使每个数值都对应一种颜色,即真正的连续映射(continuous);
另一种是将其离散化,即分箱映射(binned)。
scale_colour_gradient()
连续型变量的默认离散方式是连续映射,连续映射默认的颜色标度函数是scale_colour_gradient()
。语法结构如下:
scale_colour_gradient(
...,
low = "#132B43",
high = "#56B1F7",
space = "Lab",
na.value = "grey50",
guide = "colourbar",
aesthetics = "colour"
)
该函数只需要使用
low
和high
参数分别指定连续变量最小值和最大值对应的颜色,即可自动计算一条连续的调色板。
set.seed(135)
df <- data.frame(x = 1:40, y = rnorm(40))
## 默认状况
p03 <- ggplot(df, aes(x, y, color = y)) +
geom_point(size = 2) +
labs(x = NULL, y = NULL)
## 使用颜色标度函数
p61 <- p03 + scale_color_gradient(low = "blue", high = "red")
p03 + p61
当连续型变量中包含具有特殊意义的中间值如0、1,可以使用scale_color_gradient2()
函数:
scale_color_gradient2(
...,
low = muted("red"),
mid = "white",
high = muted("blue"),
midpoint = 0,
space = "Lab",
na.value = "grey50",
guide = "colourbar",
aesthetics = "colour"
)
当有多个中间值时,可以使用scale_colour_gradientn()
函数:
scale_colour_gradientn(
...,
colours,
values = NULL,
space = "Lab",
na.value = "grey50",
guide = "colourbar",
aesthetics = "colour",
colors
)
colours:颜色向量,函数会在向量每两个元素之间生成一个连续调色板。
示例如下:
p62 <- p03 + scale_color_gradient2(low = "blue",
mid = "green", high = "red")
p63 <- p03 + scale_color_gradientn(colors = c("blue", "green",
"yellow", "red"),
breaks = c(-Inf, -1, 1, Inf))
p62 + p63
scale_color_steps()
scale_color_steps()
函数用于连续变量的分箱映射,通过比较下面两幅图和前面两幅图可以很容易理解其含义:
p71 <- p03 + scale_color_steps(low = "blue", high = "red")
p72 <- p03 + scale_color_steps(low = "blue", high = "red",
breaks = c(-Inf, -1, 1, Inf))
p71 + p72
同scale_colour_gradient()
函数一样,scale_color_steps()
函数也有两个扩展形式:scale_color_steps2()
、scale_color_stepsn()
,这里不再演示。