<p>我发现<a href="https://stackoverflow.com/a/21920673/4794">Joe's</a>和<a href="https://stackoverflow.com/a/33213196/4794">Tom's</a>答案非常有用,但是在对这些答案的评论中有很多有用的细节。以下是两种情况的摘要:</p>
<h2>范围大于1</h2>
<p>下面是类似于Joe的示例代码,但范围更大:</p>
<pre><code>import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.axis([1, 10000, 1, 1000000])
ax.loglog()
plt.show()
</code></pre>
<p>用科学符号表示这样的情节:
<a href="https://i.stack.imgur.com/yceX9.png" rel="noreferrer"><img src="https://i.stack.imgur.com/yceX9.png" alt="Default plot with scientific notation"/></a></p>
<p>在乔的回答中,我使用<code>ScalarFormatter</code>,但我也调用<code>set_scientific(False)</code>。当规模达到或超过1000000时,这是必要的。</p>
<pre><code>import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter
fig, ax = plt.subplots()
ax.axis([1, 10000, 1, 1000000])
ax.loglog()
for axis in [ax.xaxis, ax.yaxis]:
formatter = ScalarFormatter()
formatter.set_scientific(False)
axis.set_major_formatter(formatter)
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/LUwoA.png" rel="noreferrer"><img src="https://i.stack.imgur.com/LUwoA.png" alt="Plot with integer ticks"/></a></p>
<h2>低于1的范围</h2>
<p>在汤姆的回答中,当范围小于1时,会发生以下情况:</p>
<pre><code>import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter
fig, ax = plt.subplots()
ax.axis([0.01, 10000, 1, 1000000])
ax.loglog()
for axis in [ax.xaxis, ax.yaxis]:
formatter = ScalarFormatter()
formatter.set_scientific(False)
axis.set_major_formatter(formatter)
plt.show()
</code></pre>
<p>它将x轴上的前两个刻度显示为零。</p>
<p><a href="https://i.stack.imgur.com/Hf1dt.png" rel="noreferrer"><img src="https://i.stack.imgur.com/Hf1dt.png" alt="Plot with ticks labelled as zero"/></a></p>
<p>切换到<code>FuncFormatter</code>可以处理这个问题。同样,我对1000000或更高的数字也有问题,但是给格式字符串添加一个精度就解决了这个问题。</p>
<pre><code>import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
fig, ax = plt.subplots()
ax.axis([0.01, 10000, 1, 1000000])
ax.loglog()
for axis in [ax.xaxis, ax.yaxis]:
formatter = FuncFormatter(lambda y, _: '{:.16g}'.format(y))
axis.set_major_formatter(formatter)
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/FxNQU.png" rel="noreferrer"><img src="https://i.stack.imgur.com/FxNQU.png" alt="enter image description here"/></a></p>