データ可視化の強力な味方:Matplotlib完全ガイド

Python

【Pythonでグラフ作成】Matplotlib入門:データを「見える化」する基本テクニック

はじめに:データは「見る」ことで理解が深まります!

データ分析の世界へようこそ!膨大なデータの中から意味のある洞察を引き出すためには、データそのものの理解だけでなく、それを効果的に「見せる」ことが不可欠です。そこで今回は、Pythonにおけるデータ可視化ライブラリのデファクトスタンダードである「Matplotlib」について、その基礎から応用までを徹底解説します。

1. Matplotlibとは?

Matplotlibは、Pythonで静的、動画、インタラクティブな可視化を作成するための包括的なライブラリです。科学技術計算分野でよく利用されるMATLABのような使いやすさを目指して開発されました。棒グラフ、折れ線グラフ、散布図、ヒストグラム、3Dプロット、等高線図など、多種多様なグラフを作成できます。NumPyと密接に連携しており、データ分析結果を視覚的に表現する上で非常に強力なツールとなります。

インストール方法

Matplotlibは標準ライブラリではないので、使う前にインストールが必要です。コマンドプロンプトやターミナルで以下のコマンドを実行してくださいね。

pip install matplotlib numpy

※ numpy は数値計算ライブラリで、Matplotlibと組み合わせて使うことが多いので一緒にインストールしておくと便利ですよ。

2. なぜMatplotlibを使うのか?

Matplotlibには、他の可視化ライブラリにはない多くの利点があります。

  • 豊富な機能と柔軟性: ほとんどすべての種類のグラフを作成でき、各要素(色、線種、マーカー、軸ラベル、タイトル、凡例など)を細かくカスタマイズできます。
  • 高品質な出力: 論文やレポートにそのまま使えるような高品質な図を生成できます。PNG, JPEG, PDF, SVGなど、様々な形式で保存可能です。
  • 活発なコミュニティと豊富なドキュメント: 長い歴史を持つライブラリであるため、多くのユーザーがおり、オンライン上に豊富な情報や解決策が見つかります。公式ドキュメントも非常に充実しています。
  • 他のライブラリとの連携: Pandas、NumPy、Scikit-learnなど、他の主要なPythonライブラリとシームレスに連携します。特にPandasのDataFrameから直接プロットを作成する機能は非常に便利です。

3. Matplotlibの基本要素:FigureとAxes

Matplotlibでグラフを作成する際、最も基本的な概念となるのが「Figure」と「Axes」です。これらはキャンバスとグラフの関係に例えられます。

  • Figure (図全体): グラフが描画される「キャンバス」全体を表します。この中に1つ以上のAxesが含まれます。例えば、プレゼンテーションのスライド1枚に相当すると考えるとわかりやすいでしょう。
  • Axes (軸): 実際にデータがプロットされる「グラフ」領域を表します。X軸、Y軸、タイトル、凡例など、グラフの具体的な要素はAxesに属します。1つのFigure内に複数のAxesを作成することで、複数のグラフを並べて表示することができます。

これらの関係性を理解することが、Matplotlibでのグラフ作成の第一歩となります。

4. 基本的なプロットの作成手順

Matplotlibでグラフを作成する一般的な手順は以下の通りです。

  • 必要なモジュールのインポート: matplotlib.pyplotモジュールをインポートします。通常はpltというエイリアスを使用します。
import matplotlib.pyplot as plt import numpy as np
  • FigureとAxesの作成: plt.subplots()関数を使うのが一般的です。fig, ax = plt.subplots() これにより、1つのFigure (fig) と1つのAxes (ax) が生成されます。
  • データの準備: プロットしたいデータを準備します。NumPy配列やPandas DataFrameがよく使われます。
x = np.linspace(0, 10, 100) # 0から10までの100個の等間隔なデータ y = np.sin(x)
  • プロットの実行: Axesオブジェクトのメソッド(例: plot()scatter()bar()など)を呼び出してデータをプロットします。
