問題

私は(2x3)サブプロットを作成し、以下のコードを使用してconstrained_layout=Trueでそれらを強制しました。私はax03を非表示にし、その地域に他の数字を作成したい。整列目的のために、私はax.get_positionを使ってax03の軸の位置を取得し、add_axes()を使って新しい軸を作成しました。しかし、それは期待どおりに整列していないようです。私の観察から、get_position()はレイアウトの再スケジュール前に軸の位置を返します。

注:2つのセクションでコードを実行すると、もちろん位置を取得できます。私は1つの実行でそれを実行したい。

 import matploltib.pyplot as plt

# Section 1
fig, axes = plt.subplots(2, 3, figsize=(7.2, 7.2/1.68), constrained_layout=True)
axes = axes.ravel()
ax01 = axes[0]
ax02 = axes[1]
ax03 = axes[2]
ax11 = axes[3]
ax12 = axes[4]
ax13 = axes[5]

# Section 2
pos = ax03.get_position() # get the original position
width = pos.x1 - pos.x0
height = pos.y1 - pos.y0


print(ax03.get_position())
ax = fig.add_axes([pos.x0, pos.y0, width, height])
print(ax.get_position())    
# it seems the position of ax is the postion before constrained is applied.
 

セクション1とセクション2を一緒に実行すると、次のようになります。位置情報:

bbox(x0 = 0.6720588235294118、y0 = 0.53、x1 = 0.9000000000000000001、y1 = 0.88) bbox(x0 = 0.6720588235294118、y0 = 0.53、x1 = 0.9000000000000000001、y1 = 0.88)

enter image description here

セクション1を実行してからセクション2を実行すると、次のようになります。

bbox(x0 = 0.7209572530864197、y0 = 0.5704676577986438、x1 = 0.9728583333333332、y1 = 0.97773075117370893) bbox(x0 = 0.7209572530864197、y0 = 0.5704676577986438、x1 = 0.9728583333333332、y1 = 0.97773075117370893)

制約付き_layoutをオフにすると:

 fig, axes = plt.subplots(2, 3, figsize=(7.2, 7.2/1.68), 
constrained_layout=False)
axes = axes.ravel()
ax01 = axes[0]
ax02 = axes[1]
ax03 = axes[2]
ax11 = axes[3]
ax12 = axes[4]
ax13 = axes[5]
ax03.axis('off')

pos = ax03.get_position() # get the original position
width = pos.x1 - pos.x0
height = pos.y1 - pos.y0

print(ax03.get_position())
ax10 = fig.add_axes([pos.x0, pos.y0, width, height])
print(ax10.get_position())  
 

bbox(x0 = 0.6720588235294118、y0 = 0.53、x1 = 0.9000000000000000001、y1 = 0.88) bbox(x0 = 0.6720588235294118、y0 = 0.53、x1 = 0.9000000000000000001、y1 = 0.88)

上記の位置は、constrained_layout=False

1つの実行で新しいレイアウトのax03の位置を取得するにはどうすればよいですか?

  ベストアンサー

制約付きレイアウトは、図が描画されるたびに有効になります。したがって、図を最初に描画する必要があり、その中の軸の実際の位置を取得できます。

 import matplotlib.pyplot as plt

fig, ((ax01, ax02, ax03),(ax11, ax12, ax13)) = plt.subplots(2, 3, figsize=(7.2, 7.2/1.68), 
                                                            constrained_layout=True)
# draw the figure to apply constrained_layout
fig.canvas.draw()

# Section 2
pos = ax03.get_position() # get the original position
print(pos)
ax = fig.add_axes([pos.x0, pos.y0, pos.width, pos.height])
print(ax.get_position())    

plt.show()
 

enter image description here

ただし、図のサイズを再度変更すると、位置が再び間違ってしまうことに注意してください。だから問題は、なぜその位置があなたにとって重要なのですか?目的が既存の軸の上に新しい軸を作成することであれば、同じ既存のグリッドの同じ位置に置くことになります。次のように

 import matplotlib.pyplot as plt

fig, ((ax01, ax02, ax03),(ax11, ax12, ax13)) = plt.subplots(2, 3, figsize=(7.2, 7.2/1.68), 
                                                            constrained_layout=True)

gs = ax03.get_gridspec()
ax = fig.add_subplot(gs[0,2], label="new_axes")

plt.show()
 

次に、constrained_layoutもその軸に適用され、常に互いの上に置かれます。

enter image description here

  同じタグがついた質問を見る

python-3.xmatplotlib