You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:12:37