Matplotlib(マットプロットリブ)は、Pythonで折れ線グラフ・散布図・棒グラフ・ヒストグラム・3Dプロットなどを描くためのライブラリです。PNGやPDFで保存できる静的な図が得意で、SeabornやpandasのグラフもMatplotlibの上で動いています。2026年9月時点の最新版は3.11.2(2026年9月11日公開)で、動かすにはPython 3.11以上が必要です。この記事では、インストールから2つの書き方、主要グラフ、日本語の文字化け対策、図が表示されないときの対処までを、3.11.2で実行して確かめたコードで説明します。
まとめ:Matplotlibの要点と3.11で変わったこと
- Matplotlibは静的なグラフ(論文・資料・レポート用の画像)を細かく作り込むためのライブラリ。Web上で拡大・ホバーさせたいならPlotlyなど別のライブラリが向いている。
- インストールは
pip install matplotlib。最新版3.11.2の要件はPython 3.11以上で、Python 3.10の環境ではエラーにならず3.10.9が入る。 - 書き方は
plt.plot()で済ませるpyplot方式と、fig, ax = plt.subplots()で図と軸を明示するAxes方式の2通り。複数のグラフを並べるならAxes方式を選ぶ。 - 既定フォント(DejaVu Sans)には日本語の字形がないため、そのままでは文字化けする。定番だった japanize-matplotlib は、setuptoolsが入っていないPython 3.12以降の環境では import に失敗するので、OSの日本語フォントを
rcParams['font.family']に指定するか matplotlib-fontja を使う。 - 3.11では棒を系列ごとに並べる
grouped_bar()、円グラフのラベル付けpie_label()、figsizeのcm・px指定が加わった。3.10以前ではこれらのコードはエラーになる。
Matplotlibとは:読み方・成り立ち・向いている用途
読み方は「マットプロットリブ」です。もともとはMATLABのグラフ描画コマンドをPythonで再現する目的で作られ、その名残で plt.plot() のようなMATLABに似た関数群(pyplot)が今も残っています。
Matplotlibの開発経緯と保守体制
作者はJohn D. Hunter氏(1968〜2012年)です。公式ドキュメントに残る本人の文章によると、脳波(EEG)データの解析アプリをMATLABで作っていたものの言語としての限界を感じてPythonへ移り、条件に合う2D描画パッケージが無かったためMATLABの描画機能を手本に自作しました。開発を始めたのは2003年ごろです。Hunter氏が2012年に亡くなった後はMatplotlib開発チームによる開発が続き、現在はNumFOCUSの支援を受けています。ライセンスはPSFライセンスをもとにしたMatplotlibライセンスで、商用のプログラムや資料に組み込んで使えます。
Matplotlibが向く静的な図と不向きな用途
向いているのは、論文・社内資料・レポートに貼る静的な図です。線の太さ、目盛り、余白、フォントまで1点ずつ指定でき、PNG・PDF・SVGで出力できます。NumPyの配列やPandasのDataFrameをそのまま渡せるので、分析の途中経過を確認する用途にも使えます。
逆に、ブラウザ上でマウスを当てて値を読ませるグラフや、数万点をリアルタイムに更新する画面には向きません。前者はPlotlyやBokeh、後者はPyQtGraphのほうが少ないコードで済みます(使い分けは後半の表にまとめています)。
最新バージョン3.11.2と動作要件
PyPIの公開情報では、3.11系の最初の版3.11.0が2026年6月12日、最新の3.11.2が2026年9月11日に公開されています。3.11系の requires-python は >=3.11 です。
| 版 | 公開日(PyPI) | 必要なPython |
|---|---|---|
| 3.11.2 | 2026-09-11 | 3.11以上 |
| 3.11.1 | 2026-07-18 | 3.11以上 |
| 3.11.0 | 2026-06-12 | 3.11以上 |
| 3.10.9 | 2026-04-24 | 3.10以上 |
注意したいのは、Python 3.10の環境で pip install matplotlib を実行してもエラーにならない点です。pipは要件を満たす最新版を探すため、3.10の仮想環境では3.10.9が黙って入りました(2026年9月26日に実行して確認)。3.11の新機能を使ったコードが手元だけ動かないときは、まずバージョンを確かめてください。
python -c "import matplotlib; print(matplotlib.__version__)"
3.11.0で加わった主な機能
- グラフ:系列を横並びにする
grouped_bar()、円グラフのラベル付けpie_label()(使い方は後述)。 - 図のサイズ:
figsizeを"in"・"cm"・"px"の単位付きで指定できる。 - フォント:
.ttcファイルに含まれる全サブフォントを読み込む。 - フォントに無い文字は、空の四角ではなくUnicodeのLast Resortフォントで「どの文字種が欠けているか」を示す字形になった。
一覧は公式のWhat’s new in Matplotlib 3.11.0で確認できます。文字描画が作り直されたため、3.10以前とは文字のピクセル値が一致しません。画像比較のテストがあるなら、期待画像の更新か許容誤差の引き上げが必要です。
インストールと動作確認の手順
pipによる仮想環境へのインストール
プロジェクトごとに仮想環境を作ってから入れるのが基本です。WindowsとmacOS・Linuxでは有効化のコマンドが異なります。
python -m venv .venv
.\.venv\Scripts\Activate.ps1 # Windows PowerShell用
.venv\Scripts\activate.bat # Windows コマンドプロンプト用(この行だけ実行)
source .venv/bin/activate # macOS・Linux
pip install matplotlib
NumPyなど依存ライブラリも同時に入ります。3.11.2を入れた環境ではNumPy 2.5.3が一緒に入りました。
uv・condaによるインストール
uvを使っている場合は uv add matplotlib(プロジェクト管理時)か uv pip install matplotlib で入ります。Anacondaを使っている場合は最初から入っていることが多く、追加するなら conda install matplotlib です。pipとcondaを同じ環境で混ぜると依存関係が壊れやすいので、どちらかに寄せてください(詳しくはpipとcondaの違いと使い分けで整理しています)。
importエラーの原因とPython環境の確認
ModuleNotFoundError: No module named 'matplotlib' は、実行中のPythonからMatplotlibを見つけられないことを示します。よくある原因の一つがインストール先と実行環境の不一致で、VS CodeやJupyterで選択中のインタープリターが仮想環境を指していないときに起きます。次のように、実行するPython自身にpipを呼ばせると取り違えを防げます。
python -m pip install matplotlib
python -c "import sys; print(sys.executable)" # 実行中のPythonの場所を確認
最初のグラフ:pyplot方式とAxes方式
「import matplotlib.pyplot as plt」の plt は、描画モジュール matplotlib.pyplot に付ける慣例の別名です。この plt を使った書き方には、公式ドキュメントでいう暗黙的(implicit)な書き方と明示的(explicit)な書き方の2通りがあります。
pyplot方式:plt.plot()による描画
「今操作している図」をpyplotが裏で覚えていて、plt. で始まる関数がその図に描き込みます。1枚だけ手早く確認するときに向いています。
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.xlabel('x')
plt.ylabel('y')
plt.title('first plot')
plt.show()
Axes方式:fig・axを明示した描画
plt.subplots() で図(Figure)と描画領域(Axes)を受け取り、ax. のメソッドで描きます。軸ラベルは plt.xlabel() ではなく ax.set_xlabel() になる点が違います。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [1, 4, 9, 16])
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('first plot')
plt.show()
どちらを選ぶかは、グラフが1枚で終わるかで決めてください。2枚以上を並べる、関数の中でグラフを作って呼び出し元に返す、といったコードをpyplot方式で書くと、どの図に描いているかが追えなくなります。公式のQuick start guideも、複雑な図や関数・スクリプトとして再利用するコードではAxes方式を勧めています。この記事の以降のコードもAxes方式で書いています。
主なグラフの描き方と3Dプロット
以下のコードは import matplotlib.pyplot as plt と fig, ax = plt.subplots() を例ごとに実行した前提です(3Dのみ別に書いています)。同じ ax に続けて描くとグラフが重なります。通常のPythonスクリプトでは、末尾に plt.show() を加えると表示されます。
折れ線グラフ:ax.plot()
時系列や連続的な変化を表すときに使います。系列ごとに label を付けて ax.legend() を呼ぶと凡例が出ます。線の色は color、線種は linestyle('-' 実線、'--' 破線)、点の印は marker で指定します。
x = [1, 2, 3, 4, 5]
ax.plot(x, [2, 3, 5, 7, 11], label='series 1', color='blue')
ax.plot(x, [1, 4, 6, 8, 10], label='series 2', color='red', linestyle='--')
ax.legend()

