Python:semilogx包括0

2024-06-14 02:54:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

enter image description here

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

enter image description here

我试过:

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

但是,这不会产生所需的等间距对数刻度。另外,我尝试了使用0,10^-16,而不是使用0,10^-16,但是这只包括-6和-16之间的所有幂。我需要它从0到10^-6

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


Tags: 数据代码目标matplotlibnp对数plt未定义
1条回答
网友
1楼 · 发布于 2024-06-14 02:54:03

这是一个棘手的问题,它的阻力在于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通常在处理对数轴时也非常有用

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

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

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

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

p.S.linthreshx将在matplotlib 3.3.0中为您提供一个DeprecationWarning,因为未来是linthresh

相关问题 更多 >