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

Matplotlib对数刻度下get_yticks返回值与显示刻度不一致问题

问题原因

你没有操作错误,这是Matplotlib的设计行为:

  • get_yticks()返回的是轴刻度定位器(Locator)生成的全部候选主刻度,不会自动过滤超出坐标轴当前显示范围的数值
  • 只有数值落在坐标轴ylim区间内的刻度,才会被实际渲染到图上,你看到的显示刻度就是这部分过滤后的结果
  • 直接忽略首尾项的方法不可靠,超出显示范围的刻度数量不固定,和轴的显示区间、刻度步长设置都有关系

正确获取实际显示刻度的方法

有两种通用的可靠方案:

方案1:基于轴范围过滤候选刻度

先获取坐标轴的显示范围,再从get_yticks()的返回值中筛选出落在范围内的刻度,可加少量浮点容差避免精度问题:

import numpy as np

# 以colorbar的cax为例,普通ax用法完全一致
all_ticks = cax.get_yticks()
y_min, y_max = cax.get_ylim()
# 过滤得到实际显示的刻度
visible_ticks = all_ticks[np.where((all_ticks >= y_min - 1e-8) & (all_ticks <= y_max + 1e-8))]

如果自定义了非数值格式的刻度标签,优先使用本方案,避免类型转换错误。

方案2:直接读取渲染后的刻度标签

只有实际显示的刻度才会生成对应的标签,直接读取标签内容即可:

注意:需要先调用fig.canvas.draw()触发渲染,否则标签还未生成,拿到的结果会为空

# 先触发画布渲染
fig.canvas.draw()
# 读取标签内容转成数值
visible_ticks = [float(label.get_text()) for label in cax.get_yticklabels()]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:15:03