- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Matplotlib 中遇到动画缓慢的问题。我正在对模拟结果进行动画处理,这是最简单的可视化方式,其中包含一系列随时间改变颜色的矩形。
遵循建议 here ,我使用 blitting 仅绘制每帧中变化的(一小部分)矩形。我也尝试使用 FuncAnimation 来实现它,但是当它与 Blit=True 一起使用时,脚本运行速度要慢得多。
我想知道这是否是因为我将所有 的矩形返回给 FuncAnimation,所以即使它们没有改变,它也会重新绘制所有这些矩形。有没有办法将每一帧的不同艺术家传递给 FuncAnimation?我尝试只传递一个已更改的元组(“动画”函数中注释掉的 block ),但这导致看似随机的动画帧......
使用:
$ python2 [script].py blit
$ python2 [script].py anim
谢谢!
import sys
import numpy as np
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
import matplotlib.animation as manim
def animate_data(plot_type):
"""
Use:
python2 plot_anim.py [option]
option = anim OR blit
"""
# dimension parameters
Nx = 30
Ny = 20
numtimes = 100
size = 0.5
if plot_type == "blit":
# "interactive mode on"
plt.ion()
# Prepare to do initial plot
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.set_aspect('equal', 'box')
ax.xaxis.set_major_locator(plt.NullLocator())
ax.yaxis.set_major_locator(plt.NullLocator())
# An array in which to store the rectangle artists
rects = np.empty((Nx, Ny), dtype=object)
# Generate initial figure of all green rectangles
for (i,j),k in np.ndenumerate(rects):
color = 'green'
rects[i, j] = plt.Rectangle([i - size / 2, j - size / 2],
size, size, facecolor=color, edgecolor=color)
ax.add_patch(rects[i, j])
ax.autoscale_view()
# "Old" method using fig.canvas.blit()
if plot_type == "blit":
plt.show()
fig.canvas.draw()
# Step through time updating the rectangles
for tind in range(1, numtimes):
updated_array = update_colors(rects)
for (i, j), val in np.ndenumerate(updated_array):
if val:
ax.draw_artist(rects[i, j])
fig.canvas.blit(ax.bbox)
# New method using FuncAnimate
elif plot_type == "anim":
def animate(tind):
updated_array = update_colors(rects)
# # Just pass the updated artists to FuncAnimation
# toupdate = []
# for (i, j), val in np.ndenumerate(updated_array):
# if val:
# toupdate.append(rects[i, j])
# return tuple(toupdate)
return tuple(rects.reshape(-1))
ani = manim.FuncAnimation(fig, animate, frames=numtimes,
interval=10, blit=True, repeat=False)
plt.show()
return
# A function to randomly update a few rectangles
def update_colors(rects):
updated_array = np.zeros(rects.shape)
for (i, j), c in np.ndenumerate(rects):
rand_val = np.random.rand()
if rand_val < 0.003:
rects[i, j].set_facecolor('red')
rects[i, j].set_edgecolor('red')
updated_array[i, j] = 1
return updated_array
if __name__ == "__main__":
if len(sys.argv) > 1:
plot_type = sys.argv[1]
else:
plot_type = "blit"
animate_data(plot_type)
最佳答案
每帧更新 600 个矩形非常慢,代码中的 cbar_blit
模式更快,因为您只更新颜色发生变化的矩形。您可以使用 PatchCollection
来加速绘图,这里是代码:
import numpy as np
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
import matplotlib.animation as manim
from matplotlib.collections import PatchCollection
Nx = 30
Ny = 20
numtimes = 100
size = 0.5
x, y = np.ogrid[-1:1:30j, -1:1:20j]
data = np.zeros((numtimes, Nx, Ny))
for i in range(numtimes):
data[i] = (x-i*0.02+1)**2 + y**2
colors = plt.cm.rainbow(data)
fig, ax = plt.subplots()
rects = []
for (i,j),c in np.ndenumerate(data[0]):
rect = plt.Rectangle([i - size / 2, j - size / 2],size, size)
rects.append(rect)
collection = PatchCollection(rects, animated=True)
ax.add_collection(collection)
ax.autoscale_view(True)
def animate(tind):
c = colors[tind].reshape(-1, 4)
collection.set_facecolors(c)
return (collection,)
ani = manim.FuncAnimation(fig, animate, frames=numtimes,
interval=10, blit=True, repeat=False)
plt.show()
关于python - Matplotlib funcanimation blit 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19843700/
使用 pygame,是否会更有效率: 每帧从 spritesheet 的一部分中 Blit 一个单独的 sprite 在启动时,将每个 Sprite 从 spritesheet 传输到它们自己的表面,
阅读 pygame 教程 here ,你会发现这个例子:(箭头是我的) for o in objects: screen.blit(background, o.pos, o.pos) # Re
我正在为 WinCE 6.0 设备开发一个应用程序,其中需要旋转屏幕,因此我们使用典型的 ChangeDisplaySettingsEx() API。我也在 View 上画一些东西。 从 memDC
我想将用户输入到屏幕上的文本传输到屏幕上。每次用户按回车键时,键入的文本都会被传输到屏幕上。对于文本输入,我使用这个 [text_input 模块] ( https://github.com/Near
我得到了一个不断变化/更新的缓冲区,我需要将这个缓冲区的像素 blit 到屏幕上。对于我的测试代码,我读取了一个位图并将其存储到缓冲区中。问题是,我想在使用 OpenGL 将特定颜色 blit 到屏幕
给定一张图片,如何将其“包裹”在屏幕上? 例如,如果您将图像的 rect 样式对象设置在屏幕边缘下方 - 不可见的一半会 blit 到屏幕顶部。 imageRect.top=800 #Below
我正在尝试为被 blit 的文本创建打字机效果。所谓打字机效应,我的意思是我试图避免整个文本同时出现在屏幕上。相反,我试图让每个字母单独出现,在字符串中的下一个字符出现之前稍有延迟。 要注意的是我没有
我正在寻求实现一个管理 blit 队列的模块。有一个表面,该表面的部分(由矩形包围)被复制到表面内的其他地方: add_blt(rect src, point dst); 可以有任意数量的操作按顺序发
我正在尝试让我的网络摄像头通过 pygame 显示视频。这是代码: # import the relevant libraries import time import pygame import p
我正在尝试在我的 python 应用程序中实时绘制多个子图。理想情况下,我还应该能够在每个子图中绘制多条线,但为了简单起见,我假设每个子图中绘制一条线。为了有效地做到这一点(我正在寻找快速绘图),我试
我正在尝试将多采样场景渲染为纹理,这是我正在使用的代码。我得到一个黑屏。我在 init 结束时检查了 fbo 的完整性,他们报告两个 fbo 都是完整的。 void init_rendered_FBO
我有 2 个 FBO + MRT,它们有相同的附件(每个附件有 4 个颜色)。使用 glBlitFrameBuffer 对深度缓冲区和 one color_attachment 按预期工作。但是,当我
我知道这个话题经常出现,但经过多次尝试、搜索和放弃,我又把它带回到你身边。 我有一个类,其中包含一个 matplotlib 图形。在此图中,我想要一个文本,当用户按下某个键时,文本会更新为某些内容,而
我正在尝试在 python 中为 pygame 制作一个脚本,以绘制一个文本居中的按钮,但是当我 blit 到屏幕上时,它 blits 到我给它的 x 和 y,而不是按比例居中的位置。我希望能够将它集
我正在尝试使用 SDL 制作一个非常小且简单的片段。这个就像一个魅力: SDL_Window * window = SDL_CreateWindow("SDLTest", 0, 0, SCREEN_W
我正在尝试让我的网络摄像头通过 pygame 显示视频。这是代码: # import the relevant libraries import time import pygame import p
我正在编写一个基本上使用 Sprite 的游戏,我在这段代码中使用了 Sprite 表,最终得到了 "invalid destination for blit" 错误。 class spriteshe
如果任何对 pygames 有基本了解的人可以帮助我解决我目前面临的问题,那就太好了。对于你们这些绝对的神来说,应该不会太难。 我现在的代码遇到了问题。 我正在尝试制作一个简单的游戏,其中程序显示一个
我目前正在尝试再次对已绘制图像的一部分进行 blit。为此,我读到一个可以在使用 blit 时使用可选的第三个区域参数。我不知道为什么,但这个参数对我来说很奇怪。 据我了解,区域参数是(pos_x、p
我想将一个数组复制到另一个大小不同的数组。我想要这样的功能: blit(destimg,src,dstlocation) 例如 blit(zeros((7,7)),ones((3,3)),(4,4))
我是一名优秀的程序员,十分优秀!