2013-12-19 35 views
7

我有一个日志形状轴什么是用计算值替换matplotlib刻度标签的正确方法?

enter image description here

,我想重新标记轴与价值观的日志蜱,而不是值本身

enter image description here

方式我已经做到了这一点与

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

但我不知道没有一个不太复杂的方式来做到这一点。

matplotlib图表上系统地重新标记刻度的正确用法是什么?用原始刻度值计算得出的值是多少?

+0

如果你不想使用'Formatter',你可以只使用'plt.xticks(x_ticks, x_ticklabels)'把预先定义的'x_ticklabels'放在预定义的'x_ticks'的每个相应节点上。 – mikey

回答

6

看看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 doc

一般来说,你可以使用FuncFormatter。有关如何使用FuncFomatter的示例,请参阅matplotlib: change yaxis tick labels其中许多示例都围绕着SO。

你想,从JoeKington提升正是在评论什么简明例如,:

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

在附注上,'LogFormatterExponent'有一些怪癖(例如切换到科学记数法以获得负值)。在这种情况下使用'FuncFormatter'会更好一些。对于OP的引用,'FuncFormatter'需要一个带有两个参数的函数:值和它的位置。例如:'FuncFormatter(lambda x,pos:'{:0.1f}'.format(log10(x)))''。 –

+0

用科学记数法而不是整数格式化负指数。另外(更重要的是)我很好奇* matplotlib图上的ticks重新标记的值,它是根据原始tick值计算得出的值,而不仅仅是存在'Formatter'的情况。 – orome

+0

@JoeKington,很有意思。在回答这个问题时我发现了'LogFormatterExponent'。你知道这种消极行为的原因吗? – tacaswell

相关问题