Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用matplotlib保存散点图动画_Python_3d_Matplotlib_Avi_Scatter Plot - Fatal编程技术网

Python 使用matplotlib保存散点图动画

Python 使用matplotlib保存散点图动画,python,3d,matplotlib,avi,scatter-plot,Python,3d,Matplotlib,Avi,Scatter Plot,我一直在尝试用matplotlib保存动画散点图,我更希望它不需要完全不同的代码来查看动画人物和保存副本。该图完美地显示了保存完成后的所有数据点 这段代码是on的一个修改版本,对on的颜色进行了修复(因为颜色在我的视频中很重要,所以我想确保它们正常工作) 一个完全有效的.avi是由此生成的,但是除了轴之外,它在四秒钟内都是空白的。实际的数字总是准确地显示我想要看到的东西。如何像填充正常运行的动画一样填充save函数的绘图,或者可以在matplotlib中填充 编辑:在更新中使用分散调用(不设置初

我一直在尝试用matplotlib保存动画散点图,我更希望它不需要完全不同的代码来查看动画人物和保存副本。该图完美地显示了保存完成后的所有数据点

这段代码是on的一个修改版本,对on的颜色进行了修复(因为颜色在我的视频中很重要,所以我想确保它们正常工作)

一个完全有效的.avi是由此生成的,但是除了轴之外,它在四秒钟内都是空白的。实际的数字总是准确地显示我想要看到的东西。如何像填充正常运行的动画一样填充save函数的绘图,或者可以在matplotlib中填充

编辑:在更新中使用分散调用(不设置初始值设定项中的边界)会导致.avi显示轴的增长,表明每次都在运行数据,而不是显示在视频本身上。
我正在将matplotlib 1.1.1rc与Python 2.7.3一起使用。

FuncAnimation
中删除
blit=True
,并从
scatter
中删除
animated=True
,它可以工作。我怀疑,确保只在帧之间更新/重画需要更新的艺术家(而不仅仅是重新绘制所有内容)的逻辑出了问题

下面就是我运行的内容,我得到了预期的输出:

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

FLOOR = -10
CEILING = 10

class AnimatedScatter(object):
    def __init__(self, numpoints=5):
        self.numpoints = numpoints
        self.stream = self.data_stream()
        self.angle = 0

        self.fig = plt.figure()
        self.fig.canvas.mpl_connect('draw_event',self.forceUpdate)
        self.ax = self.fig.add_subplot(111,projection = '3d')
        self.ani = animation.FuncAnimation(self.fig, self.update, interval=100, 
                                       init_func=self.setup_plot, frames=20)

    def change_angle(self):
        self.angle = (self.angle + 1)%360

    def forceUpdate(self, event):
        self.scat.changed()

    def setup_plot(self):
        X = next(self.stream)
        c = ['b', 'r', 'g', 'y', 'm']
        self.scat = self.ax.scatter(X[:,0], X[:,1], X[:,2] , c=c, s=200)

        self.ax.set_xlim3d(FLOOR, CEILING)
        self.ax.set_ylim3d(FLOOR, CEILING)
        self.ax.set_zlim3d(FLOOR, CEILING)

        return self.scat,

    def data_stream(self):
        data = np.zeros(( self.numpoints , 3 ))
        xyz = data[:,:3]
        while True:
            xyz += 2 * (np.random.random(( self.numpoints,3)) - 0.5)
            yield data

    def update(self, i):
        data = next(self.stream)
        self.scat._offsets3d = ( np.ma.ravel(data[:,0]) , np.ma.ravel(data[:,1]) , np.ma.ravel(data[:,2]) )
        return self.scat,

    def show(self):
        plt.show()

if __name__ == '__main__':
    a = AnimatedScatter()
    a.ani.save("movie.avi", codec='avi')
    a.show()

你能修好你的压痕吗?哎呀。我应该更仔细地复制和粘贴。虽然我的源代码中有空格而不是制表符,所以我不太清楚发生了什么。如果你在图中看,这看起来还可以吗?您使用的是什么版本的MPL?数字不是问题,而.avi是。我确实注意到它在第一段中起了作用,但为了强调起见,让我编辑一下。我使用的是1.1.1rc版本。如果你从
update
中删除
plt.draw()
,它会打断图形,我认为这是一个线索。这就成功了!我的实际项目就是用这个方法完成的。谢谢有趣的是,考虑到动画效果,删除
blit
会有所帮助。调用
\u draw\u next\u frame
时,将
blit
保存为false。如果有机会,我会在matplotlib的站点上添加完整的bug报告(或者至少是wishlist请求)。使用SciPy 0.12.0、Numpy 1.7.1和matplotlib 1.2.1,我无法使它正常工作。它最多只能创建一个视频,其中一吨旧点被新点或空白点覆盖。欢迎您尝试我的视频中链接的代码:我最终使用了CamStudio,它工作得更好,视频输出质量更高。
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

FLOOR = -10
CEILING = 10

class AnimatedScatter(object):
    def __init__(self, numpoints=5):
        self.numpoints = numpoints
        self.stream = self.data_stream()
        self.angle = 0

        self.fig = plt.figure()
        self.fig.canvas.mpl_connect('draw_event',self.forceUpdate)
        self.ax = self.fig.add_subplot(111,projection = '3d')
        self.ani = animation.FuncAnimation(self.fig, self.update, interval=100, 
                                       init_func=self.setup_plot, frames=20)

    def change_angle(self):
        self.angle = (self.angle + 1)%360

    def forceUpdate(self, event):
        self.scat.changed()

    def setup_plot(self):
        X = next(self.stream)
        c = ['b', 'r', 'g', 'y', 'm']
        self.scat = self.ax.scatter(X[:,0], X[:,1], X[:,2] , c=c, s=200)

        self.ax.set_xlim3d(FLOOR, CEILING)
        self.ax.set_ylim3d(FLOOR, CEILING)
        self.ax.set_zlim3d(FLOOR, CEILING)

        return self.scat,

    def data_stream(self):
        data = np.zeros(( self.numpoints , 3 ))
        xyz = data[:,:3]
        while True:
            xyz += 2 * (np.random.random(( self.numpoints,3)) - 0.5)
            yield data

    def update(self, i):
        data = next(self.stream)
        self.scat._offsets3d = ( np.ma.ravel(data[:,0]) , np.ma.ravel(data[:,1]) , np.ma.ravel(data[:,2]) )
        return self.scat,

    def show(self):
        plt.show()

if __name__ == '__main__':
    a = AnimatedScatter()
    a.ani.save("movie.avi", codec='avi')
    a.show()