散布図:ax.scatter()
2つの変数の関係を見るときに使います。点の大きさを s、色を c、透明度を alpha で変えられるので、3つ目の変数を点の大きさで表すこともできます。
ax.scatter([1, 2, 3, 4, 5], [2, 3, 5, 7, 11],
s=[20, 50, 80, 200, 500], c='green', alpha=0.5)

棒グラフ:ax.bar()と3.11のgrouped_bar()
カテゴリごとの量を比べるときに使います。横棒は ax.barh() です。
ax.bar(['A', 'B', 'C'], [10, 25, 15])

年度別のように系列が複数ある場合、3.10までは棒の位置を自分でずらして計算していました。3.11からは grouped_bar() に辞書を渡すだけで並びます。ただし、公式リファレンスでは暫定APIとされているため、更新時には仕様変更を確認してください。3.10.9で同じコードを実行すると AttributeError: 'Axes' object has no attribute 'grouped_bar' で止まります。
ax.grouped_bar({'2025': [10, 25, 15], '2026': [12, 30, 11]},
tick_labels=['A', 'B', 'C'])
ax.legend()
ヒストグラム:ax.hist()
値がどの範囲に集中しているか(分布)を見るときに使います。bins で階級の数を決めます。
data = [1, 2, 2, 3, 3, 3, 4, 4, 5]
ax.hist(data, bins=5)

