Matplotlib のボックスアスペクト

PythonPythonBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Matplotlibのset_box_aspect()メソッドを使用してさまざまなプロットを作成するプロセスを案内します。このメソッドは、データの制限に関係なく、物理単位での軸の高さと幅の間のアスペクト比を設定します。これは、含まれるデータに関係なく正方形のプロットを生成するため、または固定された(データ)アスペクトの画像プロットの隣に同じ軸寸法の通常のプロットを作成するために役立ちます。

VMのヒント

VMの起動が完了したら、左上隅をクリックしてノートブックタブに切り替えて、Jupyter Notebookを使用して練習します。

場合によっては、Jupyter Notebookが読み込み終了するまで数秒待つ必要があります。Jupyter Notebookの制限により、操作の検証を自動化することはできません。

学習中に問題に遭遇した場合は、Labbyにお問い合わせください。セッション後にフィードバックを提供してください。そうすれば、迅速に問題を解決します。

データに関係なく正方形の軸を作成する

データの制限がどのようなものであっても、正方形の軸を作成します。

import matplotlib.pyplot as plt
import numpy as np

fig1, ax = plt.subplots()

ax.set_xlim(300, 400)
ax.set_box_aspect(1)

plt.show()

共有の正方形の軸

サイズが正方形になる共有サブプロットを作成します。

fig2, (ax, ax2) = plt.subplots(ncols=2, sharey=True)

ax.plot([1, 5], [0, 10])
ax2.plot([100, 500], [10, 15])

ax.set_box_aspect(1)
ax2.set_box_aspect(1)

plt.show()

正方形の双子の軸

親のボックスアスペクトを引き継ぐ双子の軸を持つ正方形の軸を作成します。

fig3, ax = plt.subplots()

ax2 = ax.twinx()

ax.plot([0, 10])
ax2.plot([12, 10])

ax.set_box_aspect(1)

plt.show()

画像の隣に通常のプロットを作成する

固定されたデータアスペクトと既定のadjustable="box"を持つ画像プロットを通常のプロットの隣に作成する場合、軸の高さが異なります。set_box_aspect()は、通常のプロットの軸に画像の寸法をボックスアスペクトとして使用させることで、この問題を簡単に解決します。この例はまた、固定されたボックスアスペクトと良好に相互作用する「制約付きレイアウト」を示しています。

fig4, (ax, ax2) = plt.subplots(ncols=2, layout="constrained")

np.random.seed(19680801)  ## Fixing random state for reproducibility
im = np.random.rand(16, 27)
ax.imshow(im)

ax2.plot([23, 45])
ax2.set_box_aspect(im.shape[0]/im.shape[1])

plt.show()

正方形の結合/マージナルプロット

結合データのプロットの隣にマージナル分布を表示したい場合があります。次のコードは、マージナル軸のボックスアスペクトがグリッドスペックの幅と高さの比率に等しい正方形のプロットを作成します。これにより、すべての軸が完全に整列し、グラフのサイズに関係なくなります。

fig5, axs = plt.subplots(2, 2, sharex="col", sharey="row",
                         gridspec_kw=dict(height_ratios=[1, 3],
                                          width_ratios=[3, 1]))
axs[0, 1].set_visible(False)
axs[0, 0].set_box_aspect(1/3)
axs[1, 0].set_box_aspect(1)
axs[1, 1].set_box_aspect(3/1)

np.random.seed(19680801)  ## Fixing random state for reproducibility
x, y = np.random.randn(2, 400) * [[.5], [180]]
axs[1, 0].scatter(x, y)
axs[0, 0].hist(x)
axs[1, 1].hist(y, orientation="horizontal")

plt.show()

多数のサブプロットのボックスアスペクト

初期化時にボックスアスペクトをAxesに渡すことができます。次のコードは、すべての正方形のAxesを持つ2×3のサブプロットグリッドを作成します。

fig7, axs = plt.subplots(2, 3, subplot_kw=dict(box_aspect=1),
                         sharex=True, sharey=True, layout="constrained")

for i, ax in enumerate(axs.flat):
    ax.scatter(i % 3, -((i // 3) - 0.5)*200, c=[plt.cm.hsv(i / 6)], s=300)
plt.show()

まとめ

この実験では、Matplotlibのset_box_aspect()を使用して、軸の高さと幅の間の固定アスペクト比を持つさまざまな種類のプロットを作成する方法の概要を示しました。