科學圖表(期刊出版品質)
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 授權) 作為替代,其字元前進寬度與 Times New Roman 完全相同,因此無論機器是否安裝真實字型,圖表版面都會一致。在信任任何輸出結果前,請先確認字型堆疊解析正確:
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)製作密集的多面板網格;共用圖例。 - 以 300 DPI 匯出,並使用
bbox_inches="tight"(由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—pubstyle的完整 API 文件。fonts/README.md— 為何隨附字型、哪種字型以及其授權條款。NUMBER_REGISTRY.md— 哪些編號範圍已被佔用。新圖表從 1219 開始編號。