Python:semilogx包括0

Python:semilogx包括0,python,matplotlib,graph,axis,logarithm,Python,Matplotlib,Graph,Axis,Logarithm,我试图重现这张图——特别是对数刻度x轴: 我的主要目标是能够将x轴显示为等距对数刻度 我目前正在使用matplotlib中的semilogx,但是这不包括0(当然,日志(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, :]) #

我试图重现这张图——特别是对数刻度x轴:

我的主要目标是能够将x轴显示为等距对数刻度

我目前正在使用matplotlib中的semilogx,但是这不包括0(当然,日志(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,而不是使用0,10^-16,但是这只包括-6和-16之间的所有幂。我需要它从0到10^-6


任何建议都将不胜感激。提前感谢。

这是一个棘手的问题,它的阻力在于
symlog
,也称为
SymmetricalLogScale
有一个参数
linthresh
,它指定了零附近的区域,其中x域被视为线性,以避免
log(x)
变为无穷大。您案例中的问题是,此参数的默认值为
2.0
,因此,-2和+2之间的所有内容在默认情况下都是线性的,非对数比例。您希望指定
1e-7
,即域中介于零和下一个有效值之间的任意值

参考文献:

文档(严重缺少说明
linthreshx的默认值的关键部分):

源代码(深入挖掘以找到这一行
linthresh=kwargs.pop('linthreshx',2.0)
谁是你的罪魁祸首):

通常在处理对数轴时也非常有用

在参考了所有这些之后,很明显您应该执行以下操作:

plt.xscale('symlog', linthresh=1e-7)
我相信这会给你很好的线性化对数和零x域值

N.B.:
1e-7
比更麻烦的
10**-7
等更受欢迎


p.S.
linthreshx
将在matplotlib 3.3.0中给您一个
弃用警告
,因为未来是
linthresh

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