我正在编写一个 Python 脚本来显示音高分析的结果。我已将第一个轴配对并提供了一个自定义代码,因此我可以查看 Hz 和 Pitch 的结果。基于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 值是来自配对轴的 Y 值ax2
,而不是来自第一个轴的 Y 值。
右下角给出的 Y 值是ax2
's给出的值ticker.FuncFormatter
,我找不到一种方法让它显示ax1
's 值,以便f0
显示以 Hz 为单位的值。
我发现一种可能的解决方案是在 上画线和三角形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 值?