【Matplotlib入門 第2回】表現力を高める!散布図・ヒストグラム・複数グラフ(サブプロット)の描き方 📊

「2つのデータの関係性を視覚的に表現したいな…」
「手元にあるデータの分布(ばらつき具合)って、どうやってグラフにすればいいんだろう?」
「複数のグラフを並べて比較したいけど、どうすれば一枚の画像にまとめられる?」

こんにちは! Pythonデータ可視化探検隊、隊長のPythonistaです! 前回の第1回では、Matplotlibを使って基本的な折れ線グラフや棒グラフを描画し、タイトルやラベルで装飾する方法を学びましたね。これで、Pythonでデータをグラフにする第一歩を踏み出せました。

シリーズ第2回の今回は、あなたのデータ可視化ツールボックスをさらに充実させるため、より専門的で強力なグラフ作成テクニックを探求します! 具体的には、

  • 2つの変数の関係性を見るのに最適な散布図 (Scatter Plot)
  • データの分布(どの値にデータが集中しているか)を把握するためのヒストグラム (Histogram)
  • 複数のグラフを一枚の図にまとめて、比較しやすくするためのサブプロット (Subplots) の作成方法

を、具体的なサンプルコードと共に分かりやすく解説していきます。これらのグラフをマスターすれば、より深いデータ分析と、説得力のある情報伝達が可能になりますよ!


1. 準備:モジュールのインポート

今回も、Matplotlibのpyplotモジュールと、データ作成に便利なNumPyをインポートしておきましょう。

【Matplotlibのインストールがまだの方へ】
ターミナルやコマンドプロンプトでpip install matplotlib numpyを実行してください。

import matplotlib.pyplot as plt
import numpy as np

# 日本語フォント設定(文字化け対策)
# お使いの環境に合わせてフォントパスを指定してください。なければコメントアウトしてください。
try:
    plt.rcParams['font.family'] = 'IPAexGothic' # 例: IPAexゴシック
except:
    print("日本語フォントが見つからないため、英語表記のままプロットします。")

(日本語ラベルを使用する際、環境によっては文字化けすることがあります。上記のように日本語フォントを指定するか、japanize-matplotlibというライブラリをインストールすると簡単に対策できます。)

詳しくはこちらで解説しています。【Matplotlib文字化け解決】Windows/Ubuntu対応!日本語を綺麗に表示する設定方法 📝


2. 2つの変数の関係性を見る:散布図 (plt.scatter())

散布図は、2つの異なる数値データ(変数)を、それぞれX軸とY軸に対応させて点をプロットしたグラフです。2つの変数の間に相関関係があるかどうか(例えば、一方が増えるともう一方も増える傾向があるかなど)を見るのに非常に役立ちます。

2.1. 基本的な散布図の作成

NumPyの乱数生成機能を使って、2つのランダムなデータセットを作成し、その関係性をプロットしてみましょう。

import matplotlib.pyplot as plt
import numpy as np

# 100個のランダムなデータを生成
x_data = np.random.rand(100) # 0から1までの一様乱数
y_data = np.random.rand(100)

plt.figure(figsize=(6, 6))
plt.scatter(x_data, y_data) # scatter関数で散布図を描画

plt.title('基本的な散布図')
plt.xlabel('X軸データ')
plt.ylabel('Y軸データ')
plt.grid(True)
plt.show()


この例では、xとyに相関がないため、点は全体にランダムに散らばっています。

2.2. 散布図のカスタマイズ:色・サイズ・透明度で情報を追加

散布図の点は、色やサイズ、透明度を変えることで、さらに多くの情報を表現できます。3つ目や4つ目の変数の値を、点の色やサイズに割り当てることができるのです。

import matplotlib.pyplot as plt
import numpy as np

# 100個のランダムなデータを生成
x = np.random.randn(100) # 標準正規分布に従う乱数
y = 2 * x + np.random.randn(100) # y = 2x にノイズを加えたデータ

colors = np.random.rand(100)  # 3つ目の変数として、各点の色をランダムに設定
sizes = 150 * np.random.rand(100) # 4つ目の変数として、各点のサイズをランダムに設定

plt.figure(figsize=(8, 6))
plt.scatter(x, y, 
            c=colors,         # 色の配列
            s=sizes,          # サイズの配列
            alpha=0.7,        # 透明度 (0.0から1.0)
            cmap='viridis')  # カラーマップの種類

plt.title('カスタマイズされた散布図 (バブルチャート)')
plt.xlabel('X変数')
plt.ylabel('Y変数')
plt.colorbar(label='色の値 (3番目の変数)') # カラーバーを表示
plt.grid(True)
plt.show()

このように、散布図は2次元のグラフでありながら、最大4つの変数の関係性を同時に表現できる、非常に情報量の多いグラフです。


3. データの分布を把握する:ヒストグラム (plt.hist())

ヒストグラムは、1つの数値データの分布(どの値の範囲にデータがどれだけ集中しているか)を視覚化するためのグラフです。データをいくつかの区間(ビン, bin)に分け、各区間に含まれるデータの個数(度数, frequency)を棒グラフで表します。

3.1. 基本的なヒストグラムの作成

正規分布に従うランダムなデータを生成し、その分布をヒストグラムで確認してみましょう。

import matplotlib.pyplot as plt
import numpy as np

# 平均0, 標準偏差1の正規分布に従う乱数を1000個生成
data = np.random.randn(1000)

plt.figure(figsize=(8,5))
plt.hist(data) # hist関数でヒストグラムを描画

