はじめに
データの可視化において、外れ値(アウトライヤー)を扱う際にはしばしば課題が生じます。これらの極端な値は、大部分のデータポイントを圧縮し、重要なパターンや詳細を観察することを困難にします。破線軸グラフ(ブロークンアクシスプロット)は、軸を「切断」して異なる値の範囲を表示することで、エレガントな解決策を提供します。これにより、主なデータ分布と外れ値の両方に同時に注目することができます。
このチュートリアルでは、Python の Matplotlib を使用して破線軸グラフを作成する方法を学びます。この手法は、値に大きな差があるデータセットを可視化する際に特に有用で、通常のデータと極端な値の両方をより明確に表現することができます。
VM のヒント
VM の起動が完了したら、左上隅をクリックして Notebook タブに切り替え、Jupyter Notebook を開いて練習を行ってください。

Jupyter Notebook の読み込みが完了するまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
この実験中に何か問題が発生した場合は、いつでも Labby に支援を求めてください。セッション終了後にフィードバックを提供していただければ、あなたが経験した問題を迅速に解決することができます。
環境の準備とデータの作成
最初のステップでは、必要なライブラリをインポートして作業環境をセットアップし、可視化用のサンプルデータを作成します。外れ値(アウトライヤー)を含むデータを生成し、破線軸グラフ(ブロークンアクシスプロット)の有用性を実証します。
必要なライブラリのインポート
まず、このチュートリアルで必要なライブラリをインポートしましょう。可視化には Matplotlib を、数値データの生成と操作には NumPy を使用します。
Jupyter Notebook で新しいセルを作成し、以下のコードを入力します。
import matplotlib.pyplot as plt
import numpy as np
print(f"NumPy version: {np.__version__}")
このセルを実行すると、以下のような出力が表示されるはずです。
NumPy version: 2.0.0

正確なバージョン番号は環境によって異なる場合がありますが、これによりライブラリが正しくインストールされ、使用可能であることが確認できます。
外れ値を含むサンプルデータの生成
次に、外れ値を含むサンプルデータセットを作成しましょう。乱数を生成し、特定の位置に大きな値を意図的に追加して外れ値を作成します。
新しいセルを作成し、以下のコードを追加します。
## Set random seed for reproducibility
np.random.seed(19680801)
## Generate 30 random points with values between 0 and 0.2
pts = np.random.rand(30) * 0.2
## Add 0.8 to two specific points to create outliers
pts[[3, 14]] += 0.8
## Display the first few data points to understand our dataset
print("First 10 data points:")
print(pts[:10])
print("\nData points containing outliers:")
print(pts[[3, 14]])
このセルを実行すると、以下のような出力が表示されるはずです。
First 10 data points:
[0.01182225 0.11765474 0.07404329 0.91088185 0.10502995 0.11190702
0.14047499 0.01060192 0.15226977 0.06145634]
Data points containing outliers:
[0.91088185 0.97360754]
この出力から、インデックス 3 と 14 の値が他の値よりもはるかに大きいことが明らかです。これらが外れ値です。ほとんどのデータポイントは 0.2 未満ですが、この 2 つの外れ値は 0.9 を超えており、データセットに大きな差異が生じています。
このようなデータ分布は、破線軸グラフの有用性を実証するのに最適です。次のステップでは、グラフの構造を作成し、メインデータと外れ値の両方を適切に表示するように設定します。
破線軸グラフの作成と設定
このステップでは、実際の破線軸グラフ(ブロークンアクシスプロット)の構造を作成します。破線軸グラフは、同じデータの異なる範囲を表示する複数のサブプロットで構成されます。これらのサブプロットを設定して、メインデータと外れ値(アウトライヤー)を効果的に表示します。
サブプロットの作成
まず、垂直に配置された 2 つのサブプロットを作成する必要があります。上部のサブプロットは外れ値を表示し、下部のサブプロットは大部分のデータポイントを表示します。
ノートブックで新しいセルを作成し、以下のコードを追加します。
## Create two subplots stacked vertically with shared x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6))
## Add a main title to the figure
fig.suptitle('Broken Axis Plot Example', fontsize=16)
## Plot the same data on both axes
ax1.plot(pts, 'o-', color='blue')
ax2.plot(pts, 'o-', color='blue')
## Display the figure to see both subplots
plt.tight_layout()
plt.show()

