You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matplotlib中实现Y轴均匀刻度并标注音符名称

解决Matplotlib音高数据Y轴刻度间距不均问题

问题背景

尝试用Matplotlib绘制音高数据,计划将Y轴的频率数值替换为对应音符名称,但绘制后Y轴刻度间距严重不均——低频音符标签挤在一起,高频标签间距过大,无法清晰展示。

问题原因

音符频率遵循十二平均律,是指数增长的(55 * 2^(i/12)),而Matplotlib默认Y轴为线性刻度,直接将指数分布的频率值作为刻度位置,必然导致刻度间距随频率增大而越来越宽。

解决方案

将Y轴切换为对数刻度,让指数增长的频率转换为线性分布,从而实现均匀的刻度间距。具体修改步骤:

  • 设置Y轴为对数刻度:ax.set_yscale('log')
  • 调整Y轴范围,确保所有音符频率都在显示范围内
  • 关闭Y轴次要刻度,避免多余刻度干扰
  • 重新绑定刻度位置与音符名称标签

修改后的完整代码

import matplotlib.pyplot as plt
import numpy as np

# 生成十二平均律对应的频率(从A1到G#6,共60个音符)
note_frequency = [55 * 2**(i/12) for i in range(60)]

# 对应的音符名称
note_name = [
    'A1', 'A#1', 'B1', 'C2', 'C#2', 'D2', 'D#2', 'E2', 'F2', 'F#2', 'G2', 'G#2',
    'A2', 'A#2', 'B2', 'C3', 'C#3', 'D3', 'D#3', 'E3', 'F3', 'F#3', 'G3', 'G#3',
    'A3', 'A#3', 'B3', 'C4', 'C#4', 'D4', 'D#4', 'E4', 'F4', 'F#4', 'G4', 'G#4',
    'A4', 'A#4', 'B4', 'C5', 'C#5', 'D5', 'D#5', 'E5', 'F5', 'F#5', 'G5', 'G#5',
    'A5', 'A#5', 'B5', 'C6', 'C#6', 'D6', 'D#6', 'E6', 'F6', 'F#6', 'G6', 'G#6',
]

test_data = [120, 500, 120, 440, 860, 550, 80, 160, 250, 300, 600, 589, 456, 151, 987, 1600]

fig, ax = plt.subplots()

# 核心修改:设置Y轴为对数刻度
ax.set_yscale('log')
# 设置Y轴范围,匹配生成的频率区间,避免边缘刻度被截断
ax.set_ylim(note_frequency[0] * 0.9, note_frequency[-1] * 1.1)
# 关闭次要刻度,避免对数刻度自带的小刻度干扰音符标签显示
ax.yaxis.set_minor_locator(plt.NullLocator())

# 绑定刻度位置与对应的音符名称
ax.yaxis.set_ticks(note_frequency)
ax.yaxis.set_ticklabels(note_name)

ax.plot(test_data)
plt.show()

效果说明

修改后,Y轴的音符标签会均匀分布,每个音符对应的频率在对数刻度上间隔一致,既能清晰展示音符名称,也能准确反映数据对应的音高位置。

内容的提问来源于stack exchange,提问作者William

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:45:34