Matplotlib中的对数坐标轴图表如何展示零值

33

我目前正在使用对数刻度来获得更大的数据绘图可能性。然而,我的数据中也包含零值。我知道这些零值在对数刻度上不起作用,因为log(0)未定义。

例如:

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([0,1,2],[10,10,100],marker='o',linestyle='-')
ax.set_yscale('log')
ax.set_xscale('log')

完全省略了零值。这种行为可接受吗?至少应该有某种警告。我是偶然发现的。也许还有一种在对数坐标下绘制零值数据的方法吗?

谢谢!

P.S.:我希望这适用于stackoverflow。我没有找到matplotlib的邮件列表。


1
mpl邮件列表 -> http://sourceforge.net/mail/?group_id=80706 - tacaswell
2
可能是Matplotlib对数刻度与零值的重复问题 - Benjamin Bannier
以上问题有两种可能的解决方案。 - Benjamin Bannier
@honk - 实际上,那个问题并没有回答到楼主的问题。 - Joe Kington
@JoeKington:我之前不知道symlog,这也是我提供的问题的一个很好的答案。但是在使用它时,仍然需要记住显示的图形不再严格符合对数坐标。 - Benjamin Bannier
显示剩余2条评论
1个回答

55

使用“对数线性”图表最为简单。靠近0的区间将采用线性刻度,因此可以显示0。

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([0,1,2],[10,10,100],marker='o',linestyle='-')
ax.set_yscale('symlog')
ax.set_xscale('symlog')
plt.show()

在此输入图像描述

Symlog在接近0的小区间(上下两侧)使用线性比例尺。这样可以使得物体在穿过0时不会导致log(x)出现爆炸性的变化(或者说不会趋近于负无穷大)。

这里有一个很好的可视化对比,是Stack Overflow上的一个回答:https://dev59.com/1nA75IYBdhLWcg3wboUz#3513150


很棒的答案。谢谢你。你能详细解释一下symlog到底是做什么的吗? - fsociety
1
当然!看看更新。Matplotlib库的画廊中也有一些例子(例如http://matplotlib.org/examples/pylab_examples/symlog_demo.html),但它们不像我链接的SO答案那么清晰。 - Joe Kington
非常有帮助。谢谢。 - Newb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接