本章是ggplot2科研绘图调参的第十一个章节,前十章内容请跳转:
ggplot保姆级教程-科研绘图调参细节
library(tidyverse)
library(ggplot2)
theme_set(theme_bw())
本文使用 空气污染导致全国发病率和死亡率研究 (NMMAPS). 为了使图表易于管理,我们将数据限制在芝加哥和 1997-2000 年。有关此数据集的更多详细信息,请参阅 Roger Peng 的书 Statistical Methods in Environmental Epidemiology with R.
使用 {rio}
包中的 import函数
将数据导入到我们的 R 中。为了稍后访问数据,我们使用赋值箭头<-
将其存储在名为chic
的变量中。
library(rio)
chic <- import("/Users/cpf/Documents/paper/writting_blog/data/chicago-nmmaps.csv")
ggplot2
中的颜色主要使用到两个参数,color
颜色和fill
填充,这两个参数都可以用来:
正如您在本教程开头所见,aes
美学内部的变量由变量编码,aes
美学外部的变量是与变量无关的属性。通过下图显示每年和每季的记录数量可以说明了这一事实:
ggplot(chic, aes(year)) +
geom_bar(aes(fill = season), color = "grey", size = 3) +
labs(x = "year", y = "Observation", fill = "Season:")
静态的单一颜色易于使用。我们可以为 geom 指定一种颜色:
ggplot(chic, aes(x = date, y = temp)) +
geom_point(color = "steelblue", size = 2) +
labs(x = "Year", y = "Temperature (°F)")
如果它同时提供颜色color
(轮廓颜色)和填充fill
(填充颜色):
ggplot(chic, aes(x = date, y = temp)) +
geom_point(shape = 21, size = 2, stroke = 1,
color = "#3cc08f", fill = "#c08f3c") +
labs(x = "Year", y = "Temperature (°F)")
在 ggplot2
中,分配给变量的颜色通过 scale_color_* 和 scale_fill_* 函数进行修改。为了对您的数据使用颜色,最重要的是您需要知道您是在处理分类变量还是连续变量。应根据变量的类型选择调色板,连续或发散调色板用于连续变量,定性调色板用于分类变量:
定性或分类变量表示可以分为组(类别)的数据类型。变量可以进一步指定为名义、有序和二元(二分)。
默认的分类调色板如下所示:
(ga <- ggplot(chic, aes(x = date, y = temp, color = season)) +
geom_point() +
labs(x = "Year", y = "Temperature (°F)", color = NULL))
您可以选择自己的一组颜色并通过函数 scale_*_manual() 将它们分配给分类变量(* 可以是color
、colour
或fill
)。指定颜色的数量必须与类别数量匹配:
ga + scale_color_manual(values = c("dodgerblue4",
"darkolivegreen4",
"darkorchid3",
"goldenrod1"))
ColorBrewer 调色板是一种流行的在线工具,用于为地图选择配色方案。不同的颜色组旨在产生具有相似外观的有吸引力的配色方案,范围从三到十二不等。这些调色板可作为 ggplot2
包中的内置函数使用,并且可以通过调用 scale_*_brewer() 来应用:
ga + scale_color_brewer(palette = "Set1")
有许多扩展包提供额外的调色板。它们的用途因包的设计方式而异。有关 R 中可用调色板的广泛概述,可以使用 paletteer
包,这是 R 中使用一致语法的调色板的集合。
例子:
例如,ggthemes
包允许 R 用户访问 Tableau 颜色。 Tableau 是著名的可视化软件,具有众所周知的调色板。
library(ggthemes)
ga + scale_color_tableau()
ggsci
包提供科学期刊和科幻主题的调色板。想要有一个看起来像发表在科学或自然中的颜色的主题吗?
library(ggsci)
g1 <- ga + scale_color_aaas()
g2 <- ga + scale_color_npg()
library(patchwork)
(g1 + g2) * theme_bw() * theme(legend.position = "top")
定量变量表示可测量的数量,因此是数字变量。定量数据可以进一步分类为连续(可能是浮点数)或离散(仅限整数):
在我们的示例中,我们将要着色的变量更改为臭氧,这是一个与温度密切相关的连续变量(更高的温度 = 更高的臭氧)。函数 scale_*gradient() 是一个顺序梯度,而 scale*_gradient2() 是发散的。
这是连续变量的默认 ggplot2
顺序配色方案:
gb <- ggplot(chic, aes(x = date, y = temp, color = temp)) +
geom_point() +
labs(x = "Year", y = "Temperature (°F)", color = "Temperature (°F):")
gb + scale_color_continuous()
这是不同的默认配色方案:
mid <- mean(chic$temp) ## midpoint
gb + scale_color_gradient2(midpoint = mid)
您可以通过 scale_*_gradient() 为连续变量手动设置逐渐变化的调色板:
gb + scale_color_gradient(low = "darkkhaki",
high = "darkgreen")
温度数据是正态分布的,那么发散的配色方案(而不是顺序)。对于发散的颜色,您可以使用 scale_*_gradient2() 函数:
gb + scale_color_gradient2(midpoint = mid, low = "#dd8a0b",
mid = "grey92", high = "#32a676")
Viridis
调色板Viridis
调色板不仅使您的绘图看起来漂亮且易于感知,而且色盲的人也更容易阅读并且灰度打印效果很好。
而且它们现在还附带 ggplot2
!以下多面板图说明了四个 Viridis
调色板中的三个:
p1 <- gb + scale_color_viridis_c() + ggtitle("'viridis' (default)")
p2 <- gb + scale_color_viridis_c(option = "inferno") + ggtitle("'inferno'")
p3 <- gb + scale_color_viridis_c(option = "plasma") + ggtitle("'plasma'")
p4 <- gb + scale_color_viridis_c(option = "cividis") + ggtitle("'cividis'")
library(patchwork)
(p1 + p2 + p3 + p4) * theme(legend.position = "bottom")
也可以将 Viridis
调色板用于离散变量:
ga + scale_color_viridis_d(guide = "none")
许多扩展包不仅提供额外的分类调色板,还提供顺序、发散甚至循环调色板。
例子:
racrtocolors包
rcartocolors
包将漂亮的 CARTOcolors 移植到 ggplot2
并包含几个我最常用的调色板:
library(rcartocolor)
g1 <- gb + scale_color_carto_c(palette = "BurgYl")
g2 <- gb + scale_color_carto_c(palette = "Earth")
(g1 + g2) * theme(legend.position = "bottom")
scico包
scico
包提供对 Fabio Crameri 开发的调色板的访问。这些调色板不仅美观而且通常不寻常,而且还是一个不错的选择,因为它们在感知上是统一和有序的。此外,它们适用于有色觉缺陷和灰度的人:
library(scico)
g1 <- gb + scale_color_scico(palette = "berlin")
g2 <- gb + scale_color_scico(palette = "hawaii", direction = -1)
(g1 + g2) * theme(legend.position = "bottom")
从 ggplot2 3.0.0 的最新版本开始,可以在将图层映射到数据后修改图层美感。或者正如 ggplot2
所说:“使用 after_scale() 来标记数据缩放后的映射评估。”
那么为什么不首先使用修改后的颜色呢?由于 ggplot2
只能处理一种颜色color
和一种填充比例fill scale
,这是一个有趣的功能。仔细查看以下示例,其中我们使用 ggdark
包中的 invert_color():
library(ggdark)
ggplot(chic, aes(date, temp, color = temp)) +
geom_point(size = 5) +
geom_point(aes(color = temp,
color = after_scale(invert_color(color))),
size = 2) +
scale_color_scico(palette = "hawaii", guide = "none") +
labs(x = "Year", y = "Temperature (°F)")
之后更改配色方案对于 ggdark
和 colorspace
包中的函数特别有趣,即 invert_color()、lighten()、darken() 和 desature()。您甚至可以组合这些功能。在这里,我们绘制了一个包含参数arguments
、颜色color
和填充fill
的箱线图:
library(colorspace)
ggplot(chic, aes(date, temp)) +
geom_boxplot(aes(color = season,
fill = after_scale(desaturate(lighten(color, .6), .6))),
size = 1) +
scale_color_brewer(palette = "Dark2", guide = "none") +
labs(x = "Year", y = "Temperature (°F)")
请注意,您需要指定颜色和/或填充相应 geom_*() 或 stat_*() 的 aes() 以使 after_scale() 工作。