11.ggplot2——色阶与图例(二)

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 + scale_fill_discrete() bars + scale_fill_hue()

这个默认比例有一些限制(稍后讨论),将首先讨论用于生成更好的离散调色板的工具。

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

请注意,没有任何调色板对所有图形都适用。散点图通常使用小的绘图标记,明亮的颜色往往比微妙的效果更好:

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

条形图通常包含大块颜色,明亮的颜色可能会让人难以抗拒。在这种情况下,微妙的颜色往往效果更好:

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

11.3.2 色调和灰度

默认配色方案在 HCL 色轮周围选择均匀分布的色调。这适用于多达大约八种颜色,但之后就很难区分不同的颜色。您可以使用hcl参数控制默认色度和亮度以及色调范围:

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)

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

您还可以使用命名向量来指定要分配给每个级别的颜色,这允许您按您喜欢的任何顺序指定级别:

bars + scale_fill_manual(values = c(
  "d" = "grey",
  "c" = "grey",
  "b" = "black",
  "a" = "grey"

11.4 分箱颜色标度

色阶也能进行分箱。默认标度scale_fill_binned(),转换为scale_fill_steps()。这些标度有一个n.breaks参数来控制由比例创建的离散颜色类别的数量。与直觉相反,因为人类的视觉系统非常擅长检测边缘,这有时会使连续的颜色梯度更容易被感知:

erupt + scale_fill_binned()
image

在其他方面scale_fill_steps()类似于scale_fill_gradient(),并允许您构建自己的双色渐变。还有一种三色变体scale_fill_steps2()和 n 色标度变体scale_fill_stepsn(),它们的行为与其连续对应物相似:

erupt + scale_fill_steps(low = "grey", high = "brown")