1. ホーム
  2. python

[解決済み] twinx使用時のアスペクト比を定義する

2022-02-15 11:10:11

質問事項

を使用したプロットのアスペクト比はどのように設定すればよいのでしょうか? twinx ?


以下に、3つの例を示します。

  1. なし twinx アスペクト比をどのように設定したかを強調するために
  2. だけで twinx で、以前に定義されたアスペクト比がどのようにリセットされるかを説明します。
  3. の両方に対してアスペクト比を定義しようとしたのです。 y -軸を使用しながら twinx (これは機能しません)

matplotlib 1.3.0を使用しています。
次のスクリプトは、単純なプロットのアスペクト比を設定する方法を説明するものです。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,1.6,50) + 50.0

fig = plt.figure()

ax = fig.add_subplot(111)

XLIM = [50.0, 51.6]
YLIM = [0.0, 1.1, 0.0, 11.0] 

ax.plot(x,np.sin(x-50.0),'b')

ax.set_xlim([XLIM[0], XLIM[1]])
ax.set_ylim([YLIM[0], YLIM[1]])

ax.set_xticks(np.arange(XLIM[0], XLIM[1], 0.2))
ax.set_yticks(np.arange(YLIM[0], YLIM[1]+0.1, 0.1)[:-1])

ax.grid(True,which='major',linestyle='solid')

ax.set_aspect((XLIM[1]-XLIM[0])/(YLIM[1]-YLIM[0]))

plt.show()

これが生成する図は、定義されたアスペクト比を持っています。

しかし、さらに y -軸を使用し twinx() 関数を使用すると、アスペクト比がリセットされます。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,1.6,50) + 50.0

fig = plt.figure()

ax = fig.add_subplot(111)
ax2 = ax.twinx()

XLIM = [50.0, 51.6]
YLIM = [0.0, 1.1, 0.0, 11.0] 

ax.plot(x,np.sin(x-50.0),'b')

ax.set_xlim([XLIM[0], XLIM[1]])
ax.set_ylim([YLIM[0], YLIM[1]])

ax.set_xticks(np.arange(XLIM[0], XLIM[1], 0.2))
ax.set_yticks(np.arange(YLIM[0], YLIM[1]+0.1, 0.1)[:-1])

ax.grid(True,which='major',linestyle='solid')

ax.set_aspect((XLIM[1]-XLIM[0])/(YLIM[1]-YLIM[0]))

plt.show()

その結果、このような図になります(この図では、以前に定義された y -の制限がリセットされます)。

ここで、再度アスペクト比を指定してみても、期待した結果は得られません。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,1.6,50) + 50.0

fig = plt.figure()

ax = fig.add_subplot(111)
ax2 = ax.twinx()

XLIM = [50.0, 51.6]
YLIM = [0.0, 1.1, 0.0, 11.0] 

ax.plot(x,np.sin(x-50.0),'b')
ax2.plot(x,np.cos(x-50.0)*10.,'r')

ax.set_xlim([XLIM[0], XLIM[1]])
ax.set_ylim([YLIM[0], YLIM[1]])
ax2.set_ylim([YLIM[2], YLIM[3]])

ax.set_xticks(np.arange(XLIM[0], XLIM[1], 0.2))
ax.set_yticks(np.arange(YLIM[0], YLIM[1]+0.1, 0.1)[:-1])
ax2.set_yticks(np.arange(YLIM[2], YLIM[3]+1.0, 1.0))

ax.grid(True,which='major',linestyle='solid')

ax.set_aspect((XLIM[1]-XLIM[0])/(YLIM[1]-YLIM[0]))
ax2.set_aspect((XLIM[1]-XLIM[0])/(YLIM[3]-YLIM[2]))

plt.show()

これで生成されます。

最初のプロットのようなプロットを生成するには、何が足りないのでしょうか。 y -軸のスケールは?を使用する場合、アスペクト比はどのように定義するのですか? twinx ?

解決方法は?

をご覧ください。 adjustable 軸のパラメータです。 これは、アスペクト/リミットが変更されたときに、データのリミットや外接矩形の形状が変更されるかどうかを制御します。

通常、オプションは "box""datalim" しかし、共有軸の場合は特別なケースがあります。 あなたの場合 adjustable='box-forced' .

簡単な例として(勝手に少し簡略化してみました、ご自由にお使いください)、別の set_foo メソッドの方がわかりやすい場合は、そちらをご利用ください。 その方法を取る場合、メソッドは ax.set_adjustable .):

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,1.6,50) + 50.0

fig, ax = plt.subplots()
ax2 = ax.twinx()

XLIM = [50.0, 51.6]
YLIM = [0.0, 1.1, 0.0, 11.0]

ax.plot(x,np.sin(x-50.0),'b')
ax2.plot(x,np.cos(x-50.0)*10.,'r')

ax.set(adjustable='box-forced',
       xlim=XLIM, ylim=YLIM[:2],
       xticks=np.arange(XLIM[0], XLIM[1], 0.2),
       yticks=np.arange(YLIM[0], YLIM[1]+0.1, 0.1)[:-1],
       aspect=(XLIM[1]-XLIM[0])/(YLIM[1]-YLIM[0]))

ax2.set(adjustable='box-forced',
        ylim=YLIM[2:],
        yticks=np.arange(YLIM[2], YLIM[3]+1.0, 1.0),
        aspect=(XLIM[1]-XLIM[0])/(YLIM[3]-YLIM[2]))

ax.grid(True, which='major',linestyle='solid')

plt.show()

<イグ