mcpField
A
academic-plotting

academic-plotting

github.com/orchestra-researchデータ・データベース14.1k1.2k 回インストール19 週間前に更新
リポジトリ

academic-plotting について

ML論文の執筆者向けに、システム図やデータチャートの作成手順を示す学術作図スキルです。図の種類に応じてGeminiによる画像生成、matplotlib、seabornを使い分けます。

主な機能

  1. 01論文の文脈から図の要素を抽出
  2. 02Geminiでアーキテクチャ図を生成
  3. 03matplotlibとseabornでデータを作図
  4. 04データ構造に応じたチャート選択
  5. 05出版向けスタイルと出力チェックリスト

活用シーン

  1. 01手法の説明からシステム図を作成
  2. 02実験結果の比較を可視化
  3. 03学習曲線やアブレーションの図表作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/orchestra-research/ai-research-skills --skill academic-plotting

インストール後、Claude Code で/academic-plottingを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
data-visualization.md
diagram-generation.md
style-guide.md

詳細

ML 論文向けの学術的な図の作成

ML/AI カンファレンス論文向けに、出版品質の図を作成します。ワークフローは次の 2 種類です。

  1. 図解(アーキテクチャ、システム設計、ワークフロー、パイプライン) — Gemini による AI 画像生成
  2. データ図(折れ線グラフ、棒グラフ、散布図、ヒートマップ、アブレーション) — matplotlib/seaborn

どちらのワークフローを使うか

図の種類ツール理由
アーキテクチャ/システム図Gemini(ワークフロー 1)ボックス、矢印、ラベルを含む複雑な空間レイアウト
ワークフロー/パイプライン/ライフサイクルGemini(ワークフロー 1)接続を伴う複数ステップのプロセス
棒グラフ、折れ線グラフ、散布図matplotlib(ワークフロー 2)正確な数値データを再現可能な形で表示
ヒートマップ、混同行列matplotlib/seaborn(ワークフロー 2)構造化されたグリッドデータ
グラフ形式のアブレーション表matplotlib(ワークフロー 2)グループ化した棒グラフまたは折れ線で比較
円グラフ/ドーナツグラフmatplotlib(ワークフロー 2)比率データ(ML 論文では控えめに使用)
学習曲線matplotlib(ワークフロー 2)ステップ/エポックごとの損失/精度

判断の目安:数値軸がある図には matplotlib を使います。ボックスと矢印がある図には Gemini を使います。


ステップ 0:コンテキストの分析と抽出

ユーザーが通常提示するのは、完成した仕様ではなく、次のいずれかの入力です。

入力の種類例抽出する内容
論文全体/セクションの草稿「こちらが手法のセクションです……」システムの構成要素、それらの関係、データフロー
説明文「私たちのシステムは 3 つのレイヤーで構成され……」主要な要素、階層、接続
生の結果/データ表「MMLU:85.2、HumanEval:72.1……」指標、手法、比較の構成
CSV/JSON データ実験ログファイル変数、傾向、グループ化の軸
あいまいな依頼「概要を図にしてください」論文の周辺コンテキストを読み、内容を推測
抽出のワークフロー

図解の場合(研究のコンテキスト → アーキテクチャ図):

  1. 提示されたコンテキストを読む — 論文のセクション、要旨、説明文
  2. 視覚的な要素を特定する — 主な構成要素/モジュール/段階は何か?
    • 注目点:システムの各部分、名前の付いたモジュール、レイヤー、段階を表す名詞
    • 数を数える:最上位の要素が 8 個を超える場合は、セクションごとにまとめることを検討
  3. 関係を特定する — 構成要素はどのようにつながっているか?
    • 注目点:データフローを表す動詞(「送信する」「問い合わせる」「入力する」)
    • 分類:データフロー(実線の矢印)、制御フロー(灰色)、エラーパス(赤い破線)
  4. レイアウトのパターンを決める:
    • 順次パイプライン → 左から右への流れ
    • レイヤー型アーキテクチャ → 水平方向の帯を縦に積み重ねる
    • ハブ&スポーク → 接続が放射状に伸びる中央ノード
    • 階層型 → 上から下へのツリー
  5. 色を割り当てる — 論理的なグループ/レイヤーごとにアクセントカラーを 1 色使用
  6. すべてのラベルを正確に記述する — 論文の本文から正確な用語を抽出

