绘图问题(matplotlib):“ValueError:posx and posy should be finite values”

t3irkdon  于 2023-11-22  发布在  其他
关注(0)|答案(2)|浏览(467)

我解决了一个在stackoverflow上找不到的问题,所以我决定把它上传给其他遇到这个错误的人。
我有一组函数可以从不同的情节创建一个视频。我用它来展示位置([XY]坐标)如何随时间变化。
在我的一个绘图过程中(参见示例代码中的“a_plotting_function”),我使用matplotlib的“text”向图中添加文本。然而,在某些情况下,它会导致错误:
“ValueError:posx和posy应该是有限值”
错误出现在“writer.grab_frame()",这让我很难找到实际的错误。
在示例代码中,错误可能很容易发现:其中一个要绘制的坐标的X值被设置为np. nan。
这个bug特别难捕捉,因为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()

字符串
值错误:posx和posy应该是有限值[在2.7秒内完成,退出代码为1] [shell_cmd:python -u“stack_overflow\value_error_matplotlib.py”]

9vw9lbht

9vw9lbht1#

答案(在文章中有部分解释)是matplotlib的“text”在坐标为“np.nan”的情况下将posx和posy设置为无穷大。这在你绘制它的时候不会被注意到,但是只有在抓取writer对象的框架时才会被注意到。
所以:避免绘制无限大的图,因为任何坐标(对于matplotlib的文本)都不是np.nan。

9cbw7uwe

9cbw7uwe2#

在我的例子中,a在没有nan/inf值的情况下也有同样的错误,因为我试图在sns.barplot()中添加文本值,我用下面的代码解决了这个问题:

for bar in ax.patches:
        x_pos = bar.get_x() + bar.get_width() / 2
        y_pos = bar.get_height()
        ax.text(x_pos, y_pos, f'{y_pos:.0f}', ha='center', va='bottom', fontsize=10)

字符串

相关问题