11.3 离散色阶
离散颜色和填充出现在许多情况下。一个典型的例子是一个条形图,它将位置和填充都编码为相同的变量。
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")
离散颜色的默认方法是scale_fill_discrete()默认值,scale_fill_hue()也能生成相同的图:
bars
bars + scale_fill_discrete()
bars + scale_fill_hue()
image.png
这个默认比例有一些限制(稍后讨论),将首先讨论用于生成更好的离散调色板的工具。
11.3.1 Brewer scales
scale_colour_brewer()是一个离散的色阶,它和连续的模拟scale_colour_distiller()和分箱模拟scale_colour_fermenter()一起使用,从http://colorbrewer2.org/中精心挑选的“ColorBrewer”颜色。这些颜色在各种情况下都能很好地工作,尽管重点是在地图上,所以颜色往往在大区域显示时效果更好。有很多不同的选择:
RColorBrewer::display.brewer.all()
image.png
第一组调色板是顺序刻度,当离散刻度是有序(例如,排名数据)时非常有用,并且可用于使用scale_colour_distiller()用于连续数据。对于无序分类数据,最感兴趣的调色板是第二组中的调色板。'Set1' 和 'Dark2' 对点特别有用,'Set2'、'Pastel1'、'Pastel2' 和 'Accent' 对区域效果很好。
bars + scale_fill_brewer(palette = "Set1")
bars + scale_fill_brewer(palette = "Set2")
bars + scale_fill_brewer(palette = "Accent")
image.png
请注意,没有任何调色板对所有图形都适用。散点图通常使用小的绘图标记,明亮的颜色往往比微妙的效果更好:
# scatter plot
df <- data.frame(x = 1:3 + runif(30), y = runif(30), z = c("a", "b", "c"))
point <- ggplot(df, aes(x, y)) +
geom_point(aes(colour = z)) +
theme(legend.position = "none") +
labs(x = NULL, y = NULL)
# three palettes
point + scale_colour_brewer(palette = "Set1")
point + scale_colour_brewer(palette = "Set2")
point + scale_colour_brewer(palette = "Pastel1")
image.png
条形图通常包含大块颜色,明亮的颜色可能会让人难以抗拒。在这种情况下,微妙的颜色往往效果更好:
# bar plot
df <- data.frame(x = 1:3, y = 3:1, z = c("a", "b", "c"))
area <- ggplot(df, aes(x, y)) +
geom_bar(aes(fill = z), stat = "identity") +
theme(legend.position = "none") +
labs(x = NULL, y = NULL)
# three palettes
area + scale_fill_brewer(palette = "Set1")
area + scale_fill_brewer(palette = "Set2")
area + scale_fill_brewer(palette = "Pastel1")
image.png
11.3.2 色调和灰度
默认配色方案在 HCL 色轮周围选择均匀分布的色调。这适用于多达大约八种颜色,但之后就很难区分不同的颜色。您可以使用h
、c
和l
参数控制默认色度和亮度以及色调范围:
bars
bars + scale_fill_hue(c = 40)
bars + scale_fill_hue(h = c(180, 300))
image.png
默认配色方案的一个缺点是,因为所有颜色都具有相同的亮度和色调,所以当您以黑白方式打印它们时,它们都显示为相同的灰色阴影。请注意,如果您打算以黑白打印离散色阶,最好使用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)
image.png
11.3.3 手动调色
如果挑选的调色板都不适合,或者您有自己喜欢的颜色,您可以使用scale_fill_manual()手动设置颜色。如果您希望选择突出二级分组结构的颜色或引起对不同比较的注意,这会很有用:
bars + scale_fill_manual(values = c("sienna1", "sienna4", "hotpink1", "hotpink4"))
bars + scale_fill_manual(values = c("tomato1", "tomato2", "tomato3", "tomato4"))
bars + scale_fill_manual(values = c("grey", "black", "grey", "grey"))
image.png
您还可以使用命名向量来指定要分配给每个级别的颜色,这允许您按您喜欢的任何顺序指定级别:
bars + scale_fill_manual(values = c(
"d" = "grey",
"c" = "grey",
"b" = "black",
"a" = "grey"
))
image
11.4 分箱颜色标度
色阶也能进行分箱。默认标度scale_fill_binned(),转换为scale_fill_steps()。这些标度有一个n.breaks
参数来控制由比例创建的离散颜色类别的数量。与直觉相反,因为人类的视觉系统非常擅长检测边缘,这有时会使连续的颜色梯度更容易被感知:
erupt + scale_fill_binned()
image
erupt + scale_fill_steps()
image
erupt + scale_fill_steps(n.breaks = 8)
image
在其他方面scale_fill_steps()类似于scale_fill_gradient(),并允许您构建自己的双色渐变。还有一种三色变体scale_fill_steps2()和 n 色标度变体scale_fill_stepsn(),它们的行为与其连续对应物相似:
erupt + scale_fill_steps(low = "grey", high = "brown")
image
erupt + scale_fill_steps2(low = "grey", mid = "white", high = "brown", midpoint = .02)
image
erupt + scale_fill_stepsn(n.breaks = 12, colours = terrain.colors(12))
image
也存在用于分级的brewer analog
,称为scale_fill_fermenter():
erupt + scale_fill_fermenter(n.breaks = 9)
image
erupt + scale_fill_fermenter(n.breaks = 9, palette = "Oranges")
image
erupt + scale_fill_fermenter(n.breaks = 9, palette = "PuOr")
image.png
注意,如离散函数scale_fill_brewer()
、连续函数scale_fill_distiller()
与分箱函数scale_fill_fermenter()
不会在brewer颜色之间进行插值,如果您设置n.breaks
的颜色大于调色板中的颜色数量,则会出现警告消息,并且不会显示某些颜色。
11.5 Alpha标度
Alpha标度将阴影的透明度映射到数据中的一个值。它们通常不是很有用,但可以是一种方便的方法,可以直观地减轻不太重要的观察。Scale_alpha()
是scale_alpha_continuous()
的别名,因为这是alpha最常用的用法,它可以节省一些输入。
网友评论