本記事は、Pythonの可視化ライブラリMatplotlibの最初の一歩として、Figure(図全体)とAxes(グラフ領域)の関係をやさしく解説します。Google Colabで起こりがちな日本語の文字化け対策も、最短手順で紹介します。
この記事でできること
- FigureとAxesの役割・関係がわかる
- 最小コードで折れ線グラフを描ける
- Google Colabで日本語フォントを正しく表示できる
- レイアウト(余白・サイズ)を基本だけ押さえる
1. Figure と Axes の基本
Matplotlib は「器」(Figure)と「中身」(Axes)を分けて考えると理解しやすいです。
Figure:画像全体を表す大きな「キャンバス」のようなものです。グラフのサイズ、解像度、複数の Axes を配置する場合の全体レイアウトなどを管理します。
Axes:Figure の中の「グラフ領域」そのものです。実際にデータ(線、点、棒グラフなど)を描画し、さらに軸、目盛り、ラベル、凡例、タイトルなどのグラフの構成要素を管理します。ほとんどすべての描画操作は Axes オブジェクトに対して行います。
<figureとaxesの概念図>

典型的な作り方は fig, ax = plt.subplots()
です。このコードは、 Figure と、その Figure の中に配置された1つの Axes を同時に作成してくれます。グラフを描く際は、ax.plot()
や ax.scatter()
といった Axes オブジェクトのメソッドを呼び出します。
このコードを実行すると、以下のグラフが表示されます。
import matplotlib.pyplot as plt
import pandas as pd
# データをDataFrameで作成
data = {'X': [1, 2, 3, 4], 'Y': [1, 4, 2, 5]}
df = pd.DataFrame(data)
# Figure(全体)と Axes(グラフ領域)を1つずつ作成
fig, ax = plt.subplots()
ax.plot(df['X'], df['Y']) # データを描画
ax.set_title("graph") # タイトル
ax.set_xlabel("X")
ax.set_ylabel("Y")
plt.show() # 画面に表示
2. 最小コード:まずは 1 枚描いてみる
最小限のコードで1枚のグラフを描く基本的な流れは次のとおりです。
1. import matplotlib.pyplot as plt
で Matplotlib の機能をインポートします。通常、plt
という短縮名で使われます。
2. fig, ax = plt.subplots()
で、グラフを描くための Figure(器)と Axes(グラフ領域)を作成します。
3. ax.plot(x, y)
のように、Axes オブジェクトのメソッドを使って、実際にデータ(この場合は折れ線グラフ)を描画します。
4. ax.set_title(...)
、ax.set_xlabel(...)
、ax.set_ylabel(...)
などを使って、タイトルや軸のラベルを設定し、グラフに意味を持たせます。
5. 必要に応じて、plt.tight_layout()
や fig.autofmt_xdate()
などでレイアウトを調整します。
6. plt.show()
を呼び出すことで、作成したグラフを画面に表示します。 Jupyter Notebook や Colab のような環境では省略されることもありますが、スクリプトとして実行する場合は最後にこれを呼び出さないとグラフが表示されないことがあります。
以下のコードで生成されたグラフは、ax.plot([0, 1, 2], [0, 1, 0], marker="o")
でデータ点がプロットされ、ax.set_title("最小ステップ")
、ax.set_xlabel("Index")
、ax.set_ylabel("Value")
でそれぞれタイトルと軸ラベルが設定されています。plt.tight_layout()
で要素が重ならないように自動調整されています。
import matplotlib.pyplot as plt # Matplotlib の機能をインポート
import pandas as pd # pandasをインポート
# データをDataFrameで作成
data = {'X': [0, 1, 2], 'Y': [0, 1, 0]}
df = pd.DataFrame(data)
fig, ax = plt.subplots(figsize=(5, 3.2)) # 図サイズ(インチ)
ax.plot(df['X'], df['Y'], marker="o") # markerは"o"
ax.set_title("タイトル") # 日本語だと文字化けする場合があります
ax.set_xlabel("Index")
ax.set_ylabel("Value")
plt.tight_layout() # 余白を自動調整
plt.show()
> markerの種類は多数存在しています。
▶️ markerの公式ドキュメントも参考にしてください:
Matplotlib.markers Documentation
3. Colab で日本語フォントを表示する
Colab は既定フォントに日本語が含まれず、文字化けしやすいですが、以下の 2 行の設定で解決します。
以下のコードを実行し、japanize-matplotlib
をインポートすることで、グラフのタイトルや軸ラベルに日本語が正しく表示されるようになります。生成されたグラフの「日本語タイトルOK」、「横軸ラベル」、「縦軸ラベル」が正しく表示されていることを確認してください。
# 1) Google Colab の機能を使って日本語フォントをインストール
!pip install japanize-matplotlib > /dev/null
# 2) Matplotlibにフォントを認識させる
import matplotlib
import matplotlib.pyplot as plt
import japanize_matplotlib # これをインポートするだけで日本語フォントが使えるようになります
import pandas as pd # pandasをインポート
# 動作確認
# データをDataFrameで作成
data = {'X': [0, 1, 2], 'Y': [0, 1, 4]}
df = pd.DataFrame(data)
fig, ax = plt.subplots()
ax.plot(df['X'], df['Y'])
ax.set_title("日本語タイトル")
ax.set_xlabel("横軸ラベル")
ax.set_ylabel("縦軸ラベル")
plt.show()
4. レイアウトの基本:サイズ・余白・保存
グラフを見やすく、目的に合った形式で出力するために、サイズ、余白、そして保存方法を調整することが重要です。
4.1 図サイズ(インチ)と解像度(dpi)
グラフの物理的な大きさや鮮明さを制御するには、Figure を作成する際に figsize
と dpi
引数を使用します。
figsize=(width, height)
: 図全体のサイズを「インチ」単位で指定します。例えば、figsize=(6, 4)
は横 6 インチ、縦 4 インチの図を作成します。このサイズは、表示時や保存時のピクセル数に影響します。dpi
: Dots Per Inch(1インチあたりのドット数)の略で、解像度を指定します。dpi
の値が大きいほど、同じfigsize
でもピクセル数が多くなり、より精細な画像が得られます。例えば、figsize=(6, 4)
かつdpi=100
なら 600×400 ピクセル、dpi=150
なら 900×600 ピクセルの画像になります。表示環境によってデフォルトのdpi
は異なりますが、保存時には明示的に指定することが多いです。
以下のコードでは、plt.subplots(figsize=(6, 4), dpi=120)
で図のサイズが横 6 インチ、縦 4 インチ、解像度が 120dpi に設定されています。これにより、表示される図の大きさと精細さが調整されます。
import matplotlib.pyplot as plt
import pandas as pd # pandasをインポート
# データをDataFrameで作成
data = {'X': [1, 2, 3], 'Y': [3, 2, 1]}
df = pd.DataFrame(data)
fig, ax = plt.subplots(figsize=(6, 4), dpi=120) # 横6inch × 縦4inch, 120dpi
ax.plot(df['X'], df['Y'])
ax.set_title("サイズとdpiの指定")
plt.show()
4.2 余白調整:tight_layout と constrained_layout
グラフのタイトル、軸ラベル、凡例などがグラフ領域や他の要素と重なって見づらくなるのを防ぐために、余白を調整する機能があります。
plt.tight_layout()
: サブプロット間のパディング(間隔)や、図の端と要素(タイトル、ラベルなど)の間の余白を自動的に調整し、要素の重なりを防ぎます。比較的シンプルで手軽な方法です。constrained_layout=True
:plt.subplots()
の引数として指定します。tight_layout
よりも新しく、より洗練されたレイアウト調整機能です。タイトルやラベル、凡例といった装飾要素に必要なスペースを考慮して、より賢く全体のレイアウトを調整します。複数のサブプロットや複雑な要素がある場合におすすめです。
どちらもグラフが見切れたり要素が重なったりするのを防ぐために有効ですが、constrained_layout=True
がより多くのケースで適切に機能しやすく、新しいコードではこちらが推奨される傾向にあります。
以下のコードでは、plt.subplots(constrained_layout=True)
を使用することで、タイトルが他の要素と重ならないことを示しています。
# constrained_layout=True の場合 (2x2 サブプロット)
fig1, axes1 = plt.subplots(nrows=2, ncols=2, constrained_layout=True, figsize=(8, 6))
axes1[0, 0].set_title("constrained_layout=Trueの場合")
axes1[0, 1].set_title("サブプロット (1,2)")
axes1[1, 0].set_title("サブプロット (2,1)")
axes1[1, 1].set_title("サブプロット (2,2)")
# constrained_layout=False (デフォルト) の場合 (2x2 サブプロット)
fig2, axes2 = plt.subplots(nrows=2, ncols=2, figsize=(8, 6)) # デフォルトは constrained_layout=False
axes2[0, 0].set_title("constrained_layout=Falseの場合")
axes2[0, 1].set_title("サブプロット (1,2)")
axes2[1, 0].set_title("サブプロット (2,1)")
axes2[1, 1].set_title("サブプロット (2,2)")
plt.show()
4.3 画像保存
作成したグラフを画像ファイルとして保存するには、Figure オブジェクトの savefig()
メソッドを使用します。ブログや資料作成のために、グラフを画像として保存することはよくあります。
以下のコードは、生成したグラフを画像ファイルとして保存する方法を示しています。fig.savefig("matplotlib-sample.png", bbox_inches="tight")
では、ファイル名を「matplotlib-sample.png」、形式を PNG とし、さらに bbox_inches="tight"
を指定することで、図の周囲の余分な空白を自動的に取り除いて保存しています。
savefig
メソッドには様々な便利なオプションがあります。
- 第一引数:保存するファイル名やパスを指定します。ファイルの拡張子(
.png
,.jpg
,.svg
,.pdf
など)によって、保存される画像形式が決まります。 dpi
: 保存する画像の解像度を指定します。表示されている解像度とは異なる解像度で保存したい場合に指定します。ブログなどでは、表示サイズに合わせて適切なdpi
を指定することで、ファイルサイズを抑えつつ鮮明な画像を得られます。bbox_inches="tight"
: 図の周囲の不要な余白を自動的に削除して保存します。これにより、グラフ本体が画像の大部分を占めるようになり、ブログなどに貼り付けた際にスペースを有効に使えます。transparent=True
: 背景を透過して保存します。PNG や SVG のような透過をサポートする画像形式で使用できます。背景が特定の色のウェブサイトに貼り付ける場合などに便利です。
以下のコードを実行すると、matplotlib-sample.png
というファイルが Colab のファイルブラウザ(左側のフォルダアイコン)に生成されます。生成されたファイルは、右クリックでダウンロードしたり、Google Drive にマウントして確認したりできます。
ブログ(特に WordPress)にグラフ画像を掲載する場合、以下の点も考慮すると良いでしょう。
- 画像サイズ: ブログのコンテンツ幅に合わせて、横幅 800〜1200 ピクセル程度の画像を用意することが多いです。これは
figsize
とdpi
の組み合わせで調整します(例:figsize=(8, 6)
,dpi=100
→ 800x600px)。 - 余白:
bbox_inches="tight"
を使うと、グラフ周りの不要な余白がカットされ、ブログ上での見た目がすっきりします。 - ファイル形式: Web 用途では PNG または JPEG が一般的です。線やテキストが多いグラフは PNG、写真のようなグラデーションが多いグラフは JPEG が適していることが多いですが、グラフの場合は PNG を使うのが無難です。ベクター形式の SVG は拡大しても劣化しないため、インタラクティブな表示や印刷用途に向いています。
- alt 属性: WordPress に画像をアップロードする際、alt 属性(代替テキスト)にグラフの内容を簡潔に説明するテキスト(例:「年ごとの売上推移を示す折れ線グラフ」)を入力すると、アクセシビリティや SEO の観点から好ましいです。
import matplotlib.pyplot as plt
import pandas as pd # pandasをインポート
# データをDataFrameで作成
data = {'X': [0, 1, 2], 'Y': [2, 1, 3]}
df = pd.DataFrame(data)
fig, ax = plt.subplots(figsize=(6, 4), dpi=150)
ax.plot(df['X'], df['Y'])
ax.set_title("保存例")
plt.tight_layout()
fig.savefig("matplotlib-sample.png", bbox_inches="tight") # 余白を詰めて保存
5. よくあるエラーと対処
Matplotlib を使っていて遭遇しやすい一般的なエラーとその対処法をまとめました。
- 日本語が□や?になる:
* 原因: 日本語フォントが正しく設定されていないか、Matplotlib が認識できていない。
* 対処法: Colab 環境であれば、上記の「Colab で日本語フォントを表示する」セクションにある !pip install japanize-matplotlib
と import japanize_matplotlib
を実行してください。ローカル環境の場合は、システムに日本語フォントがインストールされていることを確認し、Matplotlib のフォントキャッシュをクリアしたり、rcParams でフォントを指定したりする必要がある場合がありますが、japanize-matplotlib
を使うのが最も簡単です。
- マイナス記号が文字化け(四角になるなど):
* 原因: 使用しているフォントがマイナス記号を正しく表示できないか、Matplotlib の設定でUnicodeマイナス記号の使用がオフになっている。
* 対処法: plt.rcParams["axes.unicode_minus"] = False
を設定します。これにより、通常のハイフン記号がマイナスの代わりに使用され、文字化けを防ぐことができます。japanize-matplotlib
を使用している場合は、この設定は不要なことが多いです。
- 軸ラベルやタイトルが図の端で切れてしまう:
* 原因: グラフ要素に対して Figure や Axes のサイズが小さすぎるか、余白が不足している。
* 対処法: plt.tight_layout()
をコードの plt.show()
の直前で呼び出すか、plt.subplots()
を呼び出す際に constrained_layout=True
引数を指定します。これにより、Matplotlib が自動的に要素の重なりを避け、必要な余白を確保するようにレイアウトを調整してくれます。Figure の figsize
を大きくすることも有効です。
- 線が細すぎる/太すぎる:
* 原因: 線の太さがデフォルト設定のままになっている。
* 対処法: ax.plot()
などの描画メソッドを呼び出す際に、linewidth
引数で線の太さを数値で指定します。例えば、ax.plot(x, y, linewidth=2)
とすると、線が少し太くなります。よりグローバルに線の太さを変更したい場合は、plt.rcParams['lines.linewidth']
を設定することも可能です。
- 複数のプロットで Axes のサイズがバラバラになる:
* 原因: plt.subplots()
で作成された Axes のサイズが、デフォルトのグリッドレイアウトや手動調整によって不均一になっている。
* 対処法: plt.subplots()
でグリッドの形状(例: nrows=2, ncols=2
)を正しく指定し、tight_layout()
または constrained_layout=True
を使用して自動調整に任せるのが最も簡単です。より詳細な制御が必要な場合は、Figure.add_axes()
を使って Axes の位置とサイズを直接指定する方法もありますが、複雑になります。
6. 次に読む:主要プロットへの道
Matplotlib の Figure と Axes の基本的な考え方、日本語表示、そしてレイアウトの調整方法が理解できたら、次に学ぶべきは具体的なグラフの種類(プロット)の描き方です。 Matplotlib は様々な種類のグラフを描く機能を提供しており、それぞれのプロットタイプには特有のメソッドやカスタマイズオプションがあります。
基礎知識を土台として、よく利用される主要なプロットについて学ぶことで、データの可視化の幅が大きく広がります。
- 折れ線グラフ (
ax.plot()
): 時系列データや連続的な変化を示すのに適しています。複数の線を重ねて描いたり、線の色、種類(実線、点線など)、太さを変更したり、データ点にマーカーを付けたり、凡例を表示したりする方法を学びます。 - 棒グラフ (
ax.bar()
,ax.barh()
): 項目間の比較や数量の大小を示すのに使われます。縦向きの棒グラフ (bar
) と横向きの棒グラフ (barh
) があります。複数の項目を並べたり(グループ化)、積み上げたり(積み上げ棒グラフ)する方法、棒の色や幅を調整する方法を学びます。 - 散布図 (
ax.scatter()
): 2つの変数間の関係性や相関を示すのに適しています。個々のデータ点をプロットします。点の大きさ (s
) や色 (c
) を別の変数の値によって変えることで、3つ以上の変数の関係を同時に表現したり、カラーバーを追加したりする方法を学びます。 - ヒストグラム (
ax.hist()
) と 箱ひげ図 (ax.boxplot()
): データの分布を理解するのに役立ちます。
* ヒストグラム: データをいくつかの区間(ビン、bin)に分け、各区間に入るデータの数を棒グラフで表示します。ビンの数をどのように決めるか (bins
) や、度数ではなく密度を表示する方法などを学びます。
* 箱ひげ図: データの四分位数、中央値、外れ値などを一つの箱と線でコンパクトに表示します。データのばらつきや分布の偏りを比較するのに便利です。外れ値の表示方法や、複数のグループの箱ひげ図を並べて表示する方法などを学びます。
これらの主要なプロットについて、それぞれの基本的な使い方、カスタマイズ方法、そしてどのようなデータを可視化するのに適しているかを学ぶことで、あなたのデータ分析スキルはさらに向上するでしょう。
まとめ
本記事では、Matplotlib を使い始める上で最も重要な基礎概念と、Google Colab でよく直面する日本語表示の問題、そしてグラフのレイアウト調整と保存方法について解説しました。
- Figure と Axes: Matplotlib でグラフを描く際の基本的な「器」(Figure)と「中身」(Axes)の関係を理解することが第一歩です。
plt.subplots()
でこれらを同時に作成し、 Axes オブジェクトに対して描画や設定を行うのが標準的なワークフローです。 - Colab での日本語表示:
japanize-matplotlib
ライブラリを使うことで、Google Colab 環境での日本語文字化けを手軽に解消できます。 - サイズ・余白・保存:
figsize
とdpi
で図のサイズと解像度を、plt.tight_layout()
やconstrained_layout=True
で余白を調整し、fig.savefig()
で必要な形式(PNG, JPEG, SVG など)と設定(bbox_inches="tight"
,dpi
など)でグラフを保存する方法を学びました。これらのレイアウトや保存に関する設定は、一度テンプレートとして覚えておくと、繰り返しグラフを作成する際に非常に効率的です。
これらの基礎知識があれば、Matplotlib を使ったデータ可視化の第一歩を踏み出せます。次に学ぶべきは、具体的なデータの種類や目的に合わせた様々なグラフ(折れ線、棒、散布図など)の描き方です。
次回は「折れ線グラフの描き方:色・線種・凡例」について詳しく解説します。
コメント