Axes.invert_axis() не работает с sharey=True для подграфиков matplotlib

Я пытаюсь сделать 4 подзаголовка (2x2) с перевернутой осью y, а также разделить ось y между подзаговорами. Вот что я получаю:

import matplotlib.pyplot as plt
import numpy as np

fig,AX = plt.subplots(2, 2, sharex=True, sharey=True)

for ax in AX.flatten():
    ax.invert_yaxis()
    ax.plot(range(10), np.random.random(10))

введите здесь описание изображения

Похоже, что ax.invert_axis() игнорируется, когда sharey=True. Если я устанавливаю sharey=False, я получаю перевернутую ось y на всех подграфиках, но, очевидно, ось y больше не используется среди подграфиков. Я что-то не так делаю, это баг или нет смысла делать что-то подобное?


person pbreach    schedule 25.01.2015    source источник


Ответы (1)


Поскольку вы установили sharey=True, все три оси теперь ведут себя так, как если бы они были одной. Например, когда вы инвертируете один из них, вы влияете на все четыре. Проблема заключается в том, что вы инвертируете оси в цикле for, который проходит через итерацию длины четыре, таким образом, вы инвертируете ВСЕ оси четное количество раз... Инвертируя уже перевернутый топор, вы просто восстанавливаете его исходный ориентация. Вместо этого попробуйте использовать нечетное количество подграфиков, и вы увидите, что оси успешно инвертированы.

Чтобы решить вашу проблему, вы должны инвертировать ось Y одного отдельного участка (и только один раз). Следующий код работает для меня:

import matplotlib.pyplot as plt
import numpy as np

fig,AX = plt.subplots(2, 2, sharex=True, sharey=True)

## access upper left subplot and invert it    
AX[0,0].invert_yaxis()

for ax in AX.flatten():
    ax.plot(range(10), np.random.random(10))

plt.show()
person snake_charmer    schedule 25.01.2015