科学图表(达到出版物质量)
1219 个即用型 Matplotlib 生成器,编号从 0 到 1218,可复现高价期刊的图表美学:全程使用 Times New Roman 字体、细深色轴线、柔和饱和调色板、紧凑多面板网格、阈值和指标注释、边缘密度图以及 300 DPI 导出。
每个脚本都是自包含的。无需任何参数即可运行,会自动生成合成数据,并以自身编号为名将 PNG 写入 output/ 目录。
cd scripts
python fig_threshold_regression.py # -> output/01_threshold_regression.png
查找合适的图表
不要阅读此文件来查找图表名称;目录已拆分,因此您只需加载所需部分。
- 阅读
catalog/INDEX.md— 135 个组,每个组对应一个学科或图表家族,并附有编号范围。 - 阅读与之匹配的单个组文件。每个文件会列出该范围内所有图表及其绘制内容和适用场景。
- 在改编前阅读该脚本。
当已经知道图表名称时,可跳过索引直接搜索所有组:
grep -ril "sankey" catalog/
grep -ril "生存曲线\|kaplan" catalog/
要在运行之前查看图表外观,请打开 reference/thumbs/<number>_<name>.jpg — 所有 1219 个缩略图都在那里,已缩小尺寸。reference/curated/ 中保存了 33 个全分辨率版本。
如果目录中没有合适的图表,请从通用组(0-54)开始:分布图、相关图、回归图、排名图、组成图和时间序列图,形式适用于任何学科。
字体:首次运行前请阅读
主要字体是 Times New Roman。它是专有字体,未随附;fonts/ 目录携带了 Tinos(SIL OFL 许可),它具有字节级相同的递进宽度,因此无论机器是否安装了正版字体,图表的布局都是一致的。在信任任何输出之前,请先确认字体堆栈解析正确:
cd scripts
python check_typography.py --metrics
# vs Tinos identical (Tinos-Regular.ttf)
如果 Matplotlib 回退到 DejaVu,set_pub_style() 会抛出错误而非静默降级——错误的字体对于所有基于 PNG 的检查都是不可见的。详情请参阅 fonts/README.md。
依赖要求
每个图表都需要 matplotlib>=3.6 和 numpy;部分图表和工具还需要 scipy、pandas、seaborn、scikit-learn、openpyxl 和 Pillow。要求 3.6 版本很重要:逐字符的字体回退机制允许中文标签借用宋体,同时数字仍保持 Times 字体。
pip install -r requirements.txt
共享样式:scripts/pubstyle.py
在任何新图表中导入此模块以匹配美学风格:
from pubstyle import (set_pub_style, PALETTES, savefig, style_axes,
panel_title, add_figure_header, header_height,
panel_labels_inches)
set_pub_style() # 一次性应用 rcParams;永远不要手动修改
fig, axes = ... # 构建你的图表
panel_title(axes[0], "随时间的漂移幅度")
head = header_height(fig, subtitle=True)
fig.tight_layout(rect=[0, 0.03, 1, 1 - head / fig.get_size_inches()[1]])
add_figure_header(fig,
"循环闭合消除了无界漂移", # 结论
subtitle="n = 240 条轨迹,8 个序列")
panel_labels_inches(fig, axes) # (a) (b) (c) 以相等的英寸偏移量排列
savefig(fig, "my_fig.png") # 以 300 DPI 导出到 output/
尺寸来自 pubstyle.TYPE_SCALE,因此当这些辅助函数能为您完成时,请不要传递 fontsize= 参数。PALETTES 中的关键调色板:teal_rust、blue_red、greens、earth、div_rdbu、pastel4、zones,以及色盲友好的 cb_* 渐变。请重复使用这些调色板,而不是 Matplotlib 的默认调色板——它们正是让图表看起来昂贵的原因。
scripts/figkit.py 是配套的构建层:缩放插图、文本卡片、基于英寸的坐标轴、防重叠标签放置。
适配真实数据
如果数据是表格,请不要从这些脚本开始。 请改用前门接口,它将整个设计系统应用于您的文件:
cd scripts
python plot_data.py --data yours.csv --describe # 我能绘制什么?
python plot_data.py --data yours.csv --kind scatter_fit --x a --y b --group g
支持十四种图表类型、编码和分隔符检测、自动将 "1,234" 和 "12.5%" 转换回数字、针对中文列名的自动 CJK 字体选择,以及 .xlsx 和 .csv 格式。
要适配 1219 个生成器之一,首先找出其数据所在位置:
python plot_data.py --contract fig_threshold_regression.py
这些脚本在这方面并不统一。在 1219 个脚本中,19 个将数据隔离在 gen_data() 函数中,299 个将数据保存在其他需先读取的命名函数中,656 个在 main() 内部内联构建数据,245 个没有可替换的数据,因为图表本身就是一个模型——例如 Kaimal 谱、卡尔曼滤波器、合成显微镜场景。--contract 报告会说明属于哪种情况,并指出值得修改的常量。
无论编辑哪个脚本,请保留绘图和样式代码。样式是宝贵部分;不要用 Matplotlib 的默认值重写它。
美学规则(是什么让它们看起来昂贵)
- 隐藏顶部和右侧的轴线;保持轴线细(
0.8)和深灰色(#333),不要用黑色。 - 全程使用 Times New Roman,字号小(正文 7-9 pt,硬下限 6.0 pt),仅对图表标题、面板字母和面板标题使用粗体。
- 使用柔和饱和调色板对(青色/锈色、蓝色/红色)——切勿使用纯 RGB 颜色。
- 在空间允许的情况下,为散点图添加边缘密度图或直方图。
- 在带薄边框的圆角白盒中注释统计信息;将阈值文本放在强调色中。
- 使用
tight_layout(h_pad, w_pad)实现密集的多面板网格;共享图例。 - 使用
bbox_inches="tight"以 300 DPI 导出(由savefig处理)。
DESIGN_SYSTEM.md 包含每条规则背后的强制执行数字。
验证
打开 output/ 中的 PNG 并将其与请求进行比较。如果面板拥挤,请增大 figsize 或 h_pad/w_pad;如果颜色冲突,请切换到单个 PALETTES 条目。
读取 PNG 无法判断使用了哪种字体,因为 PNG 不存储字体元数据。请同时运行版式审核——它会渲染为 PDF 并读取渲染器嵌入的字体:
cd scripts
python check_typography.py # 错误必须为零
python check_figures.py --jobs 8 # 运行所有内容,审核每个 PNG
python run_all.py --parallel 8 # 重建所有 1219 个(大约 15 分钟)
python run_all.py --range 173-192 # 仅遥感模块
python run_all.py --parallel 8 --vector # 每个 PNG 旁生成 PDF,用于投稿
相关文档
catalog/INDEX.md— 135 个组及其编号范围。DESIGN_SYSTEM.md— 跨图表的视觉标准(画布大小、调色板、字体比例、间距、禁止使用的色图)。在编写新图表或编辑现有图表前请阅读。WORKFLOW.md— 操作手册:选择生成器、替换真实数据、使用new_figure.py搭建新图表、运行质量检查。SKILL.md回答哪个图表;WORKFLOW.md回答如何使用它。scripts/reference.md— 完整的pubstyleAPI。fonts/README.md— 为何在此提供字体、提供了哪个字体及其许可信息。NUMBER_REGISTRY.md— 哪些编号范围已被占用。新图表从 1219 开始。