如何用计算出的值替换matplotlib刻度标签?

10

我有一个使用对数坐标轴的图形

enter image description here

我希望用值的对数来替换轴刻度上的值本身

enter image description here

我实现这个目标的方法是通过:

plt.axes().set_xticklabels([math.log10(x) for x in plt.axes().get_xticks()])

但我想知道是否有一种更简单的方法来完成这个操作。

对于从原始刻度值计算出的值,matplotlib图形上系统地重新标记刻度的正确习语是什么?


如果您不想使用 Formatter,您可以使用 plt.xticks(x_ticks, x_ticklabels) 将预定义的 x_ticklabels 放置在预定义的 x_ticks 的每个相应刻度上。 - user7345804
1个回答

9
请查看Formatter类。除非您要在刻度上放置文本,否则几乎永远不应直接使用set_xticklabelsset_yticklabels。这将完全将您的刻度标签与数据分离。如果调整视图限制,刻度标签将保持不变。
在您的情况下,已经存在这样的格式化程序:
fig, ax = plt.subplots()
ax.loglog(np.logspace(0, 5), np.logspace(0, 5)**2)
ax.xaxis.set_major_formatter(matplotlib.ticker.LogFormatterExponent())

matplotlib.ticker.LogFormatterExponent 文档

通常可以使用 FuncFormatter。有关如何使用 FuncFomatter 的示例,请参见 matplotlib: 更改y轴刻度标签 这是SO中的许多示例之一。

一个简洁的例子,完全摘自JoeKington在评论中所说:

ax.xaxis.set_major_formatter(
   FuncFormatter(lambda x, pos: '{:0.1f}'.format(log10(x))))

顺便提一下,LogFormatterExponent有一些小问题(例如,对于负值切换到科学计数法)。在这种情况下,使用FuncFormatter会更好一些。供楼主参考,FuncFormatter需要一个接受两个参数的函数:值和位置。例如:FuncFormatter(lambda x, pos: '{:0.1f}'.format(log10(x))) - Joe Kington
这将科学计数法中的负指数格式化为浮点数,而不是整数。另外(更重要的是),我想知道在 matplotlib 图表上通常重新标记刻度线的习语,该习语使用从原始刻度线值计算出的值,而不仅仅是存在 Formatter 的情况。 - orome
同时:在没有Formatter的情况下,什么是最好的通用方法?我也接受在交互模式下无法工作的答案。 - orome
FuncFormatter是一种格式化函数,它允许您按照任何方式将数字转换为字符串。 - tacaswell
有多慢?不知道确切的代码路径,但我认为不应该有太大的差异。 - tacaswell
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接