mcpField
S
scientific-visualization

scientific-visualization

github.com/jaechang-hits数据与数据库38482 次安装1 周前更新
代码仓库

关于 scientific-visualization

面向科研人员的科学可视化指南,涵盖图表选择、色彩、布局、可访问性和期刊投稿格式。它强调如实呈现数据,并按数据类型与分析目标选择图表。

主要功能

  1. 01按数据结构选择图表类型
  2. 02使用适合色觉障碍的配色
  3. 03规划多面板图的布局与标签
  4. 04遵循期刊尺寸和导出要求
  5. 05检查统计标注与图表可读性

适用场景

  1. 01为连续分布或时间序列选择图表
  2. 02制作适合期刊版面的科研图
  3. 03检查配色在灰度打印中的区分度
  4. 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 或 CMYKArial 5–7 ptPDF、TIFF、EPS
Cell/iScience85 mm(单栏),170 mm(双栏)300 dpi(栅格图),600 dpi(半色调)RGBHelvetica 6–8 ptPDF、EPS、TIFF
ACS 期刊3.25 in(单栏),7 in(双栏)600 dpi(彩色),1200 dpi(黑白线稿)RGB(屏幕显示),CMYK(印刷)Arial/Helvetica 4.5–7 ptTIFF、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、plotnineN < 50 时显示所有数据点;切勿只用柱状图 + SEM
差异表达火山图matplotlibx 轴为 Log2FC,y 轴为 -log10(p)
聚类结果UMAP 散点图scanpy、matplotlib每个注释变量单独绘制一张图
相关性矩阵聚类热图seaborn.clustermap使用以 0 为中心的发散色板
蛋白质结构蛋白质丝带图PyMOL、ChimeraX本文不涉及 — 请使用专用分子图形工具
生存分析Kaplan-Meier 曲线lifelines包含置信带和风险人数表
时间序列带 CI 的折线图matplotlib显示不确定性;连接组均值,而非单个数据点

最佳实践

  1. 展示数据,而不只是汇总结果:对于 N < 100 的情况,使用抖动或蜂群图,在小提琴图或箱线图上叠加显示单个数据点。仅显示均值 ± SEM 的柱状图会掩盖分布形状、离群值和双峰分布。

  2. 默认选择适合 CVD 的色板:顺序数据使用 Okabe-Ito 或 viridis/cividis。投稿前,使用 CVD 模拟器(例如 Coblis)检查图表。

  3. 从一开始就按最终发表尺寸设计:将图表画布设为目标期刊的确切栏宽(例如,Nature 单栏为 89 mm)。事后缩放会使字体过小或过大,并改变纵横比。

  4. 为坐标轴标注单位,并使用描述性标题:每个坐标轴都必须带有单位标签,单位放在括号中(例如,“表达量(log2 CPM)”)。避免使用没有图例说明的晦涩缩写。

  5. 线稿和文字使用矢量格式:图表包含文字和线条时,保存为 PDF 或 SVG。仅在期刊要求提交 TIFF 时才栅格化。矢量图放大后不会出现像素化,且仍可编辑。

  6. 统计注释应与所用检验相符:如果标注显著性星号(*),请在图注中说明所用检验、准确的 p 值和样本量。“n.s.” 也应报告 p 值。

  7. 避免使用双 y 轴:同一图表使用两个不同的 y 轴几乎总会造成误导 — 表面上的关系取决于刻度选择。应改用两个独立面板。

