はじめに
データ可視化において、グラフにロゴ、透かし、またはその他の画像要素を追加したい場合があります。このチュートリアルでは、Matplotlib のグラフ上に画像を重ね、グラフ内容の前面に配置し、半透明にする方法を紹介します。
matplotlib.figure.Figure クラスの figimage メソッドを使用してグラフ上に画像を配置する方法と、matplotlib.image モジュールの imread メソッドを使用して画像データを読み込む方法を学びます。
このチュートリアルの最後まで学習すると、ブランディング、透かし入れ、またはデータプレゼンテーションの視覚的魅力を高めるために役立つカスタム画像オーバーレイを持つ、プロフェッショナルな見た目の可視化を作成できるようになります。
VM のヒント
VM の起動が完了したら、左上隅をクリックして Notebook タブに切り替え、Jupyter Notebook を開いて練習を行ってください。
場合によっては、Jupyter Notebook の読み込みが完了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題が発生した場合は、いつでも Labby に相談してください。セッション終了後にフィードバックを提供していただければ、迅速に問題を解決します。
Jupyter Notebook の作成と必要なライブラリのインポート
Notebook の最初のセルに、必要なライブラリをインポートするための以下のコードを入力します。
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cbook as cbook
import matplotlib.image as image
これらのライブラリそれぞれの機能を理解しましょう。
matplotlib.pyplot(pltとしてエイリアス付けされています): matplotlib を MATLAB のように動作させる関数のコレクションで、グラフを作成するための便利なインターフェイスを提供します。numpy(npとしてエイリアス付けされています): Python での科学計算のための基本的なパッケージで、データ操作に使用します。matplotlib.cbook: matplotlib のユーティリティ関数のコレクションで、サンプルデータを取得する関数も含まれています。matplotlib.image: matplotlib の画像関連の機能を提供するモジュールで、画像の読み込みと表示に使用します。
Notebook の上部にある「Run」ボタンをクリックするか、Shift + Enter キーを押してセルを実行します。

このセルの実行は何も出力せずに完了するはずで、これはすべてのライブラリが正常にインポートされたことを示します。
画像の読み込みと確認
これでライブラリをインポートしたので、グラフ上に重ねる画像を読み込む必要があります。Matplotlib は練習用のサンプル画像をいくつか提供しています。
- Notebook で新しいセルを作成し、以下のコードを入力します。
## Load the sample image
with cbook.get_sample_data('logo2.png') as file:
im = image.imread(file)
## Display information about the image
print(f"Image shape: {im.shape}")
print(f"Image data type: {im.dtype}")
## Display the image
plt.figure(figsize=(4, 4))
plt.imshow(im)
plt.axis('off') ## Hide axis
plt.title('Matplotlib Logo')
plt.show()
このコードは以下のことを行います。
cbook.get_sample_data()を使用して、Matplotlib のサンプルデータコレクションから 'logo2.png' という名前のサンプル画像を読み込みます。image.imread()を使用して、画像ファイルを NumPy 配列として読み込みます。- 画像の次元とデータ型に関する情報を出力します。
plt.imshow()を使用して画像を表示するための図を作成します。plt.axis('off')で軸の目盛りとラベルを非表示にします。- 図にタイトルを追加します。
plt.show()を使用して図を表示します。
- Shift + Enter を押してセルを実行します。
出力には画像に関する情報が表示され、Matplotlib のロゴが表示されるはずです。画像の形状は画像の次元(高さ、幅、色チャンネル)を示し、データ型は画像データの保存形式を示します。

