tameshita新しいツールを実際に動かした記録

scipilot-figure-skill — 投稿規定サイズで論文用の図を自動整形するAIスキル動いた

研究データ(CSV)を剖検して適切なグラフ種を提案し、Nature/Science/IEEE等の投稿規定サイズ・フォント・DPIで図を描き、保存前に文字化けや裁切れをセルフチェックするClaude Code/Codex向けのPythonスキル。

配布元: https://github.com/Haojae/scipilot-figure-skill  / 2026-09-13 時点で確認

この日に実際に動かした結果です。内容の誤りに気づかれた場合はお問い合わせください。確認のうえ訂正します。

scipilot-figure-skill を使う前に分かること

必要なもの追加で用意するものは無し(無料の範囲で動いた)
動かした環境python:3.11 (venv) / matplotlib 3.11.2, seaborn 0.13.2, pandas 3.0.5, numpy 2.4.6, scipy 1…
日本語日本語のデータでも動いた
確認日2026-09-13(この日に実際に動かした)

scipilot-figure-skill の使い方

やること:群ごとにn=6〜8しかない小標本の実験データ(CSV)から、Nature単カラム仕様(3.5×2.625インチ, 300dpi)にぴったり収まる箱ひげ+ストリップ図を作る

  1. Skillとしてクローンし、依存ライブラリを入れる。

    pip install -r requirements.txt

    matplotlib・seaborn・pandas・scipy・Pillow・plotlyが入り、scripts/以下のスクリプトを直接実行できる状態になる

  2. 手元のCSV(3群×n=6〜8の反応時間データ)をprofile_data.pyに通し、標本数・分布・相関を確認する。群を表す列は--groupで明示的に渡す。

    python scripts/profile_data.py results.csv --group group

    「少なくとも1群がn<10 → 平均棒グラフではなく箱ひげ/バイオリン+stripplotを使うこと」という警告と、reaction_time_ms↔sleep_hoursのr=-0.764(very strong)という相関が出力される

  3. 警告に従い、平均棒グラフではなく箱ひげ+ストリップ(生データの点)を選ぶ。setup_style(journal='nature', lang='en')でNature単カラム仕様のフォント・線幅・DPIを一括適用してからseabornで重ね描きする。

    from setup_style import setup_style
    from export_figure import export_figure
    
    df = pd.read_csv("results.csv")
    
    info = setup_style(journal="nature", lang="en")
    print("setup_style ->", info)
    
    order = ["control", "caffeine", "sleep_deprived"]
    fig, ax = plt.subplots()
    sns.boxplot(data=df, x="group", y="reaction_time_ms", order=order,
                showfliers=False, boxprops={"facecolor": "none"}, ax=ax)
    sns.stripplot(data=df, x="group", y="reaction_time_ms", order=order,
                  size=3, color="black", alpha=0.7, jitter=0.15, ax=ax)

    自分でrcParamsを調整しなくても、Nature規定のフォントサイズ・線幅・上右の枠線なしが最初から適用された箱ひげ+ストリップ図がその場で描画される(setup_style -> {'journal': 'nature', 'lang': 'en', ...} が出力される)

  4. 軸ラベルを日本語にする場合はsetup_styleのlang='zh'を指定する(名前は中国語向けだが、実体はインストール済みCJKフォントを探すだけの処理で日本語にもそのまま使える)。保存前にaudit_layout(fig)でレイアウト崩れを自己点検する。

    info = setup_style(journal="general", lang="zh")  # 日本語グラフでも CJK フォント検出には lang='zh' を使う
    print("setup_style ->", info)
    
    ax.set_xticklabels(["対照群", "カフェイン", "睡眠不足"])
    ax.set_ylabel("反応時間 (ms)")
    
    issues = audit_layout(fig)
    verdict = print_report(issues)

    lang='en'のままだと Glyph ... missing from font(s) DejaVu Sans という警告が大量に出て、PNG上でも漢字・カタカナが四角(トーフ)になる。lang='zh'に変えると setup_style -> {'journal': 'general', 'lang': 'zh', ... 'cjk_font': 'WenQuanYi Zen Hei', ...} となり、実際のPNGでは漢字・カタカナとも正しく表示される

  5. export_figure()で最終寸法とdpiを指定して書き出す。既定のtight=Trueだとbbox調整で実寸が指定サイズより大きくなるため、寸法をきっちり合わせたい場合はtight=Falseを指定し、check_figure.pyで体裁を確認する。

    paths = export_figure(
        fig, "fig1_reaction_time_notight",
        formats=["png"],
        size_inches=(3.5, 2.625),
        dpi=300,
        tight=False,
    )
    print("exported:", paths)

    python scripts/check_figure.py fig1_reaction_time_notight.png --min-dpi 300 --width-in 3.5 --height-in 2.625 が [PASS] 无问题 を返す(tight=Trueのままだと実寸3.61×2.74inとなりWARNになる)