ax.plot(x, y) # 折れ線グラフを作成
  • グラフのカスタマイズ(オプション): タイトル、軸ラベル、凡例などを設定して、グラフを見やすくします。
ax.set_title("Simple Sine Wave") # タイトル    
ax.set_xlabel("X-axis") # X軸ラベル  
ax.set_ylabel("Y-axis") # Y軸ラベル   
ax.legend(["Sine"]) # 凡例
  • グラフの表示: plt.show()を呼び出して、作成したグラフを表示します。
plt.show()  

これらの手順を踏むことで、ほとんどのグラフを作成できます。

5. 様々なグラフの種類と作成例

Matplotlibは非常に多くの種類のグラフをサポートしています。いくつか代表的なものをご紹介します。

5.1 折れ線グラフ (Line Plot)

時系列データや連続的なデータの変化を可視化するのに適しています。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 10, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)

fig, ax = plt.subplots(figsize=(8, 5)) # グラフのサイズを指定

ax.plot(x, y1, label="sin(x)", color="blue", linestyle="-")
ax.plot(x, y2, label="cos(x)", color="red", linestyle="--")

ax.set_title("Sine and Cosine Waves")
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.grid(True) # グリッド線を表示
ax.legend()

plt.show()

5.2 散布図 (Scatter Plot)

2つの変数間の関係性や分布を可視化するのに適しています。

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42) # 再現性のためにシードを設定
x_data = np.random.rand(50) * 10
y_data = 2 * x_data + 1 + np.random.randn(50) * 2 # ノイズを加える

fig, ax = plt.subplots(figsize=(7, 6))

ax.scatter(x_data, y_data, color="purple", marker="o", s=50, alpha=0.7) # マーカーの種類、サイズ、透明度を指定

ax.set_title("Scatter Plot of Random Data")
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.grid(True, linestyle='--', alpha=0.6)

plt.show()

5.3 ヒストグラム (Histogram)

データの分布を可視化するのに適しています。

import matplotlib.pyplot as plt
import numpy as np

data = np.random.randn(1000) # 正規分布に従うランダムなデータ

fig, ax = plt.subplots(figsize=(8, 5))

n, bins, patches = ax.hist(data, bins=30, color='lightgreen', edgecolor='black', alpha=0.8)

ax.set_title("Histogram of Random Data")
ax.set_xlabel("Value")
ax.set_ylabel("Frequency")
ax.grid(axis='y', alpha=0.75)

plt.show()

5.4 棒グラフ (Bar Plot)

カテゴリごとの数量や割合を比較するのに適しています。

import matplotlib.pyplot as plt
import numpy as np

# データの準備:カテゴリとそれに対応する値です
categories = ['りんご', 'バナナ', 'みかん', 'ぶどう']
sales = [150, 230, 180, 90] # 各フルーツの販売数です

# 棒グラフを描画します!
plt.bar(categories, sales)

# グラフのタイトルと軸ラベル
plt.title("フルーツ別販売数")
plt.xlabel("フルーツの種類")
plt.ylabel("販売数")

# グラフを表示します
plt.show()

6. Matplotlibのカスタマイズ:グラフを美しく、わかりやすく

Matplotlibの真骨頂は、その驚くべきカスタマイズ性です。グラフのあらゆる要素を細かく調整し、視覚的に魅力的で情報量の多いグラフを作成できます。

  • 色と線種: colorlinestylemarkerなどの引数で、線の色、種類、点などを変更できます。
  • 軸の範囲と目盛り: set_xlim()set_ylim()set_xticks()set_yticks()などで軸の範囲や目盛りの位置を設定できます。
  • タイトルとラベル: set_title()set_xlabel()set_ylabel()でグラフのタイトルや軸のラベルを設定します。
  • 凡例 (Legend): 複数のプロットがある場合に、legend()で凡例を表示し、どの線が何を表すかを示します。
  • グリッド線: grid(True)でグリッド線を表示し、値を読み取りやすくします。
  • スタイルシート: plt.style.use()を使って、あらかじめ定義されたスタイル('ggplot''seaborn''dark_background'など)を適用することで、一括してグラフの見た目を変更できます。plt.style.use('ggplot') # ggplotスタイルを適用 # ... グラフ作成コード ... plt.show()

