<p>我发现,如果所有的tick值都大于或等于1,那么使用<code>ScalarFormatter</code>非常好。但是,如果您在数字<code><1</code>处有一个勾号,<code>ScalarFormatter</code>会将勾号标签打印为<code>0</code>。</p>
<p><a href="https://i.stack.imgur.com/wcvAF.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/wcvAF.png" alt="enter image description here"/></a></p>
<p>我们可以使用matplotlib<a href="https://matplotlib.org/api/ticker_api.html" rel="nofollow noreferrer">^{<cd6>}</a>模块中的<a href="https://matplotlib.org/api/ticker_api.html#matplotlib.ticker.FuncFormatter" rel="nofollow noreferrer">^{<cd5>}</a>来解决此问题。最简单的方法是使用<code>lambda</code>函数和<code>g</code>格式说明符(感谢注释中的@lenz)。</p>
<pre><code>import matplotlib.ticker as ticker
ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda y, _: '{:g}'.format(y)))
</code></pre>
<p>注意在我最初的回答中,我没有使用<code>g</code>格式,而是使用了这个<code>lambda</code>函数和<code>FuncFormatter</code>来将数字<code>>= 1</code>设置为其整数值,将数字<code><1</code>设置为其十进制值,并要求最小的小数位数(即<code>0.1, 0.01, 0.001</code>,等等)。它假设您只是在<code>base10</code>值上设置勾号。</p>
<pre><code>import matplotlib.ticker as ticker
import numpy as np
ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda y,pos: ('{{:.{:1d}f}}'.format(int(np.maximum(-np.log10(y),0)))).format(y)))
</code></pre>
<p><a href="https://i.stack.imgur.com/gGN6H.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/gGN6H.png" alt="enter image description here"/></a></p>
<p>为了清楚起见,这里的lambda函数以更详细但也更容易理解的方式写出:</p>
<pre><code>def myLogFormat(y,pos):
# Find the number of decimal places required
decimalplaces = int(np.maximum(-np.log10(y),0)) # =0 for numbers >=1
# Insert that number into a format string
formatstring = '{{:.{:1d}f}}'.format(decimalplaces)
# Return the formatted tick label
return formatstring.format(y)
ax.yaxis.set_major_formatter(ticker.FuncFormatter(myLogFormat))
</code></pre>