円グラフ:ax.pie()
全体に占める割合を示すときに使います。autopct で割合を表示します。3.11からは、描いた後で ax.pie_label(pie, '{frac:.1%}', distance=0.6) のように str.format 形式でラベルを重ねることもできます。
ax.pie([40, 30, 30], labels=['A', 'B', 'C'], autopct='%1.1f%%')

3Dプロット:projection=’3d’による散布図と曲面
3Dは projection='3d' を指定した軸で描きます。x・yの各方向に端点を含む12個の等間隔な座標を用意すると、12×12=144点の格子になります。np.meshgrid() で作った2次元配列は、散布図なら ravel() で1次元に直して渡し、曲面ならそのまま plot_surface() に渡します。
import numpy as np
import matplotlib.pyplot as plt
u = np.linspace(-3, 3, 12)
X, Y = np.meshgrid(u, u) # 12×12=144点の格子
Z = np.sin(X) * np.cos(Y)
fig = plt.figure(figsize=(10, 4))
ax1 = fig.add_subplot(1, 2, 1, projection='3d')
ax1.scatter(X.ravel(), Y.ravel(), Z.ravel(), c=Z.ravel(), cmap='viridis')
ax2 = fig.add_subplot(1, 2, 2, projection='3d')
ax2.plot_surface(X, Y, Z, cmap='viridis')
plt.show()
対話表示の画面では、マウスのドラッグで視点を回せます。保存する画像の向きを固定したいときは ax1.view_init(elev=30, azim=45) で仰角と方位角を指定します。
日本語が文字化けするときの対策
Matplotlibの既定フォントはDejaVu Sansで、日本語の字形を持っていません。そのままタイトルに日本語を入れると、3.11.2では UserWarning: Glyph 26085 (\N{CJK UNIFIED IDEOGRAPH-65E5}) missing from font(s) DejaVu Sans. のような警告が文字ごとに出て、グラフ上の文字は代替の字形になります。
OSの日本語フォントの確認と指定
rcParams['font.family'] にフォント名をリストで渡すと、3.6以降は文字ごとに、その字形を持つリスト先頭側のフォントで描かれます。英数字は欧文フォント、日本語は日本語フォントという組み合わせもできます。ただし、存在しないフォント名を並べると findfont: Font family 'Meiryo' not found. というログが描画のたびに大量に出ます(macOSでWindows用のフォント名を並べて確認)。そこで、手元にあるフォントだけを残してから設定します。候補の日本語フォントが一つもない場合、このコードだけでは日本語化できないため、日本語フォントをインストールするか、次節のmatplotlib-fontjaを使ってください。
import matplotlib.pyplot as plt
from matplotlib import font_manager
candidates = ['Meiryo', 'Yu Gothic', 'Hiragino Sans', 'Noto Sans CJK JP', 'IPAexGothic']
available = set(font_manager.get_font_names())
plt.rcParams['font.family'] = [f for f in candidates if f in available] + ['sans-serif']
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [1, 4, 9])
ax.set_title('日本語のタイトル')
ax.set_xlabel('横軸')
plt.show()
macOSで実行すると ['Hiragino Sans', 'sans-serif'] が設定され、警告は出ませんでした。Windowsなら Meiryo か Yu Gothic、LinuxならNoto Sans CJK JPなどが候補になります。どの名前で登録されているかは font_manager.get_font_names() の結果で確かめてください。
3.11では .ttc ファイルのサブフォントがすべて登録されるようになりました。検証用Macでは、font_manager.get_font_names() で取得したフォント名が3.10.9の460件から3.11.2の825件に増えました(件数はインストール済みフォントやキャッシュの状態に依存します)。この環境では、「Hiragino Kaku Gothic ProN」などは3.11.2でしか見つかりません。ファイルパスを fname= で直接指定しなくても、名前で選べる日本語フォントが増えています。
japanize-matplotlibのdistutils依存とPython 3.12以降の代替策
以前は import japanize_matplotlib の1行で日本語化する方法が定番でした。しかし最終版1.1.3の公開は2020年10月で、内部で distutils を使っています。distutils はPython 3.12で標準ライブラリから削除されたため、Python 3.12以降でsetuptoolsなどによるdistutilsの補完がない環境では ModuleNotFoundError: No module named 'distutils' で import に失敗します。Python 3.12からは python -m venv で作った仮想環境にsetuptoolsが入らなくなったため、新しく作った環境ほどこの状態に当たります。setuptoolsを追加すれば import は通りました(3.11.2で確認)が、2020年から更新の止まったパッケージに頼り続けることになります。
1行で済ませたい場合の代替が matplotlib-fontja です。japanize-matplotlibをフォークしてPython 3.12以降でも動くよう直したもので、IPAexゴシック(ipaexg.ttf)を同梱しています。matplotlibの後に import するとフォントが切り替わり、3.11.2で試すと font.family が ['IPAexGothic'] になりました。
pip install matplotlib-fontja
import matplotlib.pyplot as plt
import matplotlib_fontja # 読み込むだけでIPAexGothicに切り替わる
社内で配布するスクリプトなら、依存を増やさない前節のOSフォント指定のほうが保守しやすいです。Colabや使い捨てのNotebookなら matplotlib-fontja で十分です。
見た目の調整と画像の保存
複数グラフの配置:subplotsとlayout
plt.subplots(行数, 列数) で複数のAxesをまとめて作れます。layout='constrained' を付けると、タイトルや軸ラベルが隣のグラフと重ならないよう余白を自動で調整します。3.11からは figsize にcm単位も渡せます。
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6, 'cm'), layout='constrained')
ax1.plot([1, 2, 3], [2, 4, 3])
ax1.grid(True)
ax2.bar(['A', 'B'], [3, 5])
3.10.9で figsize=(16, 6, 'cm') を渡すと TypeError で止まります。3.10以前も対象にするなら、インチに換算して figsize=(16 / 2.54, 6 / 2.54) と書きます。
見た目の一括設定:スタイルとrcParams
plt.style.use('ggplot') のようにスタイル名を指定すると、背景色・グリッド・配色をまとめて切り替えられます。使えるスタイル名は plt.style.available で一覧できます。フォントサイズなど個別の既定値は plt.rcParams['font.size'] = 12 のように変えます。
画像の保存:savefigのdpiとbbox_inches
保存は fig.savefig() です。既定の図のサイズは6.4×4.8インチ、解像度は figure.dpi の100なので、何も指定しないと640×480ピクセルのPNGになります。資料に貼るなら dpi=300 を指定します。bbox_inches='tight' を付けると、はみ出したラベルを含めて余白を詰めて保存します。
fig.savefig('graph.png', dpi=300, bbox_inches='tight')
fig.savefig('graph.pdf') # 拡張子で形式が決まる
上の16×6cmの図を dpi=300 と bbox_inches='tight' で保存すると、1924×743ピクセルになりました。pyplot方式で plt.show() の後に plt.savefig() を書くと、ウィンドウを閉じた時点で図が破棄されて白紙が保存されます。保存は show() より前に書きます。

