gpt4 book ai didi

python - 添加补丁时 Matplotlib 动画速度变慢

转载 作者:太空宇宙 更新时间:2023-11-03 17:29:49 25 4
gpt4 key购买 nike

我想可视化 2D 算法的路径。所以我写了一段简短的 Python 代码来生成这样的动画。问题是,对于我添加的每个像素(plt.Rectangle),代码变得越来越慢。前 20 个像素在大约 1 秒内显示,最后 20 个像素已经花费了 3 秒。显然,对于更大的网格和更多的像素,情况会变得更糟。

from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 7)
ax = plt.axes(xlim=(0, 20), ylim=(0, 20))

pixels = list()

def init():
return list()

def animate(i):
index = len(pixels)
index_x, index_y = index // 20, index % 20

pixel = plt.Rectangle((index_x, index_y), 1, 1, fc='r')
ax.add_patch(pixel)
pixels.append(pixel)
return pixels

anim = animation.FuncAnimation(fig, animate,
init_func=init,
frames=100,
interval=5,
blit=True)

plt.show()

我很清楚为什么需要更长的时间。由于每帧的补丁数量越来越大,matplotlibs 渲染速度越来越慢。但没这么慢!我怎样才能获得更快的速度?有没有办法可以保留旧图并只覆盖当前像素?

最佳答案

我尝试对动画函数进行计时,由于某种原因,函数本身没有明显的减慢。此外,blit 应该确保只绘制最新的矩形。您建议的防止重绘的一种可能方法是光栅化绘图,

    m=ax.add_patch(pixel)
m.set_rasterized(True)

虽然这似乎并没有提高我的计时速度。我认为更新绘图时,增加一定会导致 matplotlib 中的某个地方。使用交互式绘图可以清楚地看出这一点,例如

from matplotlib import pyplot as plt
import time

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 7)
ax = plt.axes(xlim=(0, 20), ylim=(0, 20))
npx = 20; npy = 20
Npix = npx*npy
plt.ion()
plt.show()
for i in range(Npix):
#ax.cla()
t0 = time.time()
index_x, index_y = i // 20, i % 20

pixel = plt.Rectangle((index_x, index_y), 1, 1, fc='r')
ax.add_patch(pixel)

fig.set_rasterized(True)
plt.pause(0.0001)
t1 = time.time()
print("Time=",i,t1-t0)

这给出了光栅化、非光栅化和清除轴 (ax.cla) 的情况,

Time for each plot <code>t1-t0</code> per rectangle on <code>y</code> vs rectangle number on <code>x</code>

我不确定为什么会发生这种情况,也许对 matplotlib 有更深入了解的人能够提供帮助。加快绘图速度的一种方法是设置所有矩形并将其放入 patchcollection 中。然后动画只是改变脸部颜色,因此只显示需要显示的矩形,

from matplotlib import pyplot as plt
from matplotlib import animation
import numpy as np

from matplotlib.collections import PatchCollection

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 7)
ax = plt.axes(xlim=(0, 20), ylim=(0, 20))
npx = 20; npy = 20
Npix = npx*npy
displayed = np.zeros((npx, npy, 4))
pixels = []

def init():
for index in range(Npix):
index_x, index_y = index // npx, index % npy

pixel = plt.Rectangle((index_x, index_y), 1, 1, fc='r', ec='none')
pixels.append(pixel)

return pixels

pixels = init()
collection = PatchCollection(pixels, match_original=True, animated=True)
ax.add_collection(collection)

def animate(index):
index_x, index_y = index // npx, index % npy
displayed[index_x, index_y] = [1, 0, 0, 1]
collection.set_facecolors(displayed.reshape(-1, 4))
return (collection,)

anim = animation.FuncAnimation(fig, animate,
frames=400,
interval=1,
blit=True,
repeat=False)

plt.show()

这要快得多,尽管我不知道如何打开或关闭边缘,所以只需禁用所有矩形即可。

关于python - 添加补丁时 Matplotlib 动画速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32053759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com