[matplotlib] 5. 軸の一部を省略したグラフ(broken axis graph)

matplotlib

はじめに

本記事では、matplotlibを使用して軸の一部を省略したグラフ(broken axis graph)の作成方法について解説します。このテクニックを習得することで、幅広いスケールのデータを一つのグラフで効果的に表現できるようになります。

broken axis graphとは

broken axis graph(軸の一部を省略したグラフ)は、データ値の範囲に大きな差がある場合に特に役立つグラフ表現手法です。例えば、ほとんどのデータが小さい値の範囲に集中しているが、一部の外れ値が非常に大きい場合などに使用します。

コード

解説

モジュールのインポート

バージョン

データの生成

numpy.random.rand(30)で0以上1未満の乱数を30個生成し、0.1を掛けることで0〜0.1の範囲の値にしています。pts[13:16] *= 200では13〜15番目の要素に200を掛けて大きな値に変換しています。

グラフの設定とプロット

fig, (ax, ax2) = plt.subplots(2, 1, sharex=True)コマンドでfigを作成し、axとax2のサブプロットを縦に配置します。sharex=Trueパラメータにより、両方のグラフでx軸の設定が共有されます。 この構成により、数値の大きいデータを上のグラフ(ax)に、数値の小さいデータを下のグラフ(ax2)に表示できます。

ax.plot(pts,’go-‘)とax2.plot(pts,’go-‘)で、上下両方のグラフに同じデータ(pts)を緑色の丸と線でプロットします。

y軸範囲の設定

上のaxのグラフは、ax.set_ylim(1,np.max(pts)+1) とし、1〜ptsの最大値に+1した範囲で表示します。
下のax2のグラフは、ax2.set_ylim(0, .12) なので、0〜0.12の範囲で表示します。

グラフの枠と目盛りの設定

グラフ枠は上下左右それぞれが、ax.Spinesの[‘top’]、[‘bottom’]、[‘left’]、[‘right’]で設定できます。ここでは、上のグラフ(ax)の下枠線と下のグラフ(ax2)の上枠線を.set_visible(False)で非表示にしています。
ax.xaxis.tick_top()を使って上のグラフの上枠線に目盛りを表示し、ax.tick_params(labeltop=False)で目盛りのラベルを非表示にしています。
ax2.xaxis.tick_bottom()で下のグラフ(ax2)の下枠線に目盛りを表示しています。

軸省略線の設定

transform=ax.transAxesパラメータにより、座標範囲を左下(0, 0)、右上(1, 1)の相対位置で指定できます。color=’k’で黒色、lw=3で線幅3の線を描画します。clip_on=Falseを設定することで、グラフの枠線からはみ出た部分も表示されるようになります。
ax.plot((-d, +d), (0, 0), **kwargs)で上部グラフ(ax)の左下に省略線を、

ax.plot((1 - d, 1 + d), (0, 0), **kwargs)

で右下に省略線を描画します。

同様に下のグラフ(ax2)についても省略線を左上と右上に表示します。

グラフの保存

“broken_axis_scatter.png”はファイル名であり、dpi=100は画像解像度の設定です。transparent=Falseは背景を透過させないようにし、bbox_inches=’tight’はラベルなどが画像から見切れないようにするパラメータです。

棒グラフの場合

省略線の設定

棒グラフでは、省略線を図全体に表示する設定とします。

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

まとめ

broken axis graphは、大きく異なるスケールのデータを一つのグラフで効果的に表現するための強力なテクニックです。matplotlibを使用することで、このようなグラフを柔軟にカスタマイズして作成できます。データの特性を考慮し、適切な場面で活用することで、より分かりやすいデータ可視化が実現できるでしょう。

参考

Broken axis — Matplotlib 3.10.5 documentation
matplotlibでマーカーを枠線より上に表示する - Qiita
デモ Before After 方法 plotに、clip_on=Falseを追加。 demo.py import numpy as np import matplotlib.pyplot as plt x = np.arange(4) y...
Is there a way to make a discontinuous axis in Matplotlib?
I'm trying to create a plot using pyplot that has a discontinuous x-axis. The usual way this is drawn is that the axis w...

コメント