使用Matplotlib复现动画仅显示右半部分,求错误排查
问题排查:Matplotlib绘制函数仅显示右半部分
你尝试用Matplotlib复现动画,但当前绘制的图像仅显示右半部分(如图):
你的代码如下:
import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation from math import e, pi, sin def f(x, a): x = np.clip(x, -np.sqrt(np.pi), np.sqrt(np.pi)) return x**(2/3) + e/3 * np.maximum (0, (pi - x**2)**0.5) * np.sin(a * pi * x) fig, ax = plt.subplots() x = np.linspace(-2, 2, 400) line, = ax.plot(x, f(x, 0), lw=2, color='red') ax.set_xlim([-2, 2]) ax.set_ylim([-1.5, 2.5]) ax.set_xlabel('x') ax.set_ylabel('f(x)') ax.set_title('f(x) = x^(2/3) + e/3*(π-x^2)^1/2*sin(a*π*x)') def update(a): line.set_ydata(f(x, a)) ax.set_title(f'f(x) = x^(2/3) + e/3*(π-x^2)^1/2*sin({a:.1f}πx)') return line, frames = np.arange(0, 20, 0.05) ani = animation.FuncAnimation(fig, update, frames=frames, interval=10, blit=True) plt.show()
问题根源
核心问题出在x**(2/3)的计算逻辑上:
在numpy中,当x为负数时,直接计算x**(2/3)会返回NaN。这是因为分数次幂的底层计算会先处理开方步骤,负数开平方会得到虚数,numpy默认将其转换为NaN,导致左半部分的函数值全部无效,最终图像只显示右半部分。
解决方法
将x**(2/3)替换为np.sign(x) * np.abs(x)**(2/3)。这个逻辑先对x取绝对值计算幂次,再乘上x的符号,既能保证计算结果的正确性,又能覆盖负数的情况。
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation from math import e, pi, sin def f(x, a): x = np.clip(x, -np.sqrt(np.pi), np.sqrt(np.pi)) # 修正负数的2/3次幂计算 x_pow = np.sign(x) * np.abs(x)**(2/3) return x_pow + e/3 * np.maximum(0, (pi - x**2)**0.5) * np.sin(a * pi * x) fig, ax = plt.subplots() x = np.linspace(-2, 2, 400) line, = ax.plot(x, f(x, 0), lw=2, color='red') ax.set_xlim([-2, 2]) ax.set_ylim([-1.5, 2.5]) ax.set_xlabel('x') ax.set_ylabel('f(x)') ax.set_title('f(x) = x^(2/3) + e/3*(π-x^2)^1/2*sin(a*π*x)') def update(a): line.set_ydata(f(x, a)) ax.set_title(f'f(x) = x^(2/3) + e/3*(π-x^2)^1/2*sin({a:.1f}πx)') return line, frames = np.arange(0, 20, 0.05) ani = animation.FuncAnimation(fig, update, frames=frames, interval=10, blit=True) plt.show()
内容的提问来源于stack exchange,提问作者Roche Lynn
相关产品推荐
相关产品推荐

