academic-plotting について
ML論文の執筆者向けに、システム図やデータチャートの作成手順を示す学術作図スキルです。図の種類に応じてGeminiによる画像生成、matplotlib、seabornを使い分けます。
主な機能
- 01論文の文脈から図の要素を抽出
- 02Geminiでアーキテクチャ図を生成
- 03matplotlibとseabornでデータを作図
- 04データ構造に応じたチャート選択
- 05出版向けスタイルと出力チェックリスト
活用シーン
- 01手法の説明からシステム図を作成
- 02実験結果の比較を可視化
- 03学習曲線やアブレーションの図表作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ orchestra-research/ ai-research-skills --skill academic-plottingインストール後、Claude Code で/academic-plottingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/data-visualization.mddiagram-generation.mdstyle-guide.md詳細
ML 論文向けの学術的な図の作成
ML/AI カンファレンス論文向けに、出版品質の図を作成します。ワークフローは次の 2 種類です。
- 図解(アーキテクチャ、システム設計、ワークフロー、パイプライン) — Gemini による AI 画像生成
- データ図(折れ線グラフ、棒グラフ、散布図、ヒートマップ、アブレーション) — 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 データ | 実験ログファイル | 変数、傾向、グループ化の軸 |
| あいまいな依頼 | 「概要を図にしてください」 | 論文の周辺コンテキストを読み、内容を推測 |
抽出のワークフロー
図解の場合(研究のコンテキスト → アーキテクチャ図):
- 提示されたコンテキストを読む — 論文のセクション、要旨、説明文
- 視覚的な要素を特定する — 主な構成要素/モジュール/段階は何か?
- 注目点:システムの各部分、名前の付いたモジュール、レイヤー、段階を表す名詞
- 数を数える:最上位の要素が 8 個を超える場合は、セクションごとにまとめることを検討
- 関係を特定する — 構成要素はどのようにつながっているか?
- 注目点:データフローを表す動詞(「送信する」「問い合わせる」「入力する」)
- 分類:データフロー(実線の矢印)、制御フロー(灰色)、エラーパス(赤い破線)
- レイアウトのパターンを決める:
- 順次パイプライン → 左から右への流れ
- レイヤー型アーキテクチャ → 水平方向の帯を縦に積み重ねる
- ハブ&スポーク → 接続が放射状に伸びる中央ノード
- 階層型 → 上から下へのツリー
- 色を割り当てる — 論理的なグループ/レイヤーごとにアクセントカラーを 1 色使用
- すべてのラベルを正確に記述する — 論文の本文から正確な用語を抽出
データ図の場合(結果 → 図):
- 提示されたデータを読む — 表、数値を含む文章、CSV、JSON
- 次元を特定する:
- 何を比較しているか?(手法、モデル、構成)→ カテゴリ軸
- 指標は何か?(精度、損失、レイテンシ、F1)→ 値軸
- 時間/ステップの次元があるか?→ 折れ線グラフ
- 複数の指標があるか?→ 複数パネルまたはグループ化した棒グラフ
- 次の優先順位に従って、グラフの種類を自動的に選ぶ:
- ステップ/時間軸がある → 折れ線グラフ
- N 個の手法を M 個のベンチマークで比較 → グループ化した棒グラフ
- 単一のランキング → 横棒グラフ(リーダーボード)
- 2 つの連続変数間の相関 → 散布図
- 値を持つ正方行列 → ヒートマップ
- 比率の内訳 → 積み上げ棒グラフ(円グラフは避ける)
- 図のサイズを決める — データの密度に応じて、1 段幅か全幅かを選ぶ
- 「自分たちの手法」を強調する — 論文の貢献に該当する項目を特定し、独自の色を割り当てる
自動検出の例
コンテキスト → 図:「システムには 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 段組み | 全幅 | フォント |
|---|---|---|---|
| NeurIPS | 5.5 in | 5.5 in | Times |
| ICML | 3.25 in | 6.75 in | Times |
| ICLR | 5.5 in | 5.5 in | Times |
| ACL | 3.3 in | 6.8 in | Times |
| AAAI | 3.3 in | 7.0 in | Times |
ベクター品質を保つため、必ず 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/seaborn | Plotly(対話型)、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)