Дублирование оси Y

У меня есть код ниже. В двух словах, мне нужно продублировать нижние оси x, поэтому я сохраняю уже нанесенные данные (на месте), но меняю xlim. Я попробовал set_xlim после построения данных (просто перенастраивает данные в соответствии с новым масштабом (как и ожидалось); также попытался продублировать ось (с помощью twiny), а затем настроить с помощью нового масштаба (а затем добавить строки с помощью axvline). Ниже способ работает, однако этикетка теперь не прилипает к осям!я думала что-то упустила.

Какие-либо предложения?

import matplotlib.pyplot as plt


plt.plot([1,2,1,4,5],[1,2,3,4,5], marker='o', label='value 1')
plt.plot([3,1,3,1,2],[1,2,3,4,5], label='value 2')

plt.gca().get_xaxis().set_visible(False)

ax1 = plt.twiny()
ax2 = ax1.twiny()


ax1.set_xlabel('TOP')
ax2.set_xlabel('BOTTOM')

plt.savefig(fname='test.png')

plt.show()

Ярлыки расположены не в том месте!

Это очень похоже на этот вопрос (Изменение оси без изменения данных (Python)) , но я использую константу (скажем, от 0 до 750) в качестве исходного графика, а диапазон, который я хочу установить для xlim, несколько не связан с исходными данными (скажем, от 0 до 30000).


person geekscrap    schedule 19.07.2018    source источник
comment
Что именно не так с сюжетом, который вы получаете? Что значит придерживаться осей?   -  person ImportanceOfBeingErnest    schedule 20.07.2018
comment
Метка «НИЖНЯЯ» должна быть внизу, нет? Я только что заметил, что код был не совсем таким, как у меня. Я отредактировал это сейчас. По сути, я сделал второй твини из первого.   -  person geekscrap    schedule 20.07.2018
comment
втыкание с осями как на этикетке должно быть внизу с осями это для   -  person geekscrap    schedule 20.07.2018


Ответы (1)


Обе оси, ax1 и x2, являются сдвоенными. У них есть свой ярлык. (Это может быть неожиданно и действительно может рассматриваться как ошибка.)

При работе с несколькими осями неудобно использовать pyplot напрямую. Вместо этого объектно-ориентированный подход гораздо лучше подходит для того, чтобы убедиться, что вы устанавливаете свойства объекта, который хотите использовать.

Затем идея состоит в том, чтобы установить положение метки вручную set_label_position внизу.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1,2,1,4,5],[1,2,3,4,5], marker='o', label='value 1')
ax.plot([3,1,3,1,2],[1,2,3,4,5], label='value 2')

ax.get_xaxis().set_visible(False)

ax1 = ax.twiny()
ax2 = ax1.twiny()
ax2.xaxis.set_label_position('bottom') 

ax1.set_xlabel('TOP', labelpad=20)
ax2.set_xlabel('BOTTOM', labelpad=20)

plt.show()

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

Также необходимо установить некоторые labelpad (опять же без какой-либо конкретной причины, за исключением, вероятно, того, что никто не задумывается о последствиях создания двойных осей из двойных осей).

person ImportanceOfBeingErnest    schedule 19.07.2018
comment
Это работает (спасибо!), но я все еще немного запутался (однако, как вы говорите, это может быть ошибка), добавьте ax2.set_visible(False) перед plt.show().... Неправильная ось исчезает.. .! Я схожу с ума?! - person geekscrap; 20.07.2018
comment
Да, это то, что я имею в виду, говоря о последствиях создания двойных осей из двойных осей. Обратите внимание, что в будущей версии matplotlib будет secondary_xaxis доступный именно для таких целей. , так что не нужно злоупотреблять twinx, который никогда не предназначался для чего-то подобного. - person ImportanceOfBeingErnest; 20.07.2018
comment
Ага, гениально. Спасибо - person geekscrap; 20.07.2018