为什么matplotlib使用log scale在y中选择了错误的范围?

2024-04-18 10:19:31 发布

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

在使用matplotlib版本1.5.1和python2.7.11时,我注意到需要手动指定y中的限制,否则只绘制最大的y值点。数组的行为方式相同。在

如果我去掉第一点,我会得到更多的点,但不是全部。在

我不记得以前必须手动设置这样的限制-为什么在这里?在

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(1,2,1)
plt.scatter(X, Y)
plt.xscale('log')
plt.yscale('log')


plt.subplot(1,2,2)
plt.scatter(X, Y)
plt.xscale('log')
plt.yscale('log')
plt.ylim(0.5*min(Y), 2.0*max(Y))  # why is this line necessary?
plt.title('added plt.ylim()')

plt.show()

Tags: 版本logmatplotlib方式绘制plt数组手动
2条回答

问题出现是因为您首先绘制了散点图,然后将比例设置为对数,这会导致放大效果。这样可以消除问题:

plt.xscale('log')
plt.yscale('log')
plt.scatter(X, Y)

这就产生了预期的结果。(你问题中的第二个小插曲。)

似乎matplotlib在转换为对数刻度之前创建y轴刻度,然后不根据更改重新创建刻度。第一个子批次的y轴从10e1开始,而不是10e-3。所以在你绘图之前改变比例。在

plt.xscale('log')
plt.yscale('log')
plt.scatter(X, Y)

我想如果你在对数刻度旁边画出原始刻度,你也许可以通过matplotlib来找出轴部分处理的答案。在日志刻度中,不存在真正的0,因为log(0)未定义。所以坐标必须从0开始,这就导致了问题。x轴的范围是0到3,而y轴的范围是0到16。当转换为log时,matplotlib正确地缩放x轴,但由于y的因子为10,因此它错过了缩放。在

相关问题 更多 >