Matplotlib对数刻度显示为整数解决方法不适用于指定的刻度

时间:2019-01-22 14:21:00

标签: python matplotlib axis-labels

Matplotlib固有地设置对数刻度以使用科学计数法。如果要避免这种情况,则必须使用以下最小示例之类的解决方法:

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
x=np.arange(100,110)
y=np.arange(10)
fig, axes = plt.subplots(1, 2, sharey=True, squeeze=False)
axes = axes[0]
axes[0].plot(x,y)
axes[1].plot(x,y)
for ax in axes:
     ax.set_yscale('log')
     ax.yaxis.set_major_formatter(mpl.ticker.ScalarFormatter())
plt.show() 

Output

此方法在所有情况下均能正常工作,并已作为许多问题(例如Example 1 Example 2

下的解决方案)显示

我以前使用过这种解决方案。但是,还有另一个我未曾讨论过的问题。如果您想设置ax.ylim(...),则此工作将停止工作

考虑以下示例(请注意新行ax.set_ylim(0,10)):

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
x=np.arange(100,110)
y=np.arange(10)
fig, axes = plt.subplots(1, 2, sharey=True, squeeze=False)
axes = axes[0]
axes[0].plot(x,y)
axes[1].plot(x,y)
for ax in axes:
    ax.set_ylim(0, 10)
    ax.set_yscale('log')
    ax.yaxis.set_major_formatter(mpl.ticker.ScalarFormatter())

plt.show()

Error

这不再是所需的输出。

总有办法避免这种怪异的互动吗?

1 个答案:

答案 0 :(得分:1)

问题是您当前仅使用 major_formatter,仅适用于对数刻度上的主要刻度。在第二种情况下,您需要另外使用minor_formatter,因为您看到的2 x10^03 x 10^0等是次要的滴答标签,其格式必须单独处理。

for ax in axes:
    ax.set_ylim(0, 10)
    ax.set_yscale('log')
    ax.yaxis.set_major_formatter(mpl.ticker.ScalarFormatter())
    ax.yaxis.set_minor_formatter(mpl.ticker.ScalarFormatter()) # <---- Added

enter image description here