R语言科研配色:从ggsci到calecopal,一篇掌握三大配色方案

一、引言

同样是箱线图、柱状图,为什么有的让人一眼觉得"专业",有的看起来就是"草稿水平"?差距往往不在分析本身,而在配色。

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("包名::色板名") 调用
  • 同一篇文章的所有图表配色风格应统一,不建议每张图换一套色板

如果对你有帮助,欢迎 点赞 + 收藏。欢迎评论区交流 👋

相关推荐
YangYang9YangYan2 小时前
大数据管理与应用专业学数据分析的价值
数据挖掘·数据分析
极光代码工作室2 小时前
基于数据分析的电影票房预测系统
大数据·python·数据分析·spark·数据可视化
搞科研的小刘选手2 小时前
【智能计算方向专题研讨会】第三届智能计算与数据分析国际学术会议(ICDA 2026)
大数据·算法·机器学习·数据挖掘·数据分析·可视化·计算
追风少年ii2 小时前
课前准备--肿瘤细胞邻域分类
数据分析·空间·单细胞·培训
YangYang9YangYan2 小时前
专科大数据技术学习数据分析的价值分析
大数据·学习·数据分析
dongf20193 小时前
R 语言 逻辑斯蒂回归
开发语言·数据分析·回归·r语言
小白学大数据20 小时前
爬虫性能天花板:asyncio赋能 Aiohttp,并发提速 10 倍
开发语言·爬虫·数据分析
Data-Miner1 天前
休闲食品行业数据分析平台建设方案,揭秘增长新引擎!
大数据·数据库·数据分析
babe小鑫1 天前
数据分析在营销行业的价值分析
数据挖掘·数据分析