Python: semilogx 包括 0

Python: semilogx including 0

我正在尝试重现此图 -- 特别是对数刻度 x 轴:

主要的 objective 是让我能够将 x 轴显示为等距对数刻度。

我目前正在使用 matplotlib 中的 semilogx,但这不包括 0(当然,log(0) 将是未定义的)。但是,我在 0 处有一个数据点,需要显示它。实际上,我的代码如下所示:

dt = 0.01 
t = np.arange(0, 1, 0.1)
x = [0, 10**-6, 10**-5, 10**-4, 10**-3, 10**-2, 1]
dfy = list(averages.iloc[0, :]) # where averages is a row with 7 entries
plt.plot(x, dfy, marker = 'o', linestyle = '')  # plots graph
plt.semilogx(t, np.exp(-t/5.0), linestyle = '') 

生成的图形看起来像这样,我很满意,除了缺少 0:

我试过:

plt.xscale('symlog')
plt.xscale('log')

但是,这不会产生所需的均匀间隔的对数刻度。此外,我尝试不使用 0、10^-16,但这只包括 -6 和 -16 之间的所有幂。我需要它从 0 然后立即到 10^-6。

如有任何建议,我们将不胜感激。提前致谢。

这是一个棘手的问题,它的关键在于 symlog,也就是 SymmetricalLogScale 有一个参数 linthresh,它指定了零附近的区域,其中 x -domain 被视为线性以避免 log(x) 走向无穷大。您遇到的问题是此参数的默认值为 2.0,因此默认情况下 -2 和 +2 之间的所有内容都处于线性非对数刻度。您要指定 1e-7,即域中零和下一个有效值之间的任何值。

参考文献:

文档(严重缺少应该说明linthreshx默认值的关键部分): https://matplotlib.org/3.1.0/api/scale_api.html#matplotlib.scale.SymmetricalLogScale

来源(深入挖掘找到你的罪魁祸首 linthresh = kwargs.pop('linthreshx', 2.0) 行): https://matplotlib.org/3.1.0/_modules/matplotlib/scale.html#SymmetricalLogScale

This answer 通常在处理对数轴时也很有帮助。

参考了所有这些内容之后,显然您应该执行以下操作:

plt.xscale('symlog', linthresh=1e-7)

我相信这会给你很好的线性化对数十年和零 x 域值。

N.B.: 1e-7 比更繁琐的 10**-7

更受欢迎

P.S。 linthreshx 会在 matplotlib 3.3.0 中给你一个 DeprecationWarning 因为未来是 linthresh.