Как указать окну взаимодействия, какое значение y отображать по двум осям?

Я работаю над сценарием Python, чтобы отобразить результаты анализа музыкального тона. Я сдвинул первую ось и поставил специальный тикер, чтобы я мог просматривать результаты как в Гц, так и в Питче. Соответствующий код, основанный на примере по адресу https://matplotlib.org/2.1.0/gallery/api/two_scales.html:

fig, ax1 = plt.subplots(1,1)
ax1.set_xlabel('time')
ax1.set_ylabel('f0/Hz')

# read and process data, draw green rectangle on ax1... then

ax1.plot(t, f0)

# Make a second y axis with note names on it.
ax2 = ax1.twinx()
ax2.set_ylabel('Pitch')
ax2.set_ylim(ax1.get_ylim())
ax2.yaxis.set_major_locator(PitchTicker(19,numticks=30))
ax2.yaxis.set_major_formatter(ticker.FuncFormatter(lambda f, pos: 
hz_to_tuning19(f)[0]))

# All other code refers to ax1, then...

plt.title('[{}:{}] {}'.format(first,last,title))
fig.tight_layout()
plt.show()

Это работает как хотелось бы, за исключением одного аспекта, который, к сожалению, является серьезной проблемой для конечного пользователя. Когда отображается окно и указатель перемещается по осям, показанное значение Y является значением от сдвоенной оси, ax2не с первого.

Окно взаимодействия с сдвоенными осями: введите описание изображения здесь

Значение Y, указанное в правом нижнем углу, равно ax2"s ticker.FuncFormatterи я не могу найти способ заставить его отображать ax1вместо этого, чтобы значение f0 в Гц отображается.

Я обнаружил, что одним из возможных решений является нарисовать линию и треугольник на ax1затем создайте ax2 и скажи

ax1.yaxis.tick_right()
ax2.yaxis.tick_left()
ax1.yaxis.set_label_position('right')
ax2.yaxis.set_label_position('left')

но это кажется довольно нелогичным и кажется, что оно может сломаться в будущем.

Я пробовал звонить plt.sca(ax1) и даже ax2.set_axisbelow(True) до plt.show() но это ничего не меняет.

Есть ли официальный способ сообщить окну взаимодействия, какие значения X и Y отображать при сообщении о положении мыши?

0 ответов

Другие вопросы по тегам