我有一个使用对数坐标轴的图形
我希望用值的对数来替换轴刻度上的值本身
我实现这个目标的方法是通过:
plt.axes().set_xticklabels([math.log10(x) for x in plt.axes().get_xticks()])
但我想知道是否有一种更简单的方法来完成这个操作。
对于从原始刻度值计算出的值,matplotlib
图形上系统地重新标记刻度的正确习语是什么?
我有一个使用对数坐标轴的图形
我希望用值的对数来替换轴刻度上的值本身
我实现这个目标的方法是通过:
plt.axes().set_xticklabels([math.log10(x) for x in plt.axes().get_xticks()])
但我想知道是否有一种更简单的方法来完成这个操作。
对于从原始刻度值计算出的值,matplotlib
图形上系统地重新标记刻度的正确习语是什么?
Formatter
类。除非您要在刻度上放置文本,否则几乎永远不应直接使用set_xticklabels
或set_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 Kingtonmatplotlib
图表上通常重新标记刻度线的习语,该习语使用从原始刻度线值计算出的值,而不仅仅是存在 Formatter
的情况。 - oromeFormatter
的情况下,什么是最好的通用方法?我也接受在交互模式下无法工作的答案。 - orome
Formatter
,您可以使用plt.xticks(x_ticks, x_ticklabels)
将预定义的x_ticklabels
放置在预定义的x_ticks
的每个相应刻度上。 - user7345804