Как получить реальное положение оси в режиме компоновки с ограниченным доступом matplotlib - PullRequest
0 голосов
/ 08 февраля 2019

Я создал (2x3) подсюжеты и ввел их в constrained_layout=True, используя приведенный ниже код.Я хочу скрыть ax03 и создал другие фигуры в этом регионе.Для выравнивания я использовал ax.get_position, чтобы получить позицию оси ax03, и add_axes(), чтобы создать новую ось.Но похоже, что он НЕ выровнен, как ожидалось.Из моих наблюдений get_position() возвращает положение оси до переназначения макета.

Примечание: если я выполню код в двух разделах, я, конечно, смогу получить его.Я хочу добиться этого в одном исполнении.

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,9000000000000001, y1 = 0,88) Bbox (x0 = 0,6720588235294118, y0 = 0,53, x1 = 0,9000000000000001, 101 = 0,80 * 101 * 0,8 * 0,88), 101 = 0,8 **enter image description here

Если выполнить раздел 1, а затем раздел 2, я получу:

Bbox (x0 = 0,7209572530864197, y0 = 0,5704676577986438, x1 = 0,9728583333333332, y1= 0,9773075117370893) Bbox (x0 = 0,7209572530864197, y0 = 0,5704676577986438, x1 = 0,9728583333333332, y1 = 0,9773075117370893)

Если отключить ограничение с ограничением_лайнов:0,53, х1 = 0,9000000000000001, у1 = 0,88) Bbox (х0 = 0,6720588235294118, у0 = 0,53, х1 = 0,9000000000000001, у1 = 0,88)

Положение выше То же при constrained_layout=False

Как получить позицию ax03 нового макета в одном исполнении?

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Ограниченная компоновка будет выполняться при каждом рисовании фигуры.Следовательно, вам нужно сначала нарисовать фигуру, а затем вы можете получить фактическое положение осей внутри нее.

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

0 голосов
/ 09 февраля 2019
import matplotlib.pyplot as plt
fig, axs  = plt.subplots(2, 3, constrained_layout=True)

gs = axs[0, -1].get_gridspec()
axs[0, -1].remove()

gs2 = gs[0, -1].subgridspec(3, 3)
for i in range(3):
    for j in range(3):
        fig.add_subplot(gs2[i, j])
plt.show()

дает мне:

enter image description here

Требуется 0,95 с без ограниченного размещения и 1,3 с с ограниченным расположением на моей машине.

0 голосов
/ 08 февраля 2019

Вы получили позицию ax03, и позиция верна.Причина, по которой вы получаете ту же позицию, заключается в том, что вы устанавливаете позицию ax в ту же позицию, что и ax03.

width = pos.x1 - pos.x0
height = pos.y1 - pos.y0

. Получается ширина и высота ax03. * 1008.*

ax = fig.add_axes([pos.x0, pos.y0, width, height])

Создается новая фигура с такими же x0, y0, width и height как ax03.Они в одном месте.Печать позиций подтверждает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...