データ図の場合(結果 → 図):

  1. 提示されたデータを読む — 表、数値を含む文章、CSV、JSON
  2. 次元を特定する:
    • 何を比較しているか?(手法、モデル、構成)→ カテゴリ軸
    • 指標は何か?(精度、損失、レイテンシ、F1)→ 値軸
    • 時間/ステップの次元があるか?→ 折れ線グラフ
    • 複数の指標があるか?→ 複数パネルまたはグループ化した棒グラフ
  3. 次の優先順位に従って、グラフの種類を自動的に選ぶ:
    • ステップ/時間軸がある → 折れ線グラフ
    • N 個の手法を M 個のベンチマークで比較 → グループ化した棒グラフ
    • 単一のランキング → 横棒グラフ(リーダーボード)
    • 2 つの連続変数間の相関 → 散布図
    • 値を持つ正方行列 → ヒートマップ
    • 比率の内訳 → 積み上げ棒グラフ(円グラフは避ける)
  4. 図のサイズを決める — データの密度に応じて、1 段幅か全幅かを選ぶ
  5. 「自分たちの手法」を強調する — 論文の貢献に該当する項目を特定し、独自の色を割り当てる
自動検出の例

コンテキスト → 図:「システムには Planner、Executor、Verifier があります。Planner は Executor に計画を送信し、Executor は Verifier に結果を返します。Verifier は失敗した場合に Planner へフィードバックします。」 → エンティティ 3 個、循環レイアウト、破線のフィードバック矢印 → ワークフロー 1(Gemini)

データ → グラフ:「GPT-4:MMLU 86.4、HumanEval 67.0。自社モデル:88.1、71.2。Llama-3:79.3、62.1。」 → 手法 3 個 × ベンチマーク 2 個 → ワークフロー 2(グループ化棒グラフ)、「自社モデル」をコーラルで強調


ワークフロー 1:アーキテクチャとシステム図(AI 画像生成)

Gemini 3 Pro Image Preview を使用して図を生成します。まずビジュアルスタイルを選びます。図がプロフェッショナルに見えるか、ありきたりに見えるかを決める最も大きな要因です。

ビジュアルスタイル

論文ごとに 1 つのスタイルを選びます(すべての図で一貫させてください)。

スタイル A:「Sketch / 简笔画」(手描き)

温かみがあり、親しみやすく、印象に残ります。概要図やシステムの紹介に最適です。デザイナーが仕上げたホワイトボードのスケッチのように見えます。

