关于 scientific-visualization
面向科研人员的科学可视化指南,涵盖图表选择、色彩、布局、可访问性和期刊投稿格式。它强调如实呈现数据,并按数据类型与分析目标选择图表。
主要功能
- 01按数据结构选择图表类型
- 02使用适合色觉障碍的配色
- 03规划多面板图的布局与标签
- 04遵循期刊尺寸和导出要求
- 05检查统计标注与图表可读性
适用场景
- 01为连续分布或时间序列选择图表
- 02制作适合期刊版面的科研图
- 03检查配色在灰度打印中的区分度
- 04整理多面板图并规范统计注释
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jaechang-hits/ sciagent-skills --skill scientific-visualization安装后在 Claude Code 中输入/scientific-visualization确认已加载。
详细介绍
scientific-visualization
概述
有效的科学可视化能够清晰、如实且易于理解地传达数据。不合适的图表、误导性的坐标轴或不适用的调色板可能掩盖研究发现或引入偏差。本指南涵盖科学图表准备的完整工作流程:从根据数据结构选择合适的图表类型,到色彩理论、无障碍设计以及期刊投稿的格式要求。
核心概念
图表类型与数据类型的匹配
每种图表类型都针对特定的数据结构进行了优化。两者不匹配(例如,用饼图展示连续分布、用条形图展示时间序列)会掩盖结构并扭曲感知。
| 数据类型 | 推荐图表 | 避免使用 |
|---|---|---|
| 连续分布(1 组) | 直方图、小提琴图、山峦图 | 仅展示均值的条形图 |
| 连续分布(2–5 组) | 小提琴图叠加箱线图、蜂群图 | 分组条形图 |
| 两个连续变量,相关性 | 散点图、大样本使用六边形分箱图 | 没有时间顺序的折线图 |
| 类别计数/比例 | 条形图(标签较长时使用水平条形图) | 类别超过 4 个的饼图 |
| 随时间变化(连续) | 折线图 | 条形图 |
| 随时间变化(稀疏事件) | 阶梯图、事件栅格图 | 连线散点图 |
| 部分与整体(≤5 个部分) | 堆叠条形图、华夫图 | 3D 饼图 |
| 高维(>5 个变量) | 热图(聚类)、平行坐标图 | 3D 散点图 |
| 空间数据 | 地图、空间热图 | 气泡图 |
| 生存/事件发生时间 | Kaplan-Meier 曲线 | 展示中位生存期的条形图 |
科学可视化的色彩理论
颜色用于编码信息。误用颜色会引入伪影,也会影响色觉缺陷(CVD;约 8% 的男性)读者。
顺序色板用于编码从低到高的有序数值数据(例如,表达水平、浓度)。使用感知均匀的色板:viridis、magma、cividis。这些色板打印为灰度时也能保持清晰。
发散色板用于编码具有明确中点的数据(例如,以 0 为中心的倍数变化、从 -1 到 +1 的相关性)。使用 RdBu、coolwarm 或 vlag。务必确保中点映射为白色/中性色。
定性色板用于编码无序类别。使用 Okabe-Ito(适用于色觉缺陷者)、tab10(matplotlib 默认值)或 ColorBrewer 定性色板。可区分的颜色不要超过 8 种;超过时,应使用形状或图案作为冗余编码。
颜色使用禁忌:
- 彩虹/jet 色图:感知不均匀,会产生虚假的轮廓
- 使用红色与绿色进行编码:不适用于红色盲(约 6% 的男性)
- 用高饱和度颜色作为背景或填充大面积区域
图表构图与布局
科学图表通常包含多个面板。面板布局和标注会影响读者理解信息的方式。
- 面板标签:在左上角使用粗体大写字母(A、B、C);图内使用 8–12 pt 字号,图注引用处使用更大字号。
- 对齐:将各面板边缘沿网格对齐。面板未对齐会显得不够细致。
- 留白:留出足够的页边距;面板过于拥挤会降低可读性。
- 图表尺寸:根据目标栏宽设计——Nature 系列期刊的单栏约为 85 mm/3.35 in、1.5 栏约为 114 mm/4.5 in、双栏约为 170 mm/6.7 in。
- 字体:使用无衬线字体(Arial、Helvetica);按出版分辨率查看最终图表时,字号至少为 6–8 pt。
期刊图表格式要求
主要期刊对投稿图表有明确要求。违反这些要求会导致稿件被编辑部退稿,延误处理。
| 期刊/样式 | 最大宽度 | 分辨率 | 色彩模式 | 字体 | 文件格式 |
|---|---|---|---|---|---|
| Nature 系列 | 89 mm(单栏),183 mm(双栏) | 300 dpi(照片),600 dpi(线稿) | RGB 或 CMYK | Arial 5–7 pt | PDF、TIFF、EPS |
| Cell/iScience | 85 mm(单栏),170 mm(双栏) | 300 dpi(栅格图),600 dpi(半色调) | RGB | Helvetica 6–8 pt | PDF、EPS、TIFF |
| ACS 期刊 | 3.25 in(单栏),7 in(双栏) | 600 dpi(彩色),1200 dpi(黑白线稿) | RGB(屏幕显示),CMYK(印刷) | Arial/Helvetica 4.5–7 pt | TIFF、EPS、PDF |
| PLOS ONE | 无严格宽度要求 | 300 dpi(栅格图),600–1200 dpi(线稿) | RGB | 任意 | TIFF、EPS、PDF |
决策框架
使用此树,根据分析目标选择合适的可视化方式:
What is the primary message of this figure?
|
+-- Show a distribution or spread of values
| +-- One group --> Histogram or violin plot
| +-- 2-5 groups --> Violin + jitter (show all points if N < 100)
| +-- Many groups --> Ridge plot (joy plot)
|
+-- Compare quantities between categories
| +-- Few categories (2-5) --> Bar chart with error bars + individual points
| +-- Many categories (>8) --> Lollipop chart or dot plot (horizontal)
| +-- Paired measurements --> Slopegraph or paired dot plot
|
+-- Show a relationship between two continuous variables
| +-- N < 1000 --> Scatter plot
| +-- N > 1000 --> Hexbin or 2D density plot
| +-- Time ordered --> Line chart
|
+-- Show composition or part-to-whole
| +-- 2-4 parts --> Stacked bar or waffle chart
| +-- Over time --> Stacked area chart
| +-- Avoid pie chart unless <= 3 parts and proportions are obvious
|
+-- Show high-dimensional data
| +-- Genes x samples --> Clustered heatmap (seaborn.clustermap)
| +-- Embeddings (UMAP, PCA) --> Scatter colored by metadata
| +-- Feature importance --> Horizontal bar chart (sorted)
|
+-- Show spatial or geographic data
| +-- Microscopy --> Image overlay with colorbar
| +-- Geographic --> Choropleth map
| 分析目标 | 图表类型 | 库 | 关键注意事项 |
|---|---|---|---|
| 不同组间的基因表达 | 小提琴图 + 抖动点 | seaborn、plotnine | N < 50 时显示所有数据点;切勿只用柱状图 + SEM |
| 差异表达 | 火山图 | matplotlib | x 轴为 Log2FC,y 轴为 -log10(p) |
| 聚类结果 | UMAP 散点图 | scanpy、matplotlib | 每个注释变量单独绘制一张图 |
| 相关性矩阵 | 聚类热图 | seaborn.clustermap | 使用以 0 为中心的发散色板 |
| 蛋白质结构 | 蛋白质丝带图 | PyMOL、ChimeraX | 本文不涉及 — 请使用专用分子图形工具 |
| 生存分析 | Kaplan-Meier 曲线 | lifelines | 包含置信带和风险人数表 |
| 时间序列 | 带 CI 的折线图 | matplotlib | 显示不确定性;连接组均值,而非单个数据点 |
最佳实践
-
展示数据,而不只是汇总结果:对于 N < 100 的情况,使用抖动或蜂群图,在小提琴图或箱线图上叠加显示单个数据点。仅显示均值 ± SEM 的柱状图会掩盖分布形状、离群值和双峰分布。
-
默认选择适合 CVD 的色板:顺序数据使用 Okabe-Ito 或
viridis/cividis。投稿前,使用 CVD 模拟器(例如 Coblis)检查图表。 -
从一开始就按最终发表尺寸设计:将图表画布设为目标期刊的确切栏宽(例如,Nature 单栏为 89 mm)。事后缩放会使字体过小或过大,并改变纵横比。
-
为坐标轴标注单位,并使用描述性标题:每个坐标轴都必须带有单位标签,单位放在括号中(例如,“表达量(log2 CPM)”)。避免使用没有图例说明的晦涩缩写。
-
线稿和文字使用矢量格式:图表包含文字和线条时,保存为 PDF 或 SVG。仅在期刊要求提交 TIFF 时才栅格化。矢量图放大后不会出现像素化,且仍可编辑。
-
统计注释应与所用检验相符:如果标注显著性星号(*),请在图注中说明所用检验、准确的 p 值和样本量。“n.s.” 也应报告 p 值。
-
避免使用双 y 轴:同一图表使用两个不同的 y 轴几乎总会造成误导 — 表面上的关系取决于刻度选择。应改用两个独立面板。
常见误区
-
用柱状图展示连续分布(炸药图)
- 问题所在:均值 ± SEM 柱形会掩盖数据是否呈正态分布、多峰分布或存在离群值。两组数据即使柱形完全相同,其分布也可能截然不同。
- 如何避免:使用小提琴图、带抖动的箱线图或蜂群图。N < 50 时,显示所有数据点。
-
截断或断裂 y 轴,夸大差异
- 问题所在:将 y 轴起点设为非零值,会让微小差异看起来很大,误导读者对效应大小的判断。
- 如何避免:对于比率或计数数据,y 轴从零开始。如果确实需要放大查看,可使用嵌入图或单独的面板,并清楚标明坐标轴已截断。
-
热图使用彩虹色/jet 色图
- 问题所在:Jet 在感知上并不均匀,会制造虚假的等高线效果,并且在 CVD 和灰度打印中表现不佳。
- 如何避免:连续数据使用
viridis、magma或inferno;发散数据使用RdBu或coolwarm。这些是 seaborn >= 0.12 中的默认选项。
-
数据点重叠,且未使用抖动或透明度
- 问题所在:数据点彼此叠加(过度绘制),使密集区域看起来稀疏,并掩盖真实的数据密度。
- 如何避免:添加抖动(
seaborn.stripplot(jitter=True))、设置透明度(alpha=0.3),或在 N 较大时改用六边形分箱图/二维密度图。
-
标注 P 值,却不提供效应大小或样本量
- 问题所在:N = 10,000 时,即使结果在统计学上显著(p < 0.05),也可能在科学意义上微不足道。单独使用星号无法提供有用信息。
- 如何避免:在图注或图中直接报告精确 P 值、效应大小(Cohen's d、优势比)和样本量。
-
图中文字在出版尺寸下过小
- 问题所在:按屏幕尺寸设计后,再缩小到期刊栏宽,会导致文字只有 3–4 pt,无法达到最低可读性标准。
- 如何避免:从一开始就按最终印刷尺寸设计。检查最终尺寸下的轴标签是否 ≥ 6 pt。
-
多面板图中各面板的风格不一致
- 问题所在:各面板的字体、线宽或配色方案不同,会使图表显得不专业,也更难进行比较。
- 如何避免:在绘图脚本顶部定义共享的
matplotlib.rcParams样式字典,并将其应用于所有面板。
工作流
-
先明确要传达的信息
- 用一句话描述希望读者从这张图中获得什么信息。
- 使用上述决策框架,选择最直接传达该信息的图表类型。
-
准备数据
- 绘图前汇总、整理并验证数据。
- 检查是否存在应当调查、而非悄悄删除的离群值。
-
按屏幕分辨率制作原型
- 使用你偏好的绘图库(matplotlib、seaborn、ggplot2、plotnine)绘制初稿。
- 重点确保数据和图表类型正确;此阶段暂不考虑样式。
-
应用期刊专属样式
- 将画布尺寸设为目标期刊的栏宽。
- 设置字体系列和最小字号。
- 选择适用于 CVD 的配色方案。
- 统一线宽(轴线和刻度为 0.5–1.0 pt,数据线为 1.0–2.0 pt)。
-
添加注释和标签
- 面板标签(A、B、C)使用粗体。
- 轴标签注明单位。
- 统计注释注明检验名称和精确 P 值。
- 图例使用描述性条目。
-
按正确分辨率导出
- 矢量格式:线条图和文字使用 PDF 或 SVG。
- 栅格格式:半色调图像/照片使用 300 dpi 的 TIFF,线条图使用 600 dpi 的 TIFF。
- 在 matplotlib 中使用
plt.savefig("fig1.pdf", bbox_inches="tight")。
-
检查无障碍性
- 使用在线工具或 GIMP 的色盲滤镜模拟 CVD。
- 以灰度打印,并确认各面板仍能区分。
协议指南
- 对于 matplotlib/seaborn:在每个绘图脚本的顶部设置
rcParams;使用fig.set_size_inches()来确保符合期刊尺寸要求;导出时的dpi至少为 300。 - 对于 R/ggplot2:使用
theme_classic()或自定义主题;设置ggsave(width=..., units="mm", dpi=300)。 - 对于多面板组合:使用
matplotlib.gridspec、patchworklib(Python)或cowplot/patchwork(R)来对齐面板网格。 - 对于交互式图表:HTML 输出使用 Plotly 或 Bokeh;网页嵌入使用 Vega-Lite。务必提供用于出版的静态备用版本。
- 对于海报展示:将所有字体放大 1.5–2 倍;使用更大的标记(点大小为 8–12 pt)和更粗的线条(2–3 pt);优先采用高对比度的深色背景调色板。
延伸阅读
- 数据可视化基础——Claus O. Wilke(开放获取) — 全面的指南,涵盖图表选择、颜色和图表设计
- 打造更出色图表的十条简单规则(Rougier 等,2014,PLOS Computational Biology) — 实用的同行评审指南
- ColorBrewer 2.0 — 用于选择适合印刷且对色觉缺陷友好的调色板的浏览器工具
- Coblis CVD 模拟器 — 测试图表在 8 种色觉缺陷情况下的可访问性
- Nature Methods——观点专栏 — Bang Wong 及其同事每月分享的可视化建议
- ACS Publications 图表准备指南 — 期刊特定的技术要求
相关技能
matplotlib-figures— 使用 matplotlib 和 seaborn 制作出版级图表的 Python 实现data-visualization— 通用 Python 绘图方法biostatistics— 用于配合图表标注的统计检验选择