为什么matplotlib需要在plt.scatter()之前设置日志比例而不是plt.plot()?

时间:2016-08-06 03:12:11

标签: python python-2.7 matplotlib

我在helpful answer中发现plt.scatter()plt.plot()在y轴上使用对数刻度时表现不同。

使用plot,我可以在使用plt.show()之前随时更改为日志,但必须在使用分散方法之前预先设置日志,

这只是matplotlib中一个历史性的,不可逆转的神器,或者是出现在'意想不到的行为中。类别?

enter image description here

import matplotlib.pyplot as plt

X = [0.997, 2.643, 0.354, 0.075, 1.0, 0.03, 2.39, 0.364, 0.221, 0.437]
Y = [15.487507, 2.320735, 0.085742, 0.303032, 1.0, 0.025435, 4.436435,
     0.025435, 0.000503, 2.320735]

plt.figure()

plt.subplot(2,2,1)
plt.scatter(X, Y)
plt.xscale('log')
plt.yscale('log')
plt.title('scatter - scale last')   

plt.subplot(2,2,2)
plt.plot(X, Y)
plt.xscale('log')
plt.yscale('log')
plt.title('plot - scale last')   

plt.subplot(2,2,3)
plt.xscale('log')
plt.yscale('log')
plt.scatter(X, Y)
plt.title('scatter - scale first')   


plt.subplot(2,2,4)
plt.xscale('log')
plt.yscale('log')
plt.plot(X, Y)
plt.title('plot - scale first')   


plt.show()

1 个答案:

答案 0 :(得分:1)

这在某种程度上与matplotlib计算的显示区域(轴限制)有关。

通过使用set_xlimset_ylim方法手动编辑轴范围可以解决此问题。

plt.figure()
plt.scatter(X, Y)
plt.yscale('log')
plt.xscale('log')
axes = plt.gca()
axes.set_xlim([min(X),max(X)])
axes.set_ylim([min(Y),max(Y)])
plt.show()

Image

但是我还没有找到这种行为的确切原因。欢迎提出建议。

编辑

正如评论部分所述,显然Matplotlib已将Autoscaling has fundamental problems确定为其官方Github存储库中的发布关键问题,该问题将在以后的版本中修复。谢谢。