plt.title('基本的なヒストグラム')
plt.xlabel('値 (Value)')
plt.ylabel('度数 (Frequency)')
plt.show()

平均である0のあたりにデータが集中している様子がよく分かりますね。

3.2. ヒストグラムのカスタマイズ:ビンの数や見た目の変更

ヒストグラムは、区間(ビン)の数を変えるだけで見た目や解釈が大きく変わることがあります。bins引数でビンの数を調整できます。

import matplotlib.pyplot as plt
import numpy as np

data = np.random.randn(1000)

plt.figure(figsize=(8,5))
# ビンの数を50に増やし、色や枠線を設定
plt.hist(data, 
         bins=50,                 # ビンの数を50に指定
         color='lightgreen',
         edgecolor='black',
         density=True)         # density=Trueで度数ではなく確率密度で表示

plt.title('カスタマイズされたヒストグラム (bins=50)')
plt.xlabel('値 (Value)')
plt.ylabel('確率密度 (Density)')
plt.show()

ビンの数を増やすと、より詳細な分布の形が見えてきます。ただし、増やしすぎるとギザギザになりすぎて、かえって全体の傾向が分かりにくくなることもあるので、適切なビンの数を見つけることが重要です。


4. 複数のグラフを一枚にまとめる:サブプロット

複数のグラフを並べて比較したい場合、個別のウィンドウで表示するのではなく、一枚の図(Figure)の中に複数のプロットエリア(Axes)を配置するのが一般的です。これを実現するのがサブプロットです。

4.1. plt.subplots():最新かつ推奨される方法

plt.subplots(nrows, ncols)関数は、指定した行数(nrows)と列数(ncols)のグリッドを持つ図(Figureオブジェクト)と、各プロットエリア(Axesオブジェクト)の配列を一度に作成してくれる、非常に便利な方法です。

重要ポイント: この方法を使うと、グラフの描画コマンドが少し変わります。plt.plot()plt.title()のようにpltから直接呼び出すのではなく、各プロットエリアを表すaxオブジェクトのメソッド(例: ax.plot(), ax.set_title())を呼び出す形になります。これは、Matplotlibのよりオブジェクト指向的な使い方で、複雑なグラフを柔軟に作成するのに適しています。

import matplotlib.pyplot as plt
import numpy as np

# 2行2列のサブプロットを作成
# figは図全体、axesは2x2のndarrayで各プロットエリア(ax)を格納
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))

# --- 1番目のプロット (左上: axes[0, 0]) ---
x1 = np.linspace(0, 10, 100)
y1 = np.sin(x1)
axes[0, 0].plot(x1, y1)
axes[0, 0].set_title('折れ線グラフ (sin)') # plt.title() ではなく ax.set_title()
axes[0, 0].grid(True)

# --- 2番目のプロット (右上: axes[0, 1]) ---
x2 = ['A', 'B', 'C']
y2 = [5, 12, 8]
axes[0, 1].bar(x2, y2, color='#ff7f0e')
axes[0, 1].set_title('棒グラフ')
axes[0, 1].set_xlabel('カテゴリ') # ax.set_xlabel()
axes[0, 1].set_ylabel('値')         # ax.set_ylabel()

# --- 3番目のプロット (左下: axes[1, 0]) ---
x3 = np.random.randn(100)
y3 = np.random.randn(100)
axes[1, 0].scatter(x3, y3, alpha=0.5)
axes[1, 0].set_title('散布図')

# --- 4番目のプロット (右下: axes[1, 1]) ---
data4 = np.random.normal(10, 2, 1000) # 平均10, 標準偏差2の正規分布
axes[1, 1].hist(data4, bins=30, color='#2ca02c')
axes[1, 1].set_title('ヒストグラム')

# 全体のタイトル
fig.suptitle('様々な種類のグラフをサブプロットで表示', fontsize=16)

# 各プロット間の間隔を自動調整
plt.tight_layout(rect=[0, 0, 1, 0.96]) # suptitleと重ならないように調整

plt.show()

plt.subplots()を使うことで、複雑なレイアウトのグラフも体系的に作成することができます。


まとめ:グラフの種類とレイアウトを使いこなし、表現力を高めよう!

今回は、Matplotlib入門シリーズの第2回として、データ可視化の表現力を高めるための重要なテクニックを学びました。

  • 散布図 (plt.scatter()): 2つの変数の関係性や相関を見るのに最適。色やサイズでさらに情報を追加できる。
  • ヒストグラム (plt.hist()): 1つのデータの分布、つまりどの値にデータが集中しているかを把握するのに最適。
  • サブプロット (plt.subplots()): 複数のグラフを一枚の図にまとめて表示し、比較やダッシュボード作成を可能にする。
  • サブプロットを使う際の、よりオブジェクト指向的な描画方法 (ax.plot(), ax.set_title()など)。

これらのグラフは、データ探索の初期段階でデータの全体像を掴んだり、分析結果を他者に分かりやすく伝えたりする上で、基本かつ非常に強力なツールとなります。

Matplotlibの世界はまだまだ奥深く、3Dプロット、等高線プロット、ヒートマップなど、さらに多くの種類のグラフや、細かなスタイルのカスタマイズが可能です。次回以降、そうしたより高度なテクニックにも触れていければと思います。お楽しみに!

その他の投稿はこちら

コメント

このブログの人気の投稿

タイトルまとめ

これで迷わない!WindowsでPython環境構築する一番やさしい方法 #0

【Python標準ライブラリ完結!】11の冒険をありがとう!君のPython力が飛躍する「次の一歩」とは? 🚀