在Matplotlib中绘制NumPy数组内容时显示点与数组实际数据不符问题求助
问题分析与解决方案
嘿,我来帮你搞定这个绘图问题!刚看了你的代码和输出的数据,立马就发现问题所在了——第一个数据点的y值(4e+84)实在太大了,直接把整个图表的y轴范围拉到了天文数字级别,导致其他所有正常的点都被挤到了图表最底部,看起来就像是和实际数据不匹配。
为什么会出现这个异常值?
你代码里的第一个x值是0.0,虽然加了0.0000001避免除以0,但1/(0.0+0.0000001)等于1e7,再算12次方就是1e84,乘以4之后就得到了4e+84这个超级大的数。而Lennard-Jones势能在x趋近于0的时候本来就会趋近于正无穷,这个点其实没有物理意义,完全是个异常值。
两种解决办法
1. 移除异常的第一个点(推荐)
既然x=0时的势能没有实际意义,我们可以直接从x=0.1开始生成数据,或者在绘图时跳过第一个点:
from matplotlib import pyplot as plt import numpy as np # 直接生成从0.1到0.9的9个点,不用手动循环赋值更高效 x = np.linspace(0.1, 0.9, 9).reshape(9, 1) # 计算Lennard-Jones势能 lj = 4.0 * ((1.0 / x)**12 - (1.0 / x)**6) # 打印验证数据 for xi, lji in zip(x, lj): print(xi[0], " ", lji[0]) # 绘图 plt.plot(x, lj, "o") plt.xlabel('x') plt.ylabel('Lennard-Jones Potential') plt.title('Lennard-Jones Potential vs x') plt.show()
这样绘制出来的图就能准确显示所有正常数据点的分布了。
2. 使用对数坐标轴显示所有点
如果你想保留所有数据点(包括那个异常值),可以把y轴设置为对数刻度,这样就能同时看到大数值和小数值的点:
from matplotlib import pyplot as plt import numpy as np epsilon = 1e-7 # 避免除以0的小偏移 x = np.arange(0, 1, 0.1).reshape(10, 1) lj = 4.0 * ((1.0 / (x + epsilon))**12 - (1.0 / (x + epsilon))**6) # 打印数据 for xi, lji in zip(x, lj): print(xi[0], " ", lji[0]) # 绘图并启用对数y轴 plt.plot(x, lj, "o") plt.yscale('log') # 关键:切换到对数刻度 plt.xlabel('x') plt.ylabel('Lennard-Jones Potential (log scale)') plt.title('Lennard-Jones Potential vs x (log scale)') plt.show()
这样你就能看到第一个点的超大值,同时也能清晰分辨其他点的差异。
内容的提问来源于stack exchange,提问作者Mohammed Alhissi
相关产品推荐
相关产品推荐

