
論文用のグループ化棒グラフの作り方(matplotlib の完全なコード + CSV からの近道)
そのままコピーして使える、論文品質のグループ化棒グラフの matplotlib レシピ。ロング形式の CSV、エラーバー、色覚多様性に配慮した配色、段幅に合わせたサイズ、フォント埋め込み、よくあるレイアウト問題の直し方。
グループ化棒グラフ(集合縦棒グラフ)は、複数の手法を複数のデータセットや条件で比べるときの定番です。データセットごとに 1 グループ、手法ごとに 1 本の棒を並べます。ほとんどの論文の実験セクションに登場しますが、細かいミスが起きやすい図でもあります。ラベルが重なる、エラーバーが数値を隠す、凡例が棒を覆う、PDF が学会のフォントチェックに通らない、といった問題です。
この記事では、そのまま実行できる matplotlib スクリプトを示し、論文にとって重要な設定を説明し、よくある問題の直し方をまとめます。最後に、CSV と一文の説明から始めたい人向けの近道も紹介します。
グループ化棒グラフが向いている場面
次のような場合に向いています。
- 少数の手法(通常 2〜5 個)を少数のカテゴリ(データセット、タスク、モデルサイズ)で比較する。
- カテゴリが離散的である。横軸が学習ステップやノイズ強度のような連続量なら、折れ線グラフのほうが分かりやすくなります。
- 読者が正確な数値よりもグループ内の相対的な差を重視する。正確な数値が最も重要なら表のほうが適しているかもしれません。あるいは下で示すように数値ラベルを付けます。
1 グループあたり 5 本、またはグループ数が 6 を超えるようなら、図を分ける、横向きにする、表にする、といった選択肢を検討してください。
ステップ 1:データをロング形式にする
1 回の測定を 1 行にします。この「ロング形式」は実験ログから書き出しやすく、変形も簡単です。
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 を両方出力します。
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 DPI300 DPI で出力した結果です。

各部分の役割
オフセットの式。 各手法の棒を (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、ラスター画像を求める論文誌向けに取っておきます。
よくある問題と直し方
同じスクリプトの、レイアウト修正前の最初のバージョンです。

ここには、多くの人がつまずく 3 つの問題が見えます。
- 横軸ラベルの重なり。 1 段幅では長いカテゴリ名がぶつかります。
\nで改行する、略称にしてキャプションで説明する、ax.set_xticks(x, labels, rotation=20, ha="right")で回転させる、のいずれかで対処します。 - 数値ラベルがエラーバーを隠す。
ax.bar_labelは棒の上端に文字を置きますが、そこはちょうどエラーバーの始まる位置です。最終版のようにmean + stdに少し余白を足した位置に置くか、数値ラベルをやめて表で示します。 - 数値が詰まりすぎる。 隣のラベルとくっつく場合は、文字を小さくする、小数点以下 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 のデータプロットモードが使えます。
- CSV または JSON のデータを貼り付けます。
- 図を一文で説明します。例:「データセットごとの精度のグループ化棒グラフ。手法ごとに 1 本、棒の上に数値、凡例は横軸の下。」
- PaperBanana が matplotlib のコードを書き、隔離されたサンドボックスで実行して 300 DPI で描画し、クリティックが 1 回以上のラウンドで結果をレビューします。
画像はダウンロードでき、生成されたコードもコピーできます。そのため、ローカルで再実行してベクター PDF を書き出したり、自由に調整したりできます。以下は、この記事と同じデータから実際に生成した結果です。

データプロットモードは画像モデルを使わないため、図の数値はデータそのものです。料金はクリティックの 1 ラウンドあたり 10 クレジットで、使わなかったラウンド分は自動で返金されます。詳しくは料金ページをご覧ください。
よくある質問
グループ化棒グラフと表、どちらを使うべき? 「提案手法がすべてのデータセットで勝っている」「難しいデータセットほど差が広がる」のようなパターンを伝えたいときは図、読者が正確な数値を必要とするときは表です。本文に図、付録に完全な表を載せる論文も多くあります。
1 グループに何本までなら読める? 1 段幅では 1 グループ 5 本を超えると読みにくくなります。図を 2 枚に分けるか、重要度の低いベースラインを付録に回しましょう。
標準偏差と標準誤差、どちらを使う? どちらでも構いませんが、どちらを使ったかを明記してください。標準偏差は試行間のばらつき、標準誤差や信頼区間は平均の推定精度を表します。試行回数は必ず記載します。
棒を横向きにできる?
できます。ax.bar を ax.barh に置き換え、x 軸と y 軸の役割を入れ替えて ax.set_yticks を使います。カテゴリ名が長い場合は横向きが読みやすくなります。
論文の図全般については、研究論文のための出版品質の図の作り方と、TikZ・matplotlib・AI ツールの比較も参考にしてください。
その他の記事

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


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


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

最新情報を受け取る
PaperBananaコミュニティに参加
新機能、研究のヒント、早期アクセスの機会についての通知を受け取れます