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()
此方法在所有情况下均能正常工作,并已作为许多问题(例如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()
总有办法避免这种怪异的互动吗?
答案 0 :(得分:1)
问题是您当前仅使用 major_formatter
,仅适用于对数刻度上的主要刻度。在第二种情况下,您需要另外使用minor_formatter
,因为您看到的2 x10^0
,3 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