【问题标题】:Python: semilogx including 0Python:semilogx,包括 0
【发布时间】:2020-07-31 23:15:10
【问题描述】:

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

主要目标是让我能够将 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。

感谢任何建议。提前致谢。

【问题讨论】:

  • 调用 plt.xscale('symlog') 在 matplotlib 3.3.0 中以您的示例为我工作。你的版本是什么?
  • 好的,我更新了 matplotlib,但它仍然没有相等的间距。您是否使用了任何其他参数?
  • 在你上面的例子中,你实际上并没有在任何地方使用x,这是故意的吗?
  • 更新了代码以包含我如何使用 x。谢谢。

标签: python matplotlib graph axis logarithm


【解决方案1】:

这是一个棘手的问题,其最大的阻力是symlog,又名SymmetricalLogScale 有一个参数linthresh,它指定了零附近的区域,其中x 域被视为线性以避免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 域值。

注意: 1e-7 比更麻烦的 10**-7 等更受欢迎。

附: linthreshx 将在 matplotlib 3.3.0 中为您提供 DeprecationWarning,因为未来是 linthresh

【讨论】:

    猜你喜欢
    • 2015-10-06
    • 1970-01-01
    • 2021-03-16
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多