一、引言
同样是箱线图、柱状图,为什么有的让人一眼觉得"专业",有的看起来就是"草稿水平"?差距往往不在分析本身,而在配色。
Nature、NEJM 等顶级期刊都有自己的标志性配色体系,而生态和环境科学领域还有一套灵感来自加州自然景观的色板------这些在 R 中都可以一键调用。
本文系统介绍三个配色包:ggsci (封装顶级期刊配色)、RColorBrewer (经典色盲友好调色板)和 calecopal(加州自然景观灵感色板),涵盖调色板预览、颜色代码提取和实战对比。
二、准备工作
r
# 安装包
install.packages(c("ggplot2", "ggsci", "scales", "RColorBrewer", "paletteer"))
# calecopal 非CRAN包,安装方式:
# remotes::install_github("an-bui/calecopal")
# 或通过 paletteer 间接使用(calecopal:: 前缀)
# 加载包
library(ggplot2)
library(ggsci)
library(scales)
library(RColorBrewer)
library(paletteer)
本文使用两组简单演示数据:6个物种的多度数据(用于柱状图)和4组×10个观测值的箱线图数据(用于展示不同期刊配色效果)。
r
set.seed(123)
# 柱状图数据(6个分类)
df <- data.frame(
Species = paste0("Sp", 1:6),
Abundance = round(runif(6, 5, 30), 1)
)
# 箱线图数据(4个分组)
df_box <- data.frame(
Group = rep(c("Forest", "Grassland", "Farmland", "Wetland"), each = 10),
Value = c(rnorm(10, 25, 4), rnorm(10, 18, 3),
rnorm(10, 22, 5), rnorm(10, 15, 3))
)
三、ggsci------期刊配色方案
3.1 期刊配色一键切换
ggsci 将主流期刊的配色方案封装为 ggplot2 的 scale_color_*() 和 scale_fill_*() 系列函数。以箱线图为例,创建基础图形后只需加上对应的配色函数即可切换:
r
p_base <- ggplot(df_box, aes(x = Group, y = Value, fill = Group)) +
geom_boxplot(alpha = 0.8, outlier.shape = NA) +
theme_bw(base_size = 14) +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(x = "", y = "Value")
# 一行代码切换期刊配色
p_npg <- p_base + scale_fill_npg() # Nature
p_aaas <- p_base + scale_fill_aaas() # AAAS
p_nejm <- p_base + scale_fill_nejm() # NEJM
p_lancet <- p_base + scale_fill_lancet() # The Lancet
p_jama <- p_base + scale_fill_jama() # JAMA
五种期刊配色风格差异明显------NPG 颜色饱和稳重,AAAS 偏暖,NEJM 经典红蓝,Lancet 饱和度最低最为克制,JAMA 颜色数量少但区分度高。

3.2 可用期刊配色一览
ggsci 支持的期刊及主要配色方案如下表:
| 函数 | 色板名 | 颜色数 | 对应期刊 |
|---|---|---|---|
scale_fill_npg() |
"nrc" |
10 | Nature Publishing Group |
scale_fill_aaas() |
"default" |
10 | AAAS |
scale_fill_nejm() |
"default" |
8 | New England Journal of Medicine |
scale_fill_lancet() |
"lanonc" |
9 | The Lancet Oncology |
scale_fill_jama() |
"default" |
7 | Journal of the American Medical Association |
scale_fill_jco() |
"default" |
10 | Journal of Clinical Oncology |
scale_fill_ucscgb() |
"default" |
26 | UCSC Genome Browser |
scale_fill_d3() |
"category10" |
10 | D3.js |
scale_fill_igv() |
"default" |
51 | Integrative Genomics Viewer |
scale_fill_tron() |
"legacy" |
7 | Tron Legacy |
scale_fill_futurama() |
"planetexpress" |
7 | Futurama |
scale_fill_gsea() |
"default" |
12 | GSEA 连续色板 |
scale_color_*()控制点和线的颜色,scale_fill_*()控制面的填充色(箱线图、柱状图、密度图等),同一期刊同时提供 color 和 fill 两个版本。
3.3 提取颜色代码
使用 pal_*() 系列函数可直接提取十六进制颜色代码,方便在非 ggplot2 绘图系统中使用:
r
pal_npg("nrc")(10)
# #E64B35FF #4DBBD5FF #00A087FF #3C5488FF #F39B7FFF #8491B4FF
# #91D1C2FF #DC0000FF #7E6148FF #B09C85FF
通过 alpha 参数控制透明度,输出为 RGBA 十六进制码:
r
pal_npg("nrc", alpha = 0.6)(9)
# #E64B3599 #4DBBD599 #00A08799 #3C548899 #F39B7F99 #8491B499
# #91D1C299 #DC000099 #7E614899
调色板颜色条可以直观对比各期刊配色风格:

