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
相关产品推荐
相关产品推荐

