Matplotlibでグラフを描く:基本から応用まで
Matplotlibは、Pythonでグラフや図を作成するための強力で柔軟なライブラリです。科学技術計算、データ分析、機械学習など、幅広い分野で利用されており、その多様な機能とカスタマイズ性の高さから、多くの開発者に支持されています。本稿では、Matplotlibの基本的な使い方から、より高度な応用までを網羅的に解説します。
Matplotlibのインストールと基本構造
Matplotlibを使用するには、まずインストールが必要です。pipコマンドを使用して簡単にインストールできます。
“`python
pip install matplotlib
“`
Matplotlibのグラフ描画は、主に`matplotlib.pyplot`モジュールを使用します。このモジュールは、MATLABのようなインタフェースを提供し、直感的な操作を可能にします。
グラフ描画の基本的な流れは以下のようになります。
- 必要なモジュールをインポートする。
- グラフに表示するデータを準備する。
- `plt.figure()`で描画領域(Figure)を作成する。
- `fig.add_subplot()`または`plt.subplot()`で座標軸(Axes)を作成する。
- `ax.plot()`などのメソッドでデータをプロットする。
- `plt.title()`, `plt.xlabel()`, `plt.ylabel()`などでタイトルや軸ラベルを設定する。
- `plt.show()`でグラフを表示する。
簡単な折れ線グラフの例
以下に、基本的な折れ線グラフを作成するコード例を示します。
“`python
import matplotlib.pyplot as plt
import numpy as np
# データの準備
x = np.linspace(0, 10, 100)
y = np.sin(x)
# FigureとAxesの作成
fig = plt.figure(figsize=(8, 6)) # Figureのサイズを指定
ax = fig.add_subplot(1, 1, 1) # 1行1列の1番目のsubplotを作成
# データのプロット
ax.plot(x, y, label=’sin(x)’)
# タイトルと軸ラベルの設定
ax.set_title(‘Sine Wave’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)
# 凡例の表示
ax.legend()
# グリッドの表示
ax.grid(True)
# グラフの表示
plt.show()
“`
このコードでは、`numpy`を使用してsin波のデータを生成し、`matplotlib.pyplot`を使って折れ線グラフを描画しています。`figsize`でFigureのサイズを調整し、`ax.set_title()`などでグラフの要素を設定しています。`ax.legend()`は凡例を表示し、`ax.grid(True)`はグリッド線を表示します。
様々なグラフの種類
Matplotlibは、折れ線グラフ以外にも、多種多様なグラフを作成できます。
散布図 (Scatter Plot)
2つの変数の関係性を可視化するのに適しています。
“`python
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
sizes = 1000 * np.random.rand(50)
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(1, 1, 1)
ax.scatter(x, y, c=colors, s=sizes, alpha=0.5) # c:色, s:サイズ, alpha:透明度
ax.set_title(‘Scatter Plot’)
ax.set_xlabel(‘X value’)
ax.set_ylabel(‘Y value’)
plt.show()
“`
棒グラフ (Bar Chart)
カテゴリごとの値を比較するのに適しています。
“`python
categories = [‘A’, ‘B’, ‘C’, ‘D’]
values = [23, 45, 56, 12]
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(1, 1, 1)
ax.bar(categories, values)
ax.set_title(‘Bar Chart’)
ax.set_xlabel(‘Category’)
ax.set_ylabel(‘Value’)
plt.show()
“`
ヒストグラム (Histogram)
データの分布を可視化します。
“`python
data = np.random.randn(1000) # 正規分布に従う乱数
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(1, 1, 1)
ax.hist(data, bins=30, edgecolor=’black’) # bins:区間の数
ax.set_title(‘Histogram’)
ax.set_xlabel(‘Value’)
ax.set_ylabel(‘Frequency’)
plt.show()
“`
円グラフ (Pie Chart)
全体に対する各部分の割合を示します。
“`python
labels = [‘Frogs’, ‘Hogs’, ‘Dogs’, ‘Logs’]
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0) # 2番目の要素を少し切り出す
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(1, 1, 1)
ax.pie(sizes, explode=explode, labels=labels, autopct=’%1.1f%%’, shadow=True, startangle=90)
ax.axis(‘equal’) # 円を真円にする
ax.set_title(‘Pie Chart’)
plt.show()
“`
グラフのカスタマイズ
Matplotlibでは、グラフの見た目を細かくカスタマイズできます。
色、線種、マーカー
`plot()`メソッドの引数で、線の色、種類、マーカーを指定できます。
“`python
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(1, 1, 1)
ax.plot(x, y1, color=’red’, linestyle=’–‘, marker=’o’, label=’sin(x)’) # 赤色の破線、丸マーカー
ax.plot(x, y2, color=’blue’, linestyle=’-‘, marker=’x’, label=’cos(x)’) # 青色の実線、バツマーカー
ax.set_title(‘Customized Lines’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)
ax.legend()
plt.show()
“`
軸の範囲と目盛り
`ax.set_xlim()`, `ax.set_ylim()`で軸の範囲を、`ax.set_xticks()`, `ax.set_yticks()`で目盛りの位置を指定できます。
“`python
x = np.linspace(-np.pi, np.pi, 100)
y = np.sin(x)
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(1, 1, 1)
ax.plot(x, y)
ax.set_title(‘Customized Axis’)
ax.set_xlabel(‘Angle (radians)’)
ax.set_ylabel(‘Sine Value’)
# 軸の範囲設定
ax.set_xlim([-np.pi, np.pi])
ax.set_ylim([-1.2, 1.2])
# 目盛りの位置指定 (πの倍数で表示)
ax.set_xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
ax.set_xticklabels([r’$-pi$’, r’$-pi/2$’, ‘0’, r’$pi/2$’, r’$pi$’]) # LaTeX形式で表示
plt.show()
“`
テキストとアノテーション
グラフ上にテキストを追加したり、特定の箇所を指し示すアノテーションを挿入したりできます。
“`python
x = np.linspace(0, 10, 100)
y = x**2
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(1, 1, 1)
ax.plot(x, y, label=’x^2′)
# テキストの追加
ax.text(2, 50, ‘This is a parabola’, fontsize=12, color=’green’)
# アノテーションの追加 (特定の点を指し示す)
peak_x, peak_y = 5, 25
ax.annotate(‘Minimum point’, xy=(peak_x, peak_y), xytext=(3, 70),
arrowprops=dict(facecolor=’black’, shrink=0.05), # arrowpropsで矢印のスタイルを指定
fontsize=10, ha=’center’) # ha: horizontal alignment
ax.set_title(‘Text and Annotations’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)
ax.legend()
plt.show()
“`
複数のグラフを配置する (Subplots)
1つのFigure内に複数のグラフを並べて表示することで、比較や関連性の確認が容易になります。
“`python
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) * np.cos(x)
y4 = x**2
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8)) # 2×2のサブプロットを作成
# 左上
axes[0, 0].plot(x, y1)
axes[0, 0].set_title(‘Sine’)
# 右上
axes[0, 1].plot(x, y2, color=’orange’)
axes[0, 1].set_title(‘Cosine’)
# 左下
axes[1, 0].plot(x, y3, color=’green’)
axes[1, 0].set_title(‘Sin * Cos’)
# 右下
axes[1, 1].plot(x, y4, color=’red’)
axes[1, 1].set_title(‘x^2’)
plt.tight_layout() # サブプロット間の間隔を自動調整
plt.show()
“`
`plt.subplots(nrows, ncols)`は、指定した行数と列数のAxesオブジェクトの配列を返します。`axes[row, col]`で各Axesにアクセスできます。`plt.tight_layout()`は、グラフが重なるのを防ぐために、サブプロット間の間隔を自動的に調整してくれます。
高度なグラフと応用
Matplotlibは、さらに高度なグラフも描画できます。
3Dグラフ
`mpl_toolkits.mplot3d`モジュールを使用すると、3次元のグラフを作成できます。
“`python
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection=’3d’) # projection=’3d’で3D Axesを指定
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y) # 2次元のグリッドを作成
Z = np.sin(np.sqrt(X**2 + Y**2))
ax.plot_surface(X, Y, Z, cmap=’viridis’) # cmapでカラーマップを指定
ax.set_title(‘3D Surface Plot’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)
ax.set_zlabel(‘Z-axis’)
plt.show()
“`
画像表示
画像データをMatplotlibで表示することも可能です。
“`python
import matplotlib.image as mpimg
img = mpimg.imread(‘your_image.png’) # 画像ファイルを読み込む (ファイルパスを指定)
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(1, 1, 1)
ax.imshow(img)
ax.set_title(‘Image Display’)
ax.axis(‘off’) # 軸を非表示にする
plt.show()
“`
グラフの保存
作成したグラフは、様々な形式で保存できます。
“`python
# 上記の折れ線グラフの例を保存する場合
# ax.plot(…)
# …
# plt.savefig(‘sine_wave.png’) # PNG形式で保存
# plt.savefig(‘sine_wave.pdf’, dpi=300) # PDF形式で保存 (解像度指定)
# plt.savefig(‘sine_wave.svg’) # SVG形式で保存 (ベクター形式)
“`
`plt.savefig()`関数を使用し、ファイル名を指定することで、PNG, JPG, PDF, SVGなど、様々な形式で保存できます。`dpi`引数で解像度を指定することも可能です。
スタイルシート
Matplotlibには、あらかじめ定義されたスタイルシートが用意されており、これらを適用することで、手軽にグラフの見た目を洗練させることができます。
“`python
plt.style.use(‘ggplot’) # ‘ggplot’スタイルを適用
x = np.linspace(0, 10, 100)
y = np.sin(x)
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(1, 1, 1)
ax.plot(x, y)
ax.set_title(‘Graph with ggplot style’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)
plt.show()
plt.style.use(‘default’) # デフォルトスタイルに戻す
“`
利用可能なスタイルシートは `plt.style.available` で確認できます。
まとめ
Matplotlibは、Pythonでグラフを作成するための非常に強力で汎用性の高いライブラリです。基本的な折れ線グラフや棒グラフから、複雑な3Dグラフ、画像表示まで、幅広いニーズに対応できます。豊富なカスタマイズオプションにより、グラフの見た目を細かく調整し、データの特性を最大限に引き出すことが可能です。本稿で解説した基本から応用までの内容を理解し、実際に手を動かすことで、Matplotlibを使いこなし、効果的なデータ可視化を実現できるようになるでしょう。