四、RColorBrewer------经典科学调色板
RColorBrewer 提供经过人工优化且色盲友好的配色方案,分为三大类别:
分类色板(Qualitative)------区分无序类别,适合箱线图、柱状图的分组填充:
| 色板名 | 最大颜色数 | 特点 |
|---|---|---|
| Set1 | 9 | 对比度高,清晰区分 |
| Set2 | 8 | 柔和,适合大面积填充 |
| Set3 | 12 | 颜色最多,多类别场景首选 |
| Dark2 | 8 | 深色系,适合线和点 |
| Paired | 12 | 成对数据对比 |
连续色板(Sequential)------从浅到深的渐变,适合数量、密度等有序数据,如 Blues、Reds、YlOrRd 等。
发散色板(Diverging)------两端对比,适合正负值或偏离中心的差异,如 RdYlBu(红-黄-蓝)、Spectral(彩虹色系)。
提取颜色代码:
r
brewer.pal(8, "Dark2")
# #1B9E77 #D95F02 #7570B3 #E7298A #66A61E #E6AB02 #A6761D #666666
在 ggplot2 中使用:
r
p_base + scale_fill_brewer(palette = "Dark2")
p_base + scale_color_brewer(palette = "Set1")

五、calecopal------加州自然景观色板
calecopal 由 Bui (2020) 开发,灵感来自加利福尼亚州的自然景观,包含 45 个色板。该包托管在 GitHub 上,可通过 paletteer 间接使用,无需直接安装 calecopal 本身。
精选色板一览:
| 色板名 | 颜色数 | 灵感来源 |
|---|---|---|
| sierra1 | 6 | 内华达山脉 |
| chaparral1 | 6 | 加州灌木林 |
| desert | 5 | 莫哈韦沙漠 |
| kelp1 | 6 | 海藻森林 |
| tidepool | 6 | 潮间带水潭 |
| superbloom1 | 5 | 超级花季 |
| redwood1 | 5 | 红木森林 |
| fire | 5 | 野火 |
| wetland | 5 | 湿地 |
完整 45 个色板还包括 agriculture、arbutus、bigsur、bigsur2、bixby、buow、calochortus、canary、caqu、casj、chaparral2、chaparral3、coastaldune1、coastaldune2、collinsia、conifer、creek、dudleya、eschscholzia、figmtn、gayophytum、grassdry、grasswet、halfdome、kelp2、lake、lupinus、oak、redwood2、sage、sbchannel、seagrass、sierra2、superbloom2、superbloom3、vermillion 等。
提取颜色:
r
library(paletteer)
paletteer_d("calecopal::sierra1")
# #BD973DFF #5F5C29FF #3B7D6EFF #5792CCFF #4D5B75FF #262E43FF
在 ggplot2 中使用:
r
p_base + scale_fill_paletteer_d("calecopal::superbloom1")
p_base + scale_color_paletteer_d("calecopal::chaparral1")

calecopal 色板风格各异:sierra1 沉稳、chaparral1 干燥暖色、desert 沙漠黄棕、kelp1 深蓝绿、tidepool 清新淡雅、superbloom1 粉紫花海、redwood1 森林深色、fire 红橙野火、wetland 柔和绿棕。生态学论文中使用这些色板,图表和自然环境之间会有天然的协调感。
六、同数据、三配色实战对比
用同一组数据绘制柱状图,分别应用 ggsci NPG、RColorBrewer Dark2 和 calecopal sierra1,效果差异一目了然:
r
p_bar <- ggplot(df, aes(x = Species, y = Abundance, fill = Species)) +
geom_bar(stat = "identity") +
theme_bw(base_size = 13) +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(x = "", y = "Abundance")
# ggsci
p_bar + scale_fill_npg() + ggtitle("ggsci: NPG")
# RColorBrewer
p_bar + scale_fill_brewer(palette = "Dark2") + ggtitle("RColorBrewer: Dark2")
# calecopal
p_bar + scale_fill_paletteer_d("calecopal::sierra1") + ggtitle("calecopal: sierra1")