このステップは、オーバーレイとして使用する画像を理解するのに役立つため重要です。画像の外観と寸法を確認でき、グラフ上に配置する方法を決める際に役立ちます。
ランダムデータを使用した基本的なグラフの作成
画像をオーバーレイする前に、ビジュアライゼーションのベースとなるグラフを作成する必要があります。ランダムデータを使用して簡単な棒グラフを作成しましょう。
- Notebook で新しいセルを作成し、以下のコードを入力します。
## Create a figure and axes for our plot
fig, ax = plt.subplots(figsize=(10, 6))
## Set a random seed for reproducibility
np.random.seed(19680801)
## Generate random data
x = np.arange(30) ## x-axis values (0 to 29)
y = x + np.random.randn(30) ## y-axis values (x plus random noise)
## Create a bar chart
bars = ax.bar(x, y, color='#6bbc6b') ## Green bars
## Add grid lines
ax.grid(linestyle='--', alpha=0.7)
## Add labels and title
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Bar Chart with Random Data')
## Display the plot
plt.tight_layout()
plt.show()
このコードは以下のことを行います。
plt.subplots()を使用して特定のサイズの図と軸を作成します。- コードを実行するたびに同じランダム値が得られるように、乱数のシードを設定します。
- 30 個の x 値(0 から 29)と対応する y 値(x にランダムノイズを加えたもの)を生成します。
ax.bar()を使用して緑色の棒グラフを作成します。ax.grid()を使用してグラフにグリッド線を追加します。- x 軸、y 軸のラベルとグラフのタイトルを追加します。
plt.tight_layout()を使用して余白を調整し、見栄えを良くします。plt.show()を使用してグラフを表示します。
- Shift + Enter を押してセルを実行します。
出力には、ランダムデータを表す緑色の棒グラフが表示されるはずです。x 軸には 0 から 29 の整数が表示され、y 軸にはランダムノイズが加えられた対応する値が表示されます。
このグラフは、次のステップで画像をオーバーレイする基盤となります。図オブジェクトを変数 fig に、軸オブジェクトを変数 ax に格納したことに注意してください。これらの変数は画像をオーバーレイする際に必要になります。
グラフ上に画像をオーバーレイする
これでベースとなるグラフが作成できたので、その上に画像をオーバーレイしましょう。figimage メソッドを使用して画像を図に追加し、下のグラフが見えるように半透明にします。
- Notebook で新しいセルを作成し、以下のコードを入力します。
## Create a figure and axes for our plot (same as before)
fig, ax = plt.subplots(figsize=(10, 6))
## Set a random seed for reproducibility
np.random.seed(19680801)
## Generate random data
x = np.arange(30) ## x-axis values (0 to 29)
y = x + np.random.randn(30) ## y-axis values (x plus random noise)
## Create a bar chart
bars = ax.bar(x, y, color='#6bbc6b') ## Green bars
## Add grid lines
ax.grid(linestyle='--', alpha=0.7)
## Add labels and title
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Bar Chart with Image Overlay')
## Load the image
with cbook.get_sample_data('logo2.png') as file:
im = image.imread(file)
## Overlay the image on the plot
## Parameters:
## - im: the image data
## - 25, 25: x and y position in pixels from the bottom left
## - zorder=3: controls the drawing order (higher numbers are drawn on top)
## - alpha=0.5: controls the transparency (0 = transparent, 1 = opaque)
fig.figimage(im, 25, 25, zorder=3, alpha=0.5)
## Display the plot
plt.tight_layout()
plt.show()
このコードは前のステップで行ったことを組み合わせ、figimage メソッドを追加して画像をグラフ上にオーバーレイします。figimage のパラメータを以下に分解します。
im: NumPy 配列としての画像データ。25, 25: 図の左下角からのピクセル単位の x と y の位置。zorder=3: 描画順序を制御します。数値が大きいほど、数値が小さい要素の上に描画されます。alpha=0.5: 画像の透明度を制御します。0 は完全に透明、1 は完全に不透明です。
- Shift + Enter を押してセルを実行します。
出力には前と同じ棒グラフが表示され、左下隅に Matplotlib のロゴがオーバーレイされているはずです。ロゴは半透明になっており、下のグラフが見えるようになっています。
- 異なる位置と透明度レベルで実験してみましょう。新しいセルを作成し、以下のコードを入力します。
## Create a figure and axes for our plot
fig, ax = plt.subplots(figsize=(10, 6))
## Set a random seed for reproducibility
np.random.seed(19680801)
## Generate random data
x = np.arange(30)
y = x + np.random.randn(30)
## Create a bar chart
bars = ax.bar(x, y, color='#6bbc6b')
ax.grid(linestyle='--', alpha=0.7)
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Bar Chart with Centered Image Overlay')
## Load the image
with cbook.get_sample_data('logo2.png') as file:
im = image.imread(file)
## Get figure dimensions
fig_width, fig_height = fig.get_size_inches() * fig.dpi
## Calculate center position (this is approximate)
x_center = fig_width / 2 - im.shape[1] / 2
y_center = fig_height / 2 - im.shape[0] / 2
## Overlay the image at the center with higher transparency
fig.figimage(im, x_center, y_center, zorder=3, alpha=0.3)
## Display the plot
plt.tight_layout()
plt.show()
このコードは、画像を図の中央に配置し、透明度レベルを高く(alpha=0.3)して、透かしとしてより適したものにします。
- Shift + Enter を押してセルを実行します。
出力には、ロゴが中央に配置され、前よりも透明になった棒グラフが表示され、透かし効果が得られます。
画像オーバーレイ用の再利用可能な関数の作成
コードをより再利用可能にするために、Matplotlib の任意の図に画像をオーバーレイできる関数を作成しましょう。これにより、異なるグラフに同じ効果を簡単に適用できます。
- Notebook で新しいセルを作成し、以下のコードを入力します。
def add_image_overlay(fig, image_path, x_pos=25, y_pos=25, alpha=0.5, zorder=3):
"""
Add an image overlay to a matplotlib figure.
Parameters:
-----------
fig : matplotlib.figure.Figure
The figure to add the image to
image_path : str
Path to the image file
x_pos : int
X position in pixels from the bottom left
y_pos : int
Y position in pixels from the bottom left
alpha : float
Transparency level (0 to 1)
zorder : int
Drawing order (higher numbers are drawn on top)
Returns:
--------
fig : matplotlib.figure.Figure
The figure with the image overlay
"""
## Load the image
with cbook.get_sample_data(image_path) as file:
im = image.imread(file)
## Add the image to the figure
fig.figimage(im, x_pos, y_pos, zorder=zorder, alpha=alpha)
return fig
## Example usage: Create a scatter plot with an image overlay
fig, ax = plt.subplots(figsize=(10, 6))
## Set a random seed for reproducibility
np.random.seed(19680801)
## Generate random data for a scatter plot
x = np.random.rand(50) * 10
y = np.random.rand(50) * 10
## Create a scatter plot
ax.scatter(x, y, s=100, c=np.random.rand(50), cmap='viridis', alpha=0.7)
ax.grid(linestyle='--', alpha=0.7)
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Scatter Plot with Image Overlay')
## Add the image overlay using our function
add_image_overlay(fig, 'logo2.png', x_pos=50, y_pos=50, alpha=0.4)
## Display the plot
plt.tight_layout()
plt.show()
このコードは add_image_overlay という関数を定義しています。この関数は以下のことを行います。
- 図、画像のパス、位置、透明度、z オーダーのパラメータを受け取ります。
- 指定された画像を読み込みます。
figimageを使用して画像を図に追加します。- 変更された図を返します。
関数を定義した後、ランダムデータの散布図を作成し、Matplotlib のロゴをオーバーレイすることで、その使用方法を示しています。
- Shift + Enter を押してセルを実行します。
出力には、ランダムに配置された色付きの点からなる散布図が表示され、位置 (50, 50) に 40% の不透明度で Matplotlib のロゴがオーバーレイされているはずです。
- 折れ線グラフを使ったもう 1 つの例を試してみましょう。新しいセルを作成し、以下のコードを入力します。
## Example usage: Create a line plot with an image overlay
fig, ax = plt.subplots(figsize=(10, 6))
## Generate data for a line plot
x = np.linspace(0, 10, 100)
y = np.sin(x)
## Create a line plot
ax.plot(x, y, linewidth=2, color='#d62728')
ax.grid(linestyle='--', alpha=0.7)
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Sine Wave with Image Overlay')
ax.set_ylim(-1.5, 1.5)
## Add the image overlay using our function
## Place it in the bottom right corner
fig_width, fig_height = fig.get_size_inches() * fig.dpi
with cbook.get_sample_data('logo2.png') as file:
im = image.imread(file)
x_pos = fig_width - im.shape[1] - 50 ## 50 pixels from the right edge
add_image_overlay(fig, 'logo2.png', x_pos=x_pos, y_pos=50, alpha=0.6)
## Display the plot
plt.tight_layout()
plt.show()
このコードは正弦波を示す折れ線グラフを作成し、グラフの右下隅に Matplotlib のロゴを追加します。
- Shift + Enter を押してセルを実行します。
出力には、正弦波の折れ線グラフが表示され、右下隅に 60% の不透明度で Matplotlib のロゴがオーバーレイされているはずです。
これらの例は、add_image_overlay 関数を使用して異なるタイプのグラフに簡単に画像をオーバーレイできることを示しており、ビジュアライゼーションをカスタマイズするための汎用的なツールとなっています。
まとめ
このチュートリアルでは、Matplotlib のグラフ上に画像をオーバーレイして、透かし、ロゴ、またはその他の視覚要素を作成し、ビジュアライゼーションを強化する方法を学びました。以下に、このチュートリアルでカバーした内容のまとめを示します。
- ライブラリのインポート:Matplotlib のグラフと画像を扱うために必要なライブラリをインポートする方法から始めました。
- 画像の読み込みと調査:
imread関数を使用して画像を読み込み、そのプロパティを調べる方法を学びました。 - ベースグラフの作成:画像をオーバーレイするための基礎となる、さまざまなタイプのグラフ(棒グラフ、散布図、折れ線グラフ)を作成しました。
- 画像のオーバーレイ:
figimageメソッドを使用して画像をグラフ上に配置し、その位置、透明度、描画順序を制御しました。 - 再利用可能な関数の作成:任意の Matplotlib の図に画像をオーバーレイするのを簡単にするための再利用可能な関数を開発しました。
このチュートリアルで学んだスキルは、以下の用途に適用できます。
- 著作権保護のためにグラフに透かしを追加する
- ビジュアライゼーションにブランディング用のロゴを含める
- 美しいグラフのためのカスタム背景要素を作成する
- プレゼンテーションやレポート用に画像とデータビジュアライゼーションを組み合わせる
異なるタイプのグラフ、画像、位置、透明度レベルを使って実験を続けることで、特定のニーズに合った独自でプロフェッショナルな見た目のビジュアライゼーションを作成することができます。