LogoPaperBanana
  • 機能
  • 論文可視化NEW
  • 画像編集
  • 料金
  • ブログ
論文用のグループ化棒グラフの作り方(matplotlib の完全なコード + CSV からの近道)
2026/11/10

論文用のグループ化棒グラフの作り方(matplotlib の完全なコード + CSV からの近道)

そのままコピーして使える、論文品質のグループ化棒グラフの matplotlib レシピ。ロング形式の CSV、エラーバー、色覚多様性に配慮した配色、段幅に合わせたサイズ、フォント埋め込み、よくあるレイアウト問題の直し方。

グループ化棒グラフ(集合縦棒グラフ)は、複数の手法を複数のデータセットや条件で比べるときの定番です。データセットごとに 1 グループ、手法ごとに 1 本の棒を並べます。ほとんどの論文の実験セクションに登場しますが、細かいミスが起きやすい図でもあります。ラベルが重なる、エラーバーが数値を隠す、凡例が棒を覆う、PDF が学会のフォントチェックに通らない、といった問題です。

この記事では、そのまま実行できる matplotlib スクリプトを示し、論文にとって重要な設定を説明し、よくある問題の直し方をまとめます。最後に、CSV と一文の説明から始めたい人向けの近道も紹介します。

グループ化棒グラフが向いている場面

次のような場合に向いています。

  • 少数の手法(通常 2〜5 個)を少数のカテゴリ(データセット、タスク、モデルサイズ)で比較する。
  • カテゴリが離散的である。横軸が学習ステップやノイズ強度のような連続量なら、折れ線グラフのほうが分かりやすくなります。
  • 読者が正確な数値よりもグループ内の相対的な差を重視する。正確な数値が最も重要なら表のほうが適しているかもしれません。あるいは下で示すように数値ラベルを付けます。

1 グループあたり 5 本、またはグループ数が 6 を超えるようなら、図を分ける、横向きにする、表にする、といった選択肢を検討してください。

ステップ 1:データをロング形式にする

1 回の測定を 1 行にします。この「ロング形式」は実験ログから書き出しやすく、変形も簡単です。

results.csv
method,dataset,accuracy,std
Baseline,CIFAR-10,91.2,0.3
Ours,CIFAR-10,94.7,0.2
Ours+Aug,CIFAR-10,95.3,0.2
Baseline,CIFAR-100,68.4,0.5
Ours,CIFAR-100,74.9,0.4
Ours+Aug,CIFAR-100,76.8,0.3
Baseline,Tiny-ImageNet,55.1,0.6
Ours,Tiny-ImageNet,61.8,0.5
Ours+Aug,Tiny-ImageNet,63.5,0.4

上の数値はこのチュートリアル用のサンプルデータで、実際のベンチマーク結果ではありません。

ステップ 2:matplotlib の完全なスクリプト

matplotlib 3.11 と pandas で動作を確認しています。LaTeX 用のベクター PDF と 300 DPI の PNG を両方出力します。

grouped_bar.py
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.read_csv("results.csv")
datasets = ["CIFAR-10", "CIFAR-100", "Tiny-ImageNet"]  # x-axis order
methods = ["Baseline", "Ours", "Ours+Aug"]              # bar order in each group

mean = df.pivot(index="dataset", columns="method", values="accuracy").loc[datasets, methods]
std = df.pivot(index="dataset", columns="method", values="std").loc[datasets, methods]

plt.rcParams.update({
    "font.family": "serif",
    "font.size": 9,
    "axes.spines.top": False,
    "axes.spines.right": False,
    "pdf.fonttype": 42,   # embed TrueType fonts (many venues require this)
    "ps.fonttype": 42,
})

colors = ["#0072B2", "#E69F00", "#009E73"]  # Okabe-Ito, colorblind-safe
hatches = ["", "//", "xx"]                  # still readable in grayscale

x = np.arange(len(datasets))
n = len(methods)
width = 0.8 / n

fig, ax = plt.subplots(figsize=(3.5, 2.6))  # single-column width in inches
for i, method in enumerate(methods):
    offset = (i - (n - 1) / 2) * width
    ax.bar(
        x + offset, mean[method], width,
        yerr=std[method], capsize=2, error_kw={"elinewidth": 0.8},
        label=method, color=colors[i], hatch=hatches[i],
        edgecolor="black", linewidth=0.5,
    )
    # Put value labels above the error bar, not on top of it.
    for xi, m, s in zip(x + offset, mean[method], std[method]):
        ax.text(xi, m + s + 1.5, f"{m:.1f}", ha="center", va="bottom", fontsize=5.5)

ax.set_xticks(x, ["CIFAR-10", "CIFAR-100", "Tiny-\nImageNet"])  # wrap long names
ax.set_ylabel("Top-1 accuracy (%)")
ax.set_ylim(0, 105)
ax.yaxis.grid(True, linestyle=":", linewidth=0.5)
ax.set_axisbelow(True)
ax.legend(loc="upper center", bbox_to_anchor=(0.5, -0.24), ncol=n, frameon=False)