常见误区

  1. 用柱状图展示连续分布(炸药图)

    • 问题所在:均值 ± SEM 柱形会掩盖数据是否呈正态分布、多峰分布或存在离群值。两组数据即使柱形完全相同,其分布也可能截然不同。
    • 如何避免:使用小提琴图、带抖动的箱线图或蜂群图。N < 50 时,显示所有数据点。
  2. 截断或断裂 y 轴,夸大差异

    • 问题所在:将 y 轴起点设为非零值,会让微小差异看起来很大,误导读者对效应大小的判断。
    • 如何避免:对于比率或计数数据,y 轴从零开始。如果确实需要放大查看,可使用嵌入图或单独的面板,并清楚标明坐标轴已截断。
  3. 热图使用彩虹色/jet 色图

    • 问题所在:Jet 在感知上并不均匀,会制造虚假的等高线效果,并且在 CVD 和灰度打印中表现不佳。
    • 如何避免:连续数据使用 viridis、magma 或 inferno;发散数据使用 RdBu 或 coolwarm。这些是 seaborn >= 0.12 中的默认选项。
  4. 数据点重叠,且未使用抖动或透明度

    • 问题所在:数据点彼此叠加(过度绘制),使密集区域看起来稀疏,并掩盖真实的数据密度。
    • 如何避免:添加抖动(seaborn.stripplot(jitter=True))、设置透明度(alpha=0.3),或在 N 较大时改用六边形分箱图/二维密度图。
  5. 标注 P 值,却不提供效应大小或样本量

    • 问题所在:N = 10,000 时,即使结果在统计学上显著(p < 0.05),也可能在科学意义上微不足道。单独使用星号无法提供有用信息。
    • 如何避免:在图注或图中直接报告精确 P 值、效应大小(Cohen's d、优势比)和样本量。
  6. 图中文字在出版尺寸下过小

    • 问题所在:按屏幕尺寸设计后,再缩小到期刊栏宽,会导致文字只有 3–4 pt,无法达到最低可读性标准。
    • 如何避免:从一开始就按最终印刷尺寸设计。检查最终尺寸下的轴标签是否 ≥ 6 pt。
  7. 多面板图中各面板的风格不一致

    • 问题所在:各面板的字体、线宽或配色方案不同,会使图表显得不专业,也更难进行比较。
    • 如何避免:在绘图脚本顶部定义共享的 matplotlib.rcParams 样式字典,并将其应用于所有面板。

工作流

  1. 先明确要传达的信息

    • 用一句话描述希望读者从这张图中获得什么信息。
    • 使用上述决策框架,选择最直接传达该信息的图表类型。
  2. 准备数据

    • 绘图前汇总、整理并验证数据。
    • 检查是否存在应当调查、而非悄悄删除的离群值。
  3. 按屏幕分辨率制作原型

    • 使用你偏好的绘图库(matplotlib、seaborn、ggplot2、plotnine)绘制初稿。
    • 重点确保数据和图表类型正确;此阶段暂不考虑样式。
  4. 应用期刊专属样式

    • 将画布尺寸设为目标期刊的栏宽。
    • 设置字体系列和最小字号。
    • 选择适用于 CVD 的配色方案。
    • 统一线宽(轴线和刻度为 0.5–1.0 pt,数据线为 1.0–2.0 pt)。
  5. 添加注释和标签

    • 面板标签(A、B、C)使用粗体。
    • 轴标签注明单位。
    • 统计注释注明检验名称和精确 P 值。
    • 图例使用描述性条目。
  6. 按正确分辨率导出

    • 矢量格式:线条图和文字使用 PDF 或 SVG。
    • 栅格格式:半色调图像/照片使用 300 dpi 的 TIFF,线条图使用 600 dpi 的 TIFF。
    • 在 matplotlib 中使用 plt.savefig("fig1.pdf", bbox_inches="tight")。
  7. 检查无障碍性

    • 使用在线工具或 GIMP 的色盲滤镜模拟 CVD。
    • 以灰度打印,并确认各面板仍能区分。

协议指南

  1. 对于 matplotlib/seaborn:在每个绘图脚本的顶部设置 rcParams;使用 fig.set_size_inches() 来确保符合期刊尺寸要求;导出时的 dpi 至少为 300。
  2. 对于 R/ggplot2:使用 theme_classic() 或自定义主题;设置 ggsave(width=..., units="mm", dpi=300)。
  3. 对于多面板组合:使用 matplotlib.gridspec、patchworklib(Python)或 cowplot/patchwork(R)来对齐面板网格。
  4. 对于交互式图表:HTML 输出使用 Plotly 或 Bokeh;网页嵌入使用 Vega-Lite。务必提供用于出版的静态备用版本。
  5. 对于海报展示:将所有字体放大 1.5–2 倍;使用更大的标记(点大小为 8–12 pt)和更粗的线条(2–3 pt);优先采用高对比度的深色背景调色板。

延伸阅读

相关技能

  • matplotlib-figures — 使用 matplotlib 和 seaborn 制作出版级图表的 Python 实现
  • data-visualization — 通用 Python 绘图方法
  • biostatistics — 用于配合图表标注的统计检验选择

评论

支持 Markdown