R plotIMP research

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

2021-12-02  本文已影响0人  denghb001

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 色轮周围选择均匀分布的色调。这适用于多达大约八种颜色,但之后就很难区分不同的颜色。您可以使用hcl参数控制默认色度和亮度以及色调范围:

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最常用的用法,它可以节省一些输入。

上一篇 下一篇

猜你喜欢

热点阅读