如何animation散点图?
我试图做一个散点图的animation,其中点的颜色和大小在animation的不同阶段发生变化。 对于数据我有两个numpy的ndarray x值和y值:
data.shape = (ntime, npoint) x.shape = (npoint) y.shape = (npoint)
现在我想绘制一个types的散点图
pylab.scatter(x,y,c=data[i,:])
并在索引i
创build一个animation。 我如何做到这一点?
以下是使用新animation模块的一个简单示例。
它比它要稍微复杂一点,但这应该给你一个框架来做更有趣的事情。
如果您在OSX上并使用OSX后端,则需要在下面的FuncAnimation
初始化FuncAnimation
blit=True
更改为blit=False
。 OSX后端不完全支持blitting。 性能会受到影响,但是该示例应该在禁用blitting的OSX上正常运行。
import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np class AnimatedScatter(object): """An animated scatter plot using matplotlib.animations.FuncAnimation.""" def __init__(self, numpoints=50): self.numpoints = numpoints self.stream = self.data_stream() # Setup the figure and axes... self.fig, self.ax = plt.subplots() # Then setup FuncAnimation. self.ani = animation.FuncAnimation(self.fig, self.update, interval=5, init_func=self.setup_plot, blit=True) def setup_plot(self): """Initial drawing of the scatter plot.""" x, y, s, c = next(self.stream) self.scat = self.ax.scatter(x, y, c=c, s=s, animated=True) self.ax.axis([-10, 10, -10, 10]) # For FuncAnimation's sake, we need to return the artist we'll be using # Note that it expects a sequence of artists, thus the trailing comma. return self.scat, def data_stream(self): """Generate a random walk (brownian motion). Data is scaled to produce a soft "flickering" effect.""" data = np.random.random((4, self.numpoints)) xy = data[:2, :] s, c = data[2:, :] xy -= 0.5 xy *= 10 while True: xy += 0.03 * (np.random.random((2, self.numpoints)) - 0.5) s += 0.05 * (np.random.random(self.numpoints) - 0.5) c += 0.02 * (np.random.random(self.numpoints) - 0.5) yield data def update(self, i): """Update the scatter plot.""" data = next(self.stream) # Set x and y data... self.scat.set_offsets(data[:2, :]) # Set sizes... self.scat._sizes = 300 * abs(data[2])**1.5 + 100 # Set colors.. self.scat.set_array(data[3]) # We need to return the updated artist for FuncAnimation to draw.. # Note that it expects a sequence of artists, thus the trailing comma. return self.scat, def show(self): plt.show() if __name__ == '__main__': a = AnimatedScatter() a.show()
举个简单的例子,看看下面的内容:
import matplotlib.pyplot as plt import numpy as np import matplotlib.animation as animation def main(): numframes = 100 numpoints = 10 color_data = np.random.random((numframes, numpoints)) x, y, c = np.random.random((3, numpoints)) fig = plt.figure() scat = plt.scatter(x, y, c=c, s=100) ani = animation.FuncAnimation(fig, update_plot, frames=xrange(numframes), fargs=(color_data, scat)) plt.show() def update_plot(i, data, scat): scat.set_array(data[i]) return scat, main()
这是事情。 我曾经是Qt和Matlab的用户,我对matplotlib上的animation系统还不是很熟悉。
但是我确实已经find了一种方法,可以使任何types的animation,就像在MATLAB中一样。 它真的很强大。 不需要检查模块引用,你很好地绘制任何你想要的。 所以我希望它可以帮助。
基本的想法是使用PyQt中的时间事件(我相信Python上的其他Gui系统,比如wxPython和TraitUi,有相同的内部机制来做事件响应,但我不知道如何)。 每次PyQt的Timer事件被调用时,我刷新整个canvas并重绘整个画面,我知道速度和性能可能会受到慢慢的影响,但并不是那么多。
这是一个小例子:
import sys from PyQt4 import QtGui from matplotlib.figure import Figure from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas import numpy as np class Monitor(FigureCanvas): def __init__(self): self.fig = Figure() self.ax = self.fig.add_subplot(111) FigureCanvas.__init__(self, self.fig) self.x = np.linspace(0,5*np.pi,400) self.p = 0.0 self.y = np.sin(self.x+self.p) self.line = self.ax.scatter(self.x,self.y) self.fig.canvas.draw() self.timer = self.startTimer(100) def timerEvent(self, evt): # update the height of the bars, one liner is easier self.p += 0.1 self.y = np.sin(self.x+self.p) self.ax.cla() self.line = self.ax.scatter(self.x,self.y) self.fig.canvas.draw() if __name__ == "__main__": app = QtGui.QApplication(sys.argv) w = Monitor() w.setWindowTitle("Convergence") w.show() sys.exit(app.exec_())
你可以调整刷新速度
self.timer = self.startTimer(100)
我就像你想要使用animation散点图做一个sortinganimation。 但是我找不到所谓的“设置”function。 所以我刷新了整个canva。
希望它有助于..