fig.tight_layout()
fig.savefig("grouped_bar.pdf", bbox_inches="tight")            # vector, for LaTeX
fig.savefig("grouped_bar.png", dpi=300, bbox_inches="tight")   # raster, 300 DPI

300 DPI で出力した結果です。

スクリプトで作成したグループ化棒グラフ:3 つのデータセット、3 つの手法、エラーバー、数値ラベル、軸の下に凡例

各部分の役割

オフセットの式。 各手法の棒を (i - (n - 1) / 2) * width だけずらすことで、手法の数に関係なくグループが目盛りの中央に揃います。width = 0.8 / n なら 1 グループの棒が目盛り間隔の 80% を占め、グループ間に隙間が残ります。

順序の明示。 pivot(...).loc[datasets, methods] でグループと棒の順序を固定します。指定しないと pandas がアルファベット順に並べ、自分の手法が思わぬ位置に来がちです。

色とハッチ。 3 色は Okabe–Ito パレットから選んでおり、よくある色覚特性でも区別しやすい配色です。ハッチ(模様)により、白黒印刷でも棒を区別できます。

ピクセルではなくインチでサイズを決める。 figsize=(3.5, 2.6) は多くの 2 段組テンプレートの 1 段幅(約 3.3〜3.5 インチ)に相当します。最終サイズで作図すれば、matplotlib の 9 pt は PDF でも 9 pt になり、本文の文字サイズに近くなります。段抜きの図なら幅は約 7 インチです。

フォントの埋め込み。 pdf.fonttype: 42 により、matplotlib は Type 3 フォントではなく TrueType フォントを埋め込みます。多くの学会の投稿チェックは Type 3 フォントを警告するため、この設定で問題を避けられます。

ベクターを優先。 LaTeX では \includegraphics[width=\columnwidth]{grouped_bar.pdf} で PDF を読み込みます。300 DPI の PNG はスライドや Word、ラスター画像を求める論文誌向けに取っておきます。

よくある問題と直し方

同じスクリプトの、レイアウト修正前の最初のバージョンです。

最初の版:CIFAR-100 と Tiny-ImageNet のラベルが重なり、数値ラベルがエラーバーの上に乗っている

ここには、多くの人がつまずく 3 つの問題が見えます。

  1. 横軸ラベルの重なり。 1 段幅では長いカテゴリ名がぶつかります。\n で改行する、略称にしてキャプションで説明する、ax.set_xticks(x, labels, rotation=20, ha="right") で回転させる、のいずれかで対処します。
  2. 数値ラベルがエラーバーを隠す。 ax.bar_label は棒の上端に文字を置きますが、そこはちょうどエラーバーの始まる位置です。最終版のように mean + std に少し余白を足した位置に置くか、数値ラベルをやめて表で示します。
  3. 数値が詰まりすぎる。 隣のラベルとくっつく場合は、文字を小さくする、小数点以下 1 桁にする、各グループの最良値だけに付ける、といった方法があります。

ほかにも確認したい点です。

  • 凡例が棒を覆う。 上の例のように bbox_to_anchor で軸の下に移すか、loc="lower center", bbox_to_anchor=(0.5, 1.0) で図の上に置きます。
  • 縦軸が 0 から始まっていない。 棒の長さが値を表すので、軸を切ると差が誇張されます。差が小さくても重要なら、軸を切らずにドットプロットや表で示しましょう。
  • エラーバーの説明がない。 標準偏差、標準誤差、95% 信頼区間のどれか、そして何回の試行に基づくかをキャプションに書きます。
  • PDF の図がぼやける。 低解像度の PNG を拡大していることが多いです。ベクター PDF を使うか、最終的な印刷サイズで 300 DPI 以上の PNG を書き出します。

投稿前チェックリスト

  • グループと棒の順序が意図どおり(自分の手法がすぐ見つかる)。
  • 配色が色覚多様性に配慮しており、白黒でも区別できる。
  • 最終的な印刷幅で、図の文字サイズがキャプションと同程度。
  • 軸ラベルに単位があり、縦軸が 0 から始まっている。
  • キャプションにエラーバーの意味と試行回数が書いてある。
  • フォントが埋め込まれている(PDF に Type 3 フォントがない)。
  • 同じ手法は論文中のすべての図で同じ色を使っている。

seaborn を使う場合

データがすでにロング形式なら、seaborn で同じグループ化を 1 回の呼び出しで描けます。

import seaborn as sns

ax = sns.barplot(data=df, x="dataset", y="accuracy", hue="method",
                 palette=["#0072B2", "#E69F00", "#009E73"], errorbar=None)