三张图站在一起对比很明显:NPG 学术感最强,适合期刊投稿;Dark2 色深沉稳,灰度打印下仍有良好区分度;sierra1 带有自然大地色调,用于生态学论文中最协调。
七、完整可运行代码
以下为完整 R 脚本,复制到 RStudio 即可运行:
r
# ============================================================
# R语言科研配色:ggsci + RColorBrewer + calecopal 全攻略
# ============================================================
# install.packages(c("ggplot2", "ggsci", "scales", "RColorBrewer", "paletteer"))
library(ggplot2)
library(ggsci)
library(scales)
library(RColorBrewer)
library(paletteer)
set.seed(123)
# --- 演示数据 ---
df <- data.frame(
Species = paste0("Sp", 1:6),
Abundance = round(runif(6, 5, 30), 1)
)
df_box <- data.frame(
Group = rep(c("Forest", "Grassland", "Farmland", "Wetland"), each = 10),
Value = c(rnorm(10, 25, 4), rnorm(10, 18, 3),
rnorm(10, 22, 5), rnorm(10, 15, 3))
)
# --- ggsci 期刊配色 ---
p_base <- ggplot(df_box, aes(x = Group, y = Value, fill = Group)) +
geom_boxplot(alpha = 0.8, outlier.shape = NA) + theme_bw(base_size = 14) +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) + labs(x = "", y = "Value")
p_npg <- p_base + scale_fill_npg()
p_aaas <- p_base + scale_fill_aaas()
p_nejm <- p_base + scale_fill_nejm()
p_lancet <- p_base + scale_fill_lancet()
p_jama <- p_base + scale_fill_jama()
# --- 提取颜色代码 ---
pal_npg("nrc")(10)
brewer.pal(8, "Dark2")
paletteer_d("calecopal::sierra1")
# --- calecopal 在 ggplot2 中使用 ---
p_bar <- ggplot(df, aes(x = Species, y = Abundance, fill = Species)) +
geom_bar(stat = "identity") + theme_bw(base_size = 13) +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(x = "", y = "Abundance")
p_bar + scale_fill_npg()
p_bar + scale_fill_brewer(palette = "Dark2")
p_bar + scale_fill_paletteer_d("calecopal::sierra1")
八、实用技巧总结
方法速查:
需要期刊级学术配色 → ggsci ,一行代码切换 Nature/AAAS/NEJM/Lancet/JAMA 需要色盲友好、经典分类色板 → RColorBrewer (Dark2/Set1/Paired) 需要自然生态风格 → calecopal,加州景观灵感,色板名称直观 需要连续渐变色 → RColorBrewer 连续色板(Blues/YlOrRd)或 ggsci GSEA 需要冷暖发散对比 → RColorBrewer 发散色板(RdYlBu/Spectral)
注意事项:
- 分类变量 ≤ 6 类时可用 calecopal 大部分色板,超过 6 类时用 ggsci NPG(10色)或 RColorBrewer Set3(12色)
- 连续变量(海拔、温度、浓度)用 RColorBrewer 连续色板,不用彩虹色(jet)
- 发散数据(差异倍数的正负值)用 RdYlBu 或 Spectral,冷暖两端对比最清晰
brewer.pal(n, name)中n不可超过该色板的最大颜色数- calecopal 中每个色板的颜色数固定(6或5),多类别时选择 figmtn(9色)或通过 paletteer 组合
show_col()函数可快速可视化颜色向量,预览配色效果- 灰度打印场景,建议用 RColorBrewer Set2 或 Dark2
扩展建议:
- 用
scale_fill_manual(values = c(...))可完全自定义配色,从不同色板中精选组合 paletteer集成了 100+ 个包共 2500+ 个色板,通过paletteer_d("包名::色板名")调用- 同一篇文章的所有图表配色风格应统一,不建议每张图换一套色板
如果对你有帮助,欢迎 点赞 + 收藏。欢迎评论区交流 👋