これらのカスタマイズオプションを組み合わせることで、あなたのデータが持つストーリーを最大限に引き出すグラフを作成できるでしょう。

7. 実際の株価データで実践!複数銘柄の比較

ここからは、実際のデータを使ってMatplotlibのグラフ作成を体験してみましょう。今回は、世界の主要な株価指数である「日経平均株価」「S&P 500」「ナスダック総合指数」のデータを使います。

主要株価指数の取得と可視化

主要株価指数のデータを取得し、Matplotlibで比較グラフを作成してみましょう。

  • 日経平均株価: ^N225
  • S&P 500: ^GSPC
  • ナスダック総合指数: ^IXIC
import matplotlib.pyplot as plt
import yfinance as yf
import pandas as pd

# 文字化け対策のため。
plt.rcParams['font.family'] = 'Meiryo'  

# 主要株価指数のティッカーシンボル
tickers = {
    '日経平均': '^N225',
    'S&P 500': '^GSPC',
    'ナスダック': '^IXIC'
}

# 過去1年間のデータを取得します
# startとendで期間を指定できます
start_date = '2023-06-01'
end_date = '2024-06-01'

# 各指数の終値データを格納するDataFrame
all_data = pd.DataFrame()

for name, ticker in tickers.items():
    data = yf.download(ticker, start=start_date, end=end_date)
    all_data[name] = data['Close']

# 欠損値がある場合は、前後の値で補完します
all_data.fillna(method='ffill', inplace=True)
all_data.fillna(method='bfill', inplace=True)

# 基準化(正規化)して比較しやすくします
# 最初の日の値を1として、その後の変化率で表示します
normalized_data = all_data / all_data.iloc[0]

# グラフを描画します
plt.figure(figsize=(12, 7))

for column in normalized_data.columns:
    plt.plot(normalized_data.index, normalized_data[column], label=column)

plt.title(f'主要株価指数の推移 ({start_date} - {end_date})')
plt.xlabel('日付')
plt.ylabel('正規化された株価 (基準日を1.0)')
plt.grid(True)
plt.legend()
plt.tight_layout() # レイアウトの自動調整
plt.show()

このグラフを見ると、異なる株価指数が同じ期間でどのように変動したかを比較できます。基準化することで、絶対値の差に惑わされずに、それぞれの成長率や傾向を把握しやすくなります。

8. Matplotlibと他の可視化ライブラリとの関係性

PythonにはMatplotlib以外にも優れた可視化ライブラリが多数存在します。

  • Seaborn: Matplotlibの上に構築されており、より少ないコードで統計グラフを美しく描画するのに特化しています。Matplotlibの豊富なカスタマイズ性とSeabornの美しさを組み合わせることがよく行われます。
  • Plotly & Bokeh: インタラクティブなグラフ作成に強みがあり、Webアプリケーションなどでの利用に適しています。

これらのライブラリはそれぞれ得意分野が異なりますが、Matplotlibはそれらの基盤となることが多く、Matplotlibの知識は他のライブラリを学ぶ上でも非常に役立ちます。特にSeabornはMatplotlibをラップしているため、Matplotlibの概念を理解していれば、より深くSeabornを使いこなすことができます。

9. まとめと次のステップ

Matplotlibは、Pythonにおけるデータ可視化の基礎であり、非常に強力で柔軟なツールです。FigureとAxesの概念を理解し、基本的なプロット作成手順をマスターすれば、あなたのデータ分析の幅は格段に広がるでしょう。

データは可視化することで初めてその真価を発揮します。Matplotlibを使いこなし、あなたのデータに隠された物語を鮮やかに描き出しましょう!

もしMatplotlibについてさらに詳しく知りたい場合は、Matplotlibの公式ドキュメントを覗いてみてください。豊富なサンプルコードと詳細な説明がきっと役に立つはずです。

コメント