我试图重现这张图——特别是对数刻度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
默认值的关键部分):https://matplotlib.org/3.1.0/api/scale_api.html#matplotlib.scale.SymmetricalLogScale来源(深入挖掘以找到罪魁祸首行:https://matplotlib.org/3.1.0/_modules/matplotlib/scale.html#SymmetricalLogScale
This answer通常在处理对数轴时也非常有用
在参考了所有这些之后,很明显您应该执行以下操作:
我相信这会给你很好的线性化对数和零x域值
N.B.:
1e-7
比更麻烦的10**-7
等更受欢迎p.S.
linthreshx
将在matplotlib 3.3.0中为您提供一个DeprecationWarning
,因为未来是linthresh
相关问题 更多 >
编程相关推荐