VISUAL STYLE — HAND-DRAWN SKETCH:
- Slightly irregular, hand-drawn line quality — lines wobble gently, not perfectly straight
- Rounded, soft shapes with visible pen strokes (like drawn with a thick felt-tip marker)
- Warm off-white background (#FAFAF7), NOT pure white
- Fill colors are soft watercolor-like washes: muted blue (#D6E4F0), soft peach (#F5DEB3),
  light sage (#D4E6D4), pale lavender (#E6DFF0)
- Borders are dark charcoal (#2C2C2C) with 2-3px line weight, slightly uneven
- Arrows are hand-drawn with slight curves, ending in simple open arrowheads (not filled triangles)
- Text uses a rounded sans-serif font (like Comic Neue or Architects Daughter feel)
- Small doodle-style icons inside boxes: a tiny gear ⚙ for processing, a lightbulb 💡 for ideas,
  a magnifying glass 🔍 for search — rendered as simple line drawings, NOT emoji
- Overall feel: a carefully drawn whiteboard diagram, clean but with personality
- NO clip art, NO stock icons, NO photorealistic elements
スタイル B:「Modern Minimal」(クリーンで大胆)

自信に満ち、権威のある印象です。精密さが重要な手法図に最適です。

VISUAL STYLE — MODERN MINIMAL:
- Ultra-clean geometric shapes with crisp edges
- Bold color blocks as backgrounds for sections — NOT just accent bars, but full section fills
  using desaturated tones: slate blue (#E8EDF2), warm sand (#F5F0E8), cool mint (#E8F2EE)
- Component boxes have ROUNDED CORNERS (12px radius), NO visible border — they float on
  the section background using subtle shadow (1px, 4px blur, rgba(0,0,0,0.06))
- ONE accent color per section used sparingly on key elements: Deep blue (#2563EB),
  Emerald (#059669), Amber (#D97706), Rose (#E11D48)
- Arrows are thin (1.5px), dark gray (#6B7280), with small filled circle at source
  and clean arrowhead at target — NOT thick colored arrows
- Typography: Inter or system sans-serif, title 600 weight, body 400 weight
- Labels INSIDE boxes, not beside them
- Generous whitespace — at least 24px between elements
- NO decorative elements, NO icons — let the structure speak
スタイル C:「Illustrated Technical」(アイコンを多用)

魅力的で、説明に適しています。チュートリアル形式の論文や、見ただけで内容が理解できる図に向いています。

VISUAL STYLE — ILLUSTRATED TECHNICAL:
- Each major component has a small MEANINGFUL ICON drawn in a consistent line-art style
  (single color, 2px stroke, ~24x24px): brain icon for reasoning, database cylinder for storage,
  arrow-loop for iteration, network nodes for communication
- Components sit inside soft rounded rectangles with a LEFT COLOR STRIP (4px wide)
- Background is pure white, but each logical group has a very faint colored region behind it
  (#F8FAFC for blue group, #FFF8F0 for orange group)
- Connections use CURVED bezier paths (not straight lines), colored by SOURCE component
- Key data flows are THICKER (3px) than secondary flows (1px, dashed)
- Small annotation badges on arrows: "×N" for repeated operations, "optional" in italics
- Title labels are ABOVE each section in small caps, letter-spaced
- Overall: like a well-designed API documentation diagram
スタイル D:「Accent Bar」(古典的なアカデミックスタイル)

標準的なアカデミックスタイルです。どの発表の場でも使いやすく、グレースケールでも適切に表示されます。

VISUAL STYLE — CLASSIC ACCENT BAR:
- Horizontal section bands stacked vertically, pale gray (#F7F7F5) fill
- Thick colored LEFT ACCENT BAR (8px) distinguishes each section
- Content boxes: white fill, thin #DDD border, 4px rounded corners
- Section palette: Blue #4A90D9, Teal #5BA58B, Amber #D4A252, Slate #7B8794
- Sans-serif typography (Helvetica/Arial), bold titles, regular body
- Colored arrows match their SOURCE section
- Clean, flat, zero decoration
厳選カラーパレット

「Ocean Dusk」(プロフェッショナルで落ち着いた印象 — デフォルトの推奨): #264653 ディープティール、#2A9D8F ティール、#E9C46A ゴールド、#F4A261 サンディオレンジ、#E76F51 バーントコーラル

「Ink & Wash」(简笔画スタイル向け): #2C2C2C チャコールインク、#D6E4F0 淡いブルー、#F5DEB3 淡い小麦色、#D4E6D4 淡いセージ、#E6DFF0 淡いラベンダー

「Nord」(モダンミニマル向け): #2E3440 ポーラーナイト、#5E81AC フロストブルー、#A3BE8C オーロラグリーン、#EBCB8B オーロライエロー、#BF616A オーロラレッド

「Okabe-Ito」(汎用の色覚多様性対応。データグラフでは必須): #E69F00 オレンジ、#56B4E9 スカイブルー、#009E73 グリーン、#F0E442 イエロー、#0072B2 ブルー、#D55E00 バーミリオン、#CC79A7 ピンク

チェックリスト
  • コンテキストから抽出:論文や説明を読み、エンティティと関係性を特定します
  • ビジュアルスタイルを選択(A/B/C/D) — 論文の雰囲気や発表の場に合わせます
  • カラーパレットを選択 — または、論文内の既存の図と一貫性のあるものを使います
  • Gemini API キーを取得します(GEMINI_API_KEY 環境変数)
  • 詳細なプロンプトを作成します:スタイルブロック + レイアウト + 接続 + 制約
  • figures/gen_fig_<name>.py にスクリプトを作成し、3 回試行して実行します
  • 確認して最適なものを選び、figures/fig_<name>.png として保存します
プロンプトの構成(6 セクション)

Gemini のすべてのプロンプトには、以下のセクションを順番どおりに含める必要があります。

1. FRAMING (5 lines): "Create a [STYLE_NAME]-style technical diagram for a
   [VENUE] paper. The diagram should feel [ADJECTIVES]..."

2. VISUAL STYLE (20-30 lines): Copy the full style block from above (A/B/C/D).
   This is the most important section — it determines the entire visual character.

3. COLOR PALETTE (10 lines): Exact hex codes for every color used.

4. LAYOUT (50-150 lines): Every component, box, section — exact text, spatial
   arrangement, and grouping. Be exhaustively specific.

5. CONNECTIONS (30-80 lines): Every arrow individually — source, target, style,
   label, routing direction.

6. CONSTRAINTS (10 lines): What NOT to include. Adapt per style — e.g., sketch
   style allows slight irregularity but still no clip art.
生成スクリプトのテンプレート
#!/usr/bin/env python3
"""Generate [FIGURE_NAME] diagram using Gemini image generation."""
import os, sys, time
from google import genai

API_KEY = os.environ.get("GEMINI_API_KEY")
if not API_KEY:
    print("ERROR: Set GEMINI_API_KEY environment variable.")
    print("  Get a key at: https://aistudio.google.com/apikey")
    sys.exit(1)

MODEL = "gemini-3-pro-image-preview"
OUTPUT_DIR = os.path.dirname(os.path.abspath(__file__))
client = genai.Client(api_key=API_KEY)

PROMPT = """
[PASTE YOUR 6-SECTION PROMPT HERE]
"""

def generate_image(prompt_text, attempt_num):
    print(f"\n{'='*60}\nAttempt {attempt_num}\n{'='*60}")
    try:
        response = client.models.generate_content(
            model=MODEL,
            contents=prompt_text,
            config=genai.types.GenerateContentConfig(
                response_modalities=["IMAGE", "TEXT"],
            ),
        )
        output_path = os.path.join(OUTPUT_DIR, f"fig_NAME_attempt{attempt_num}.png")
        for part in response.candidates[0].content.parts:
            if part.inline_data:
                with open(output_path, "wb") as f:
                    f.write(part.inline_data.data)
                print(f"Saved: {output_path} ({os.path.getsize(output_path):,} bytes)")
                return output_path
            elif part.text:
                print(f"Text: {part.text[:300]}")
        print("WARNING: No image in response")
        return None
    except Exception as e:
        print(f"ERROR: {e}")
        return None

def main():
    results = []
    for i in range(1, 4):
        if i > 1:
            time.sleep(2)
        path = generate_image(PROMPT, i)
        if path:
            results.append(path)
    if not results:
        print("All attempts failed!")
        sys.exit(1)
    print(f"\nGenerated {len(results)} attempts. Review and pick the best.")

if __name__ == "__main__":
    main()
主なルール
  • 必ず 3 回試行する — 実行ごとに品質が大きく異なります
  • スタイルブロックは必須 — 指定しないと、Gemini はありきたりな企業風の外観をデフォルトで使用します
  • API キーをハードコードしない — os.environ.get("GEMINI_API_KEY") を使用します
  • 生成スクリプトを保存する — 再現性が重要です
  • すべてのラベルを正確に指定する — Gemini はテキストを誤記したり、配置を入れ替えたりすることがあります

スタイルごとのプロンプト全文の例:references/diagram-generation.md を参照してください


ワークフロー 2:データ駆動型グラフ(matplotlib/seaborn)

数値データ、軸、または定量的な比較を含む図に使用します。

チェックリスト
  • コンテキストから抽出:結果やデータを解析し、手法、指標、比較構造を特定します
  • データの次元に基づいてグラフの種類を自動選択します(以下の判断ガイドを参照)
  • データを準備します(CSV、辞書、またはインライン配列)
  • 論文掲載向けのスタイルを適用します(フォント、色、サイズ)
  • 「自社の手法」を独自の色で強調します
  • PDF(ベクター)と PNG(300 DPI)の両方でエクスポートします
  • LaTeX のフォント互換性を確認します
  • figures/gen_fig_<name>.py にスクリプトを保存します
グラフの種類の選択ガイド
データパターン最適なグラフ備考
時間/ステップに沿った傾向折れ線グラフ学習曲線、スケーリング則
カテゴリの比較グループ化棒グラフモデルの比較、アブレーション
分布バイオリンプロット/箱ひげ図手法ごとのスコア分布
相関散布図埋め込み分析、指標の相関
値のグリッドヒートマップアテンションマップ、混同行列
全体に占める割合積み上げ棒グラフ(円グラフではない)ML 論文では円グラフより積み上げ棒グラフを推奨
1 つの指標に対する多数の手法横棒グラフリーダーボード形式の比較
論文向けスタイルテンプレート
import matplotlib.pyplot as plt
import numpy as np

# --- Publication defaults (polished, not generic) ---
plt.rcParams.update({
    "font.family": "serif", "font.serif": ["Times New Roman", "DejaVu Serif"],
    "font.size": 10, "axes.titlesize": 11, "axes.titleweight": "bold",
    "axes.labelsize": 10, "legend.fontsize": 8.5, "legend.frameon": False,
    "figure.dpi": 300, "savefig.dpi": 300, "savefig.bbox": "tight",
    "axes.spines.top": False, "axes.spines.right": False,
    "axes.grid": True, "grid.alpha": 0.15, "grid.linestyle": "-",
    "lines.linewidth": 1.8, "lines.markersize": 5,
})

# --- "Ocean Dusk" palette (professional, distinctive, colorblind-safe) ---
COLORS = ["#264653", "#2A9D8F", "#E9C46A", "#F4A261", "#E76F51",
          "#0072B2", "#56B4E9", "#8C8C8C"]
OUR_COLOR = "#E76F51"       # coral — warm, stands out
BASELINE_COLOR = "#B0BEC5"  # cool gray — recedes
FIG_SINGLE, FIG_FULL = (3.25, 2.5), (6.75, 2.8)
よく使われるグラフパターン

折れ線グラフ(学習曲線) — マーカーと信頼帯を使用:

fig, ax = plt.subplots(figsize=FIG_SINGLE)
markers = ["o", "s", "^", "D", "v"]
for i, (method, (mean, std)) in enumerate(results.items()):
    color = OUR_COLOR if method == "Ours" else COLORS[i]
    ax.plot(steps, mean, label=method, color=color,
            marker=markers[i % 5], markevery=max(1, len(steps)//8),
            markersize=4, zorder=3)
    ax.fill_between(steps, mean - std, mean + std, color=color, alpha=0.12)
ax.set_xlabel("Training Steps")
ax.set_ylabel("Accuracy (%)")
ax.legend(loc="lower right")
fig.savefig("figures/fig_training.pdf")
fig.savefig("figures/fig_training.png", dpi=300)

グループ化棒グラフ(アブレーション) — 値ラベル付き:

fig, ax = plt.subplots(figsize=FIG_FULL)
x = np.arange(len(categories))
n = len(methods)
width = 0.7 / n
for i, (method, scores) in enumerate(methods.items()):
    color = OUR_COLOR if method == "Ours" else COLORS[i]
    offset = (i - n / 2 + 0.5) * width
    bars = ax.bar(x + offset, scores, width * 0.9, label=method, color=color,
                  edgecolor="white", linewidth=0.5)
    for bar, s in zip(bars, scores):
        ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.3,
                f"{s:.1f}", ha="center", va="bottom", fontsize=7, color="#444")
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.set_ylabel("Score")
ax.legend(ncol=min(n, 4))
fig.savefig("figures/fig_ablation.pdf")

ヒートマップ — 発散型カラーマップとすっきりした境界線を使用:

import seaborn as sns
fig, ax = plt.subplots(figsize=(4, 3.5))
sns.heatmap(matrix, annot=True, fmt=".2f", cmap="YlOrRd", ax=ax,
            cbar_kws={"shrink": 0.75, "aspect": 20},
            linewidths=1.5, linecolor="white",
            annot_kws={"size": 8, "weight": "medium"})
ax.set_xlabel("Predicted")
ax.set_ylabel("Actual")
fig.savefig("figures/fig_confusion.pdf")

横棒グラフ(リーダーボード) — 「自分たちの手法」を強調:

fig, ax = plt.subplots(figsize=FIG_SINGLE)
y_pos = np.arange(len(models))
colors = [BASELINE_COLOR] * len(models)
colors[our_idx] = OUR_COLOR
bars = ax.barh(y_pos, scores, color=colors, height=0.55,
               edgecolor="white", linewidth=0.5)
ax.set_yticks(y_pos)
ax.set_yticklabels(models)
ax.set_xlabel("Accuracy (%)")
ax.invert_yaxis()
for bar, s in zip(bars, scores):
    ax.text(bar.get_width() + 0.3, bar.get_y() + bar.get_height()/2,
            f"{s:.1f}", va="center", fontsize=8, color="#444")
fig.savefig("figures/fig_leaderboard.pdf")

パターンライブラリ全体(スケーリング則、バイオリンプロット、マルチパネル、レーダーチャート):references/data-visualization.md を参照してください


論文向けスタイルのクイックリファレンス

会議1 段組み全幅フォント
NeurIPS5.5 in5.5 inTimes
ICML3.25 in6.75 inTimes
ICLR5.5 in5.5 inTimes
ACL3.3 in6.8 inTimes
AAAI3.3 in7.0 inTimes

ベクター品質を保つため、必ず PDF でエクスポートしてください。 PNG は AI 生成の図に限って使用してください。

会議ごとの詳細、LaTeX との統合、フォントの一致、アクセシビリティのチェックリスト:references/style-guide.md を参照してください


よくある問題

問題解決策
LaTeX でフォントが正しく表示されないPDF でエクスポートするか、text.usetex=True を設定するか、font.family=serif を使用してください
図が段組み幅に収まらない会議の幅の上限を確認し、インチ単位で figsize を設定してください
印刷時に色を見分けにくい色覚多様性に配慮したパレットと、異なる線種/マーカーを使用してください
Gemini がラベルのスペルを間違えるプロンプト内ですべてのラベルを正確に記述し、「SPELL EXACTLY」という制約を追加してください
Gemini がスタイルを無視する否定的な制約を追加し、16 進数カラーについてより具体的に指定してください
PDF 内の図がぼやけるPNG ではなく PDF(ベクター)でエクスポートするか、PNG なら 300 DPI 以上を使用してください
凡例がデータに重なるbbox_to_anchor、loc="upper left"、または外部凡例を使用してください
目盛りラベルが多すぎるax.xaxis.set_major_locator(MaxNLocator(5)) を使用してください

使用する場合と代替手段

必要なものこのスキル代替手段
アーキテクチャ図Gemini による生成TikZ(手動)、draw.io(対話型)、Mermaid(シンプル)
データグラフmatplotlib/seabornPlotly(対話型)、R/ggplot2(統計重視)
論文全体の執筆ml-paper-writing と併用—
ポスター用の図大きめのフォント、広めの図latex-posters スキル
プレゼンテーション用の図大きめの文字、少なめの詳細PowerPoint/Keynote でエクスポート

クイックリファレンス:ファイル命名規則

figures/
├── gen_fig_<name>.py      # Generation script (always save for reproducibility)
├── fig_<name>.pdf         # Final vector output (for LaTeX)
├── fig_<name>.png         # Raster output (300 DPI, for AI-generated or fallback)
└── fig_<name>_attempt*.png # Gemini attempts (keep for comparison)

コメント