Как указать окну взаимодействия, какое значение 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 отображать при сообщении о положении мыши?