问题
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