What is the correct way to replace matplotlib tick labels with computed values?

◇◆丶佛笑我妖孽 提交于 2019-11-27 21:24:18

问题


I have a figure with a log axis

and I would like to relabel the axis ticks with logs of the values, rather than the values themselves

The way I've accomplished this is with

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

but I wonder if there isn't a less convoluted way to do this.

What is the correct idiom for systematically relabeling ticks on matplotlib plots with values computed from the original tick values?


回答1:


Look into the Formatter classes. Unless you are putting text on your ticks you should almost never directly use set_xticklabels or set_yticklabels. This completely de-couples your tick labels from you data. If you adjust the view limits, the tick labels will remain the same.

In your case, a formatter already exists for this:

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

In general you can use FuncFormatter. For an example of how to use FuncFomatter see matplotlib: change yaxis tick labels which one of many examples floating around SO.

A concise example for what you want, lifting exactly from JoeKington in the comments,:

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


来源:https://stackoverflow.com/questions/20692503/what-is-the-correct-way-to-replace-matplotlib-tick-labels-with-computed-values

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!