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
.
我正在尝试重现此图 -- 特别是对数刻度 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
.