Matplotlib的“symlog”选项:如何防止曲线“回程”?

4 投票
1 回答
4941 浏览
提问于 2025-04-16 21:26

我正在绘制一个数据图,这个图的x轴范围是从-1000到1000。但我只对x在-1到0之间的值感兴趣。

我还想把x轴设置为对数刻度。不过因为x值是负数,所以不能用xscale("log")。不过我可以用xscale("symlog"),这正是我想要的效果。

可惜的是,“symlog”似乎有点问题。我不能把linthreshx这个参数设置得小于2(默认值?)。但因为我只关注-1到0之间的x值,所以我必须使用这个参数,并把它设置为像1e-5这样的小值,甚至更小。

如果我把linthreshx设置得小于1,图就会出问题。这里有一个简单的例子,来自于“log”和“symlog”有什么区别?

import numpy
from matplotlib import pyplot

# Enable interactive mode
pyplot.ion()

# Draw the grid lines
pyplot.grid(True)

# Numbers from -50 to 50, with 0.1 as step
xdomain = numpy.arange(-50,50, 0.1)

# Plots a simple linear function 'f(x) = x'
pyplot.plot(xdomain, xdomain)
# Plots 'sin(x)'
pyplot.plot(xdomain, numpy.sin(xdomain))

pyplot.axis([-60,60,-1.5,1.5])

pyplot.xscale('symlog', linthreshx=0.1)

运行这个代码,你会看到我说的曲线“回来了”... 这是生成的图像: result

问题似乎在于,x轴上的0实际上是10^0 = 1,而不是0。如果放一个小于1的值,线就会回去,轴上的值也会错(当鼠标悬停时获取的x值)。

我可能没有使用正确的工具,但我该如何实现我想要的效果呢?我希望x轴看起来像这样:-10^2 -10^1 -10^0 -10^-1 -10^-2 -10^-3 ... [直到我定义的最小指数] ... 10^-3 10^-2 10^-1 10^0 10^1 10^2

谢谢你

1 个回答

8

这其实是matplotlib里的一个错误。

你可以查看这个链接了解更多信息:https://github.com/matplotlib/matplotlib/issues/396

现在这个问题已经修复了。我附上了一张图片,展示了之前代码的正确结果。 正确结果

撰写回答