我解决了一个我在stackoverflow上找不到的问题,所以我决定上传给遇到错误的其他人。
我有一组函数可以从不同的情节创建视频。例如,我用它来展示位置([XY] 坐标)如何随时间变化。
在我的绘图程序之一(参见示例代码中的“a_plotting_function”)中,我使用 matplotlib 的“文本”将文本添加到绘图中。但是,在某些情况下,它会导致错误:
“ValueError:posx 和 posy 应该是有限值”
错误出现在“writer.grab_frame()”,这让我很难找到实际的错误。
在示例代码中,错误可能很容易发现:要绘制的坐标之一的 X 值设置为 np.nan。
这个错误特别难以捕捉,因为 1)我使用的实际绘图程序要复杂得多(或者:更难阅读)和 2)错误没有指向原因(结果是“plt.text ",这使得 posx 和 posy 由于某种原因无限..)。
我希望我可以省去其他人在未来某个时候寻找原因的努力!
import matplotlib.pyplot as plt
import matplotlib.animation as manimation
import numpy as np
def a_plotting_function(X, Y, dX, dY, print_string):
plt.plot([X-dX, X], [Y-dY, Y])
plt.text(X, Y, print_string)
X = 0
Y = 0
dX = 1
dY = 2
frames = 30
frameRate = 24
dpi = 300
print_string = 'poetry'
writer = manimation.FFMpegWriter(fps = frameRate, extra_args=['-pix_fmt', 'yuv420p'])
fig, ax = plt.subplots()
ax.set_xlim((X, X + frames * dX))
ax.set_ylim((Y, Y + frames * dY))
with writer.saving(fig, 'my_beautiful_movie.mp4', dpi):
for frame in range(frames):
X += dX
Y += dY
if X > 0.7 * frames:
X = np.nan
a_plotting_function(X, Y, dX, dY, print_string)
writer.grab_frame()
Run Code Online (Sandbox Code Playgroud)
ValueError: posx 和 posy 应该是有限值 [在 2.7s 内完成,退出代码为 1] [shell_cmd: python -u "stack_overflow\value_error_matplotlib.py"]
答案(如帖子中部分解释的那样)是,如果坐标为“np.nan”,则 matplotlib 的“文本”将 posx 和 posy 设置为无穷大。在您绘制它的那一刻不会注意到这一点,但只有在将帧抓取到 writer 对象时才会注意到。
所以:避免通过没有任何坐标(对于 matplotlib 的文本)是 np.nan 来制作无限大的图。