plt.show()でグラフが表示されないときの確認点
エラーは出ないのに図のウィンドウが開かない場合は、まずバックエンドを確認します。Aggなどの非対話型バックエンドでは、図をウィンドウに表示できません。Aggのまま plt.show() を呼ぶと UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown が出ます。SSH接続先のサーバーやDockerコンテナなど、画面の無い環境で起きやすい状態です。
import matplotlib
print(matplotlib.get_backend()) # Agg なら画面には出ない
- 画面の無い環境では、表示をあきらめて
fig.savefig()で画像に書き出す。 - 環境変数
MPLBACKEND=Aggや、コード中のmatplotlib.use('Agg')が残っていないか確認する。 - Jupyter NotebookやJupyterLabでは、セル内で作った図がセルの実行後に自動で表示されるため、
plt.show()が無くても表示される。
Seaborn・Plotly・Bokeh・PyQtGraphとの使い分け
Pythonの可視化ライブラリは、出力が静的な画像かブラウザ上で動くものかで選び分けます。
| ライブラリ | 出力 | 向いている用途 |
|---|---|---|
| Matplotlib | 静的画像(PNG・PDF・SVG) | 論文・資料の図、細部の作り込み |
| Seaborn | 静的画像(内部はMatplotlib) | 統計グラフを少ないコードで |
| Plotly | ブラウザで動くHTML | 拡大・ホバーできるグラフ |
| Bokeh | ブラウザで動くHTML | Webアプリへの埋め込み |
| PyQtGraph | デスクトップ画面 | センサー値などのリアルタイム描画 |
Seabornは内部でMatplotlibを呼んでいるので、Seabornで描いた図の軸やフォントはMatplotlibの ax や rcParams で調整します。ただし、Seabornの set_theme() はフォント設定を上書きすることがあるため、日本語フォントはテーマ設定後に指定してください。操作できるグラフが必要ならPlotlyやBokeh、数万点を毎秒更新するような画面ならPyQtGraphを選んでください。
よくある質問
Matplotlibの読み方は?
「マットプロットリブ」と読みます。MATLABのグラフ描画をPythonで再現する目的で作られたライブラリです。
Matplotlibの最新バージョンはいくつですか?
2026年9月26日時点ではPyPIで公開されている3.11.2(2026年9月11日公開)が最新です。Python 3.11以上が必要です。Python 3.10では3.10.9が候補になりますが、Python 3.9以前には3.10.9をインストールできません。
Matplotlibをインストールできないのはなぜですか?
まずPythonのバージョンを確認してください。最新版3.11.2はPython 3.11以上が必要で、3.10では3.10.9が入ります。インストールは成功したのに import で ModuleNotFoundError になる場合は、インストール先のPythonと実行しているPythonが異なる可能性があります。python -m pip install matplotlib のように、実行するPython経由でpipを呼ぶと揃います。
MatplotlibとSeabornはどちらを使うべきですか?
統計グラフを手早く整った見た目で出したいならSeaborn、軸・目盛り・余白まで細かく決めたいならMatplotlibです。SeabornはMatplotlibの上で動くため、Seabornで描いてMatplotlibで仕上げる併用もできます。
グラフの日本語が□になるのを直すには?
既定フォントに日本語が無いことが原因です。rcParams['font.family'] にHiragino Sans・Meiryo・Noto Sans CJK JPなどOSにある日本語フォントを指定するか、Python 3.12以降でも使える matplotlib-fontja を import します。