測定ごとに 1 行で繰り返し試行がない場合は errorbar=None にします。CSV に試行ごとの行がある場合は、seaborn がエラーバーを計算できます(例:errorbar="sd")。サイズ、フォント、書き出しの設定は上のスクリプトのものを使うのがおすすめです。

近道:PaperBanana で CSV から図へ

描画コードを自分で書いてデバッグしたくない場合は、PaperBanana Paper Visualizer のデータプロットモードが使えます。

  1. CSV または JSON のデータを貼り付けます。
  2. 図を一文で説明します。例:「データセットごとの精度のグループ化棒グラフ。手法ごとに 1 本、棒の上に数値、凡例は横軸の下。」
  3. PaperBanana が matplotlib のコードを書き、隔離されたサンドボックスで実行して 300 DPI で描画し、クリティックが 1 回以上のラウンドで結果をレビューします。

画像はダウンロードでき、生成されたコードもコピーできます。そのため、ローカルで再実行してベクター PDF を書き出したり、自由に調整したりできます。以下は、この記事と同じデータから実際に生成した結果です。

PaperBanana のデータプロットモードが同じ CSV から生成したグループ化棒グラフ

データプロットモードは画像モデルを使わないため、図の数値はデータそのものです。料金はクリティックの 1 ラウンドあたり 10 クレジットで、使わなかったラウンド分は自動で返金されます。詳しくは料金ページをご覧ください。

よくある質問

グループ化棒グラフと表、どちらを使うべき? 「提案手法がすべてのデータセットで勝っている」「難しいデータセットほど差が広がる」のようなパターンを伝えたいときは図、読者が正確な数値を必要とするときは表です。本文に図、付録に完全な表を載せる論文も多くあります。

1 グループに何本までなら読める? 1 段幅では 1 グループ 5 本を超えると読みにくくなります。図を 2 枚に分けるか、重要度の低いベースラインを付録に回しましょう。

標準偏差と標準誤差、どちらを使う? どちらでも構いませんが、どちらを使ったかを明記してください。標準偏差は試行間のばらつき、標準誤差や信頼区間は平均の推定精度を表します。試行回数は必ず記載します。

棒を横向きにできる? できます。ax.bar を ax.barh に置き換え、x 軸と y 軸の役割を入れ替えて ax.set_yticks を使います。カテゴリ名が長い場合は横向きが読みやすくなります。

論文の図全般については、研究論文のための出版品質の図の作り方と、TikZ・matplotlib・AI ツールの比較も参考にしてください。

すべての記事

著者

avatar for PaperBanana Team
PaperBanana Team

カテゴリー

  • 研究
グループ化棒グラフが向いている場面ステップ 1:データをロング形式にするステップ 2:matplotlib の完全なスクリプト各部分の役割よくある問題と直し方投稿前チェックリストseaborn を使う場合近道:PaperBanana で CSV から図へよくある質問

その他の記事

科研論文のイラスト作成にAIを活用|博士研究者が教える実践テクニック
研究

科研論文のイラスト作成にAIを活用|博士研究者が教える実践テクニック

材料科学の博士研究者が、科研論文のイラスト・図表作成にAIツールを活用する実践テクニックを共有。ツール選定、プロンプト設計の公式、実際の活用事例まで詳しく解説します。

avatar for PaperBanana Team
PaperBanana Team
2026/02/24
TikZ vs matplotlib vs AI:2026年版 学術論文の図表作成に最適なツール
研究

TikZ vs matplotlib vs AI:2026年版 学術論文の図表作成に最適なツール

研究論文の図表作成ツールを徹底比較。TikZ、matplotlib、draw.io、Figma、BioRender、PaperBananaなどのAIジェネレーターを、学習コスト、出力品質、ワークフローの効率性の観点から正直に評価します。

avatar for PaperBanana Team
PaperBanana Team
2026/03/10
PaperBananaがAIで学術イラスト制作を革新する方法
研究

PaperBananaがAIで学術イラスト制作を革新する方法

PaperBananaの5エージェントフレームワークの技術詳解。研究者の科学イラスト制作を変革するAIシステムの仕組みを、方法論図解の生成、統計プロットの作成、スケッチの洗練まで解説します。

avatar for PaperBanana Team
PaperBanana Team
2025/02/05

最新情報を受け取る

PaperBananaコミュニティに参加

新機能、研究のヒント、早期アクセスの機会についての通知を受け取れます

LogoPaperBanana

研究者のためのAI学術イラスト生成ツール

GitHubGitHubEmail
プロダクト
  • 機能
  • 料金
  • FAQ
リソース
  • ブログ
企業情報
  • 概要
  • お問い合わせ
  • ウェイトリスト
法的情報
  • 返金ポリシー
  • Cookieポリシー
  • プライバシーポリシー
  • 利用規約
© 2026 PaperBanana All Rights Reserved.お問い合わせ: support@paperbanana.online搭載モデル: Nano Banana 2.1 / GPT Image 2.6 + Gemini 3.8 Flash