このセルを実行すると、同じデータを表示する 2 つのサブプロットがある図が表示されるはずです。両方のプロットで外れ値が残りのデータを圧縮し、大部分のデータポイントの詳細が見えにくくなっていることに注意してください。これが破線軸グラフで解決しようとしている問題です。
Y 軸の範囲を設定する
次に、各サブプロットを特定の y 値の範囲に焦点を合わせるように設定する必要があります。上部のサブプロットは外れ値の範囲に焦点を合わせ、下部のサブプロットはメインデータの範囲に焦点を合わせます。
新しいセルを作成し、以下のコードを追加します。
## Create two subplots stacked vertically with shared x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6))
## Plot the same data on both axes
ax1.plot(pts, 'o-', color='blue')
ax2.plot(pts, 'o-', color='blue')
## Set y-axis limits for each subplot
ax1.set_ylim(0.78, 1.0) ## Top subplot shows only the outliers
ax2.set_ylim(0, 0.22) ## Bottom subplot shows only the main data
## Add a title to each subplot
ax1.set_title('Outlier Region')
ax2.set_title('Main Data Region')
## Display the figure with adjusted y-axis limits
plt.tight_layout()
plt.show()
このセルを実行すると、各サブプロットが異なる y 値の範囲に焦点を合わせていることがわかります。上部のプロットは外れ値のみを表示し、下部のプロットはメインデータのみを表示します。これで可視化が改善されましたが、適切な破線軸グラフにするには、さらにいくつかの設定を追加する必要があります。
軸の枠線を隠し、目盛りを調整する
「破線」の軸の錯覚を作り出すために、2 つのサブプロット間の接続する軸の枠線(スパイン)を隠し、目盛りの位置を調整する必要があります。
新しいセルを作成し、以下のコードを追加します。
## Create two subplots stacked vertically with shared x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6))
## Plot the same data on both axes
ax1.plot(pts, 'o-', color='blue')
ax2.plot(pts, 'o-', color='blue')
## Set y-axis limits for each subplot
ax1.set_ylim(0.78, 1.0) ## Top subplot shows only the outliers
ax2.set_ylim(0, 0.22) ## Bottom subplot shows only the main data
## Hide the spines between ax1 and ax2
ax1.spines.bottom.set_visible(False)
ax2.spines.top.set_visible(False)
## Adjust the position of the ticks
ax1.xaxis.tick_top() ## Move x-axis ticks to the top
ax1.tick_params(labeltop=False) ## Hide x-axis tick labels at the top
ax2.xaxis.tick_bottom() ## Keep x-axis ticks at the bottom
## Add labels to the plot
ax2.set_xlabel('Data Point Index')
ax2.set_ylabel('Value')
ax1.set_ylabel('Value')
plt.tight_layout()
plt.show()
このセルを実行すると、2 つのサブプロット間の軸の枠線が隠され、よりクリーンな外観になっていることがわかります。x 軸の目盛りは正しく配置され、ラベルは下部にのみ表示されます。
この時点で、基本的な破線軸グラフを成功裏に作成しました。次のステップでは、軸が破線になっていることを視聴者に明確に伝えるための仕上げを行います。
破線軸グラフの仕上げ
この最後のステップでは、破線軸グラフ(ブロークンアクシスプロット)に仕上げを加え、y 軸が破線になっていることを明確にします。サブプロット間に斜線を追加して破線部分を示し、適切なラベルとグリッドを追加してグラフの全体的な外観を改善します。
斜線の破線を追加する
軸が破線になっていることを視覚的に示すために、2 つのサブプロット間に斜線を追加します。これは、軸の一部が省略されていることを視聴者に理解させるための一般的な慣習です。
新しいセルを作成し、以下のコードを追加します。
## Create two subplots stacked vertically with shared x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6))
## Plot the same data on both axes
ax1.plot(pts, 'o-', color='blue')
ax2.plot(pts, 'o-', color='blue')
## Set y-axis limits for each subplot
ax1.set_ylim(0.78, 1.0) ## Top subplot shows only the outliers
ax2.set_ylim(0, 0.22) ## Bottom subplot shows only the main data
## Hide the spines between ax1 and ax2
ax1.spines.bottom.set_visible(False)
ax2.spines.top.set_visible(False)
## Adjust the position of the ticks
ax1.xaxis.tick_top() ## Move x-axis ticks to the top
ax1.tick_params(labeltop=False) ## Hide x-axis tick labels at the top
ax2.xaxis.tick_bottom() ## Keep x-axis ticks at the bottom
## Add diagonal break lines
d = 0.5 ## proportion of vertical to horizontal extent of the slanted line
kwargs = dict(marker=[(-1, -d), (1, d)], markersize=12,
linestyle='none', color='k', mec='k', mew=1, clip_on=False)
ax1.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs)
ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs)
## Add labels and a title
ax2.set_xlabel('Data Point Index')
ax2.set_ylabel('Value')
ax1.set_ylabel('Value')
fig.suptitle('Dataset with Outliers', fontsize=16)
## Add a grid to both subplots for better readability
ax1.grid(True, linestyle='--', alpha=0.7)
ax2.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt.subplots_adjust(hspace=0.1) ## Adjust the space between subplots
plt.show()
このセルを実行すると、y 軸の破線部分を示す斜線が付いた完全な破線軸グラフが表示されるはずです。グラフにはタイトル、軸ラベル、グリッド線が追加され、読みやすさが向上しています。
破線軸グラフの理解
破線軸グラフの主要な構成要素を理解するために少し時間を取りましょう。
- 2 つのサブプロット:異なる y 値の範囲に焦点を合わせた 2 つの別々のサブプロットを作成しました。
- 隠された軸の枠線:サブプロット間の接続する軸の枠線(スパイン)を隠して、視覚的な分離を作成しました。
- 斜線の破線:軸が破線になっていることを示すために斜線を追加しました。
- Y 軸の範囲:各サブプロットに異なる y 軸の範囲を設定して、データの特定の部分に焦点を合わせました。
- グリッド線:読みやすさを向上させ、値を推定しやすくするためにグリッド線を追加しました。
この手法は、データに外れ値(アウトライヤー)があり、それが大部分のデータポイントの可視化を圧縮してしまう場合に特に有用です。軸を「破線」にすることで、外れ値とメインのデータ分布の両方を 1 つの図で明確に表示できます。
グラフを試す
破線軸グラフの作成方法がわかったので、さまざまな設定を試すことができます。y 軸の範囲を変更したり、グラフにさらに機能を追加したり、この手法を自分のデータに適用したりしてみてください。
たとえば、前のコードを変更して凡例を追加したり、配色を変更したり、マーカーのスタイルを調整したりできます。
## Create two subplots stacked vertically with shared x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6))
## Plot the same data on both axes with different styles
ax1.plot(pts, 'o-', color='darkblue', label='Data Points', linewidth=2)
ax2.plot(pts, 'o-', color='darkblue', linewidth=2)
## Mark the outliers with a different color
outlier_indices = [3, 14]
ax1.plot(outlier_indices, pts[outlier_indices], 'ro', markersize=8, label='Outliers')
## Set y-axis limits for each subplot
ax1.set_ylim(0.78, 1.0) ## Top subplot shows only the outliers
ax2.set_ylim(0, 0.22) ## Bottom subplot shows only the main data
## Hide the spines between ax1 and ax2
ax1.spines.bottom.set_visible(False)
ax2.spines.top.set_visible(False)
## Adjust the position of the ticks
ax1.xaxis.tick_top() ## Move x-axis ticks to the top
ax1.tick_params(labeltop=False) ## Hide x-axis tick labels at the top
ax2.xaxis.tick_bottom() ## Keep x-axis ticks at the bottom
## Add diagonal break lines
d = 0.5 ## proportion of vertical to horizontal extent of the slanted line
kwargs = dict(marker=[(-1, -d), (1, d)], markersize=12,
linestyle='none', color='k', mec='k', mew=1, clip_on=False)
ax1.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs)
ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs)
## Add labels and a title
ax2.set_xlabel('Data Point Index')
ax2.set_ylabel('Value')
ax1.set_ylabel('Value')
fig.suptitle('Dataset with Outliers - Enhanced Visualization', fontsize=16)
## Add a grid to both subplots for better readability
ax1.grid(True, linestyle='--', alpha=0.7)
ax2.grid(True, linestyle='--', alpha=0.7)
## Add a legend to the top subplot
ax1.legend(loc='upper right')
plt.tight_layout()
plt.subplots_adjust(hspace=0.1) ## Adjust the space between subplots
plt.show()
この拡張されたコードを実行すると、外れ値が特別にマークされ、データポイントを説明する凡例が付いた改善された可視化が表示されるはずです。
おめでとうございます!Matplotlib を使用して Python で破線軸グラフを成功裏に作成しました。この手法は、外れ値を含むデータを扱う際に、より効果的な可視化を作成するのに役立ちます。
まとめ
このチュートリアルでは、Python の Matplotlib を使用して破線軸グラフ(ブロークンアクシスプロット)を作成する方法を学びました。この可視化手法は、外れ値(アウトライヤー)を含むデータを扱う際に非常に有用で、メインのデータ分布と外れ値の両方を 1 つの図で明確に表示できます。
以下は、あなたが達成したことのまとめです。
- 環境設定とデータ作成:必要なライブラリをインポートし、外れ値を含むサンプルデータを作成して概念を実証しました。
- 基本的なグラフ構造の作成:異なる y 軸の範囲に焦点を合わせるために、異なる y 軸の範囲を持つ 2 つのサブプロットを作成し、軸の外観を設定しました。
- 可視化の強化:破線軸を示すために斜線の破線を追加し、ラベルとグリッドでグラフの外観を改善し、可視化をさらにカスタマイズする方法を学びました。
破線軸手法は、外れ値が通常では大部分のデータポイントの可視化を圧縮してしまう場合でも、視聴者がデータセットの全体構造と詳細を同時に見ることができるようにすることで、一般的なデータ可視化の問題を解決します。
この手法は、値の範囲が大きく異なるデータを明確かつ効果的に表現する必要があるときに、独自のデータ分析と可視化タスクに適用できます。