最後まで通した時に出たもの(実際の出力)

--- fig1_reaction_time_notight.png --- category: raster ext: png size: 36894 B pixels: 1050x787 dpi: (299.9994, 299.9994) [PASS] 无问题。

scipilot-figure-skill の良かった点

  • 群ごとにn=6〜8という小標本を実際に検出し、「平均棒グラフでは分布を隠してしまうので箱ひげ+ストリップに」という具体的な警告を出した。README通りの『思考してから描く』挙動を実データで確認できた
  • setup_style(journal='nature')を呼ぶだけで、フォントサイズ・線幅・DPI・上右の枠線なしなど投稿規定に沿ったスタイルが一括で揃い、rcParamsを自分で1つずつ調整する手間がなかった
  • 文字化け検知の発想自体は有効で、lang='en'のまま日本語ラベルを付けた時の本物のトーフ文字化けは確実に検出できた

scipilot-figure-skill の不便だった点

  • pip installで今日入る最新のpandas(3.0.5)はCSVの文字列列を既定でStringDtype('str')として読み込むが、profile_data.pyの型判定はis_object_dtype()しか見ていないため、群を表す列が「unknown」型に誤判定され、列ごとの分類サマリ(カテゴリ内訳・小標本フラグ)が出なくなる。--groupで明示的に渡せばグループ集計自体は別ロジックで動くため実害は避けられるが、この列型のすれ違いはREADMEに記載がない
  • export_figure()は既定でtight=True(bbox_inches='tight')のため、size_inchesで指定した寸法より実際の出力画像が一回り大きくなり(3.5×2.625inのつもりが3.61×2.74in)、同梱のcheck_figure.py自身の寸法チェックにWARNで引っかかる。ぴったり合わせるにはtight=Falseを明示する必要がある
  • visual_qa.audit_layout()の文字化け検知は、matplotlibの'findfont'という文字列を含むログ行を無差別に『文字化け』として拾う実装になっている。CJKフォント(WenQuanYi Zen Hei)の太字(weight)が見つからず代替されただけの無害な警告でも即FAIL判定になり、実際に書き出したPNGでは文字が正しく表示されているのに誤検知だった。自動判定を鵜呑みにせず出力画像を目視する必要がある

詰まった点と、効いた対処

実行したコマンド
python scripts/profile_data.py results.csv --group group
出たエラー
| `group` | unknown | 21 | 0 |  |
対処

python scripts/profile_data.py results.csv --group group のように、分類したい列を--groupで明示的に渡す(こちらはdf.groupby()を直接使うため型判定を経由せず正しく動く)

実行したコマンド
python make_figure_ja_default.py
出たエラー
UserWarning: Glyph 23550 (\N{CJK UNIFIED IDEOGRAPH-5BFE}) missing from font(s) DejaVu Sans.
対処

setup_style(journal='general', lang='zh') に変える(名前は中国語向けだが、実体はインストール済みCJKフォントを探すだけの処理なので日本語にもそのまま使える)

実行したコマンド
python make_figure_ja_fixed.py
出たエラー
[FAIL] 检测到缺字,成图会出现方框/乱码:findfont: Failed to find font weight normal for WenQuanYi Zen Hei, now using 500.
対処

実際に書き出したPNGを目視して確認する(今回は文字化けしておらず、audit_layoutの誤検知だった)。'findfont'という文字列だけで判定しているため、フォント太さの代替が起きるだけで誤ってFAILになる

日本語で使うときの注意

CJKフォント検出オプションは`lang='zh'`という名前だが、実体は『インストール済みのCJKフォントを探して差し替える』だけの処理で、日本語(漢字・カタカナ)にもそのまま使える。名前だけ見て『中国語専用』と誤解しないこと。ただし自動セルフチェック(audit_layout)がmatplotlibの'findfont'ログを拾って誤ってFAILを出すことがあるため、日本語ラベルを使うときは特に、保存前に出力画像を自分の目で確認したほうがよい。

確認した条件

確認日2026-09-13
試した版43098ddb9e6a6d142218540c114f9ed38922fc42
実行環境python:3.11 (venv) / matplotlib 3.11.2, seaborn 0.13.2, pandas 3.0.5, numpy 2.4.6, scipy 1.17.1, Pillow 12.3.0, plotly 7.0.0。CJKフォントはサンドボックスに標準搭載されていた WenQuanYi Zen Hei を使用(別途インストールはしていない)。