【问题标题】:Matplotlib in Python - Drawing shapes and animating themPython 中的 Matplotlib - 绘制形状并为其设置动画
【发布时间】:2011-01-07 17:34:19
【问题描述】:

所以我代表一个令牌环网络(在 SimPy 中进行模拟),我是 matplotlib 的新手,但有人告诉我,它非常适合直观地表示我的模拟。

所以我四处搜索,发现如何绘制形状和线条 - 分别使用 add_patch 和 add_line 到轴(我相信)。所以现在我有这个输出,非常好:

(还不能发布图片!!) http://img137.imageshack.us/img137/7822/screenshot20100121at120.png

但是我使用 pylab.show() 函数得到了这个,我想我想要的是使用 pylab.plot() 函数来实现这个,这样我就可以在使用 pylab 进行模拟时更新它。 draw() 之后。

我的代码如下:

plab.ion()

plab.axes()

for circ in self.circleList:
    plab.gca().add_patch(circ)

for line in self.lineList:
    plab.gca().add_line(line)

plab.axis('scaled')
plab.show()

其中 circleList 和 lineList 是包含图表上的圆和线的列表

我可能在这里误解了一些简单的东西,但我实际上找不到任何使用 plot() 函数的不明显基于图形的示例。


澄清:

如何使用 pylab.plot() 而不是 pylab.show() 获得相同的输出?

【问题讨论】:

    标签: python networking matplotlib simulation


    【解决方案1】:

    使用绘图方法复制您的图像:

    from pylab import *
    
    points = []
    points.append((-0.25, -1.0))
    points.append((0.7, -0.7))
    points.append((1,0))
    points.append((0.7,1))
    points.append((-0.25,1.2))
    points.append((-1,0.5))
    points.append((-1,-0.5))
    points.append((-0.25, -1.0))
    
    a_line = plot(*zip(*points))[0]
    a_line.set_color('g')
    a_line.set_marker('o')
    a_line.set_markerfacecolor('b')
    a_line.set_markersize(30)
    axis([-1.5,1.5,-1.5,1.5])
    
    show()
    

    根据评论进行编辑

    这使用 python 多处理库在单独的进程中运行 matplotlib 动画。主进程使用队列将数据传递给它,然后更新绘图图像。

    # general imports
    import random, time
    from multiprocessing import Process, Queue
    
    # for matplotlib
    import random
    import numpy as np
    import matplotlib
    matplotlib.use('GTKAgg') # do this before importing pylab
    
    import matplotlib.pyplot as plt
    from matplotlib.patches import Circle
    
    
    def matplotLibAnimate(q,points):
    
        # set up initial plot
        fig = plt.figure()
        ax = fig.add_subplot(111)
    
    
        circles = []
        for point in points:
            ax.add_patch(Circle(point,0.1))
    
        a_line, = ax.plot(*zip(*points))
        a_line.set_color('g')
        a_line.set_lw(2)
    
        currentNode = None  
        def animate(currentNode = currentNode):
            while 1:
                newNode = q.get()
                if currentNode: currentNode.remove()
                circle = Circle(newNode,0.1)
                currentNode = ax.add_patch(circle)
                circle.set_fc('r')
                fig.canvas.draw()
    
        # start the animation
        import gobject
        gobject.idle_add(animate)
        plt.show()
    
    #initial points
    points = ((-0.25, -1.0),(0.7, -0.7),(1,0),(0.7,1),(-0.25,1.2),(-1,0.5),(-1,-0.5),(-0.25, -1.0))
    q = Queue()
    p = Process(target = matplotLibAnimate, args=(q,points,))
    p.start()
    
    # feed animation data
    while 1:
        time.sleep(random.randrange(4))
        q.put(random.sample(points,1)[0])
    

    当然,在这样做之后,我认为 whatnick 的图像解决方案会更好地为您服务。我会创建自己的 GUI,而不是使用内置小部件的 matplotlibs。然后我会通过生成 PNG 并交换它们来“动画化”我的 GUI。

    【讨论】:

    • 马克,感谢您的帮助。澄清一下——我需要的是当一个标记在圆圈周围移动时改变圆圈的颜色(即带有标记的那个可能是红色的,其他的可能是绿色的)这是由一个实时运行的模拟库驱动的.我知道您可以在交互模式打开时使用 pylab.draw() 方法即时重绘绘图(pylab.ion),但您不能重绘使用 pylab.show() 生成的图形,只有 pylab.plot 生成的图形()(我认为!!)所以我需要一种在重绘之前单独更改圆圈颜色的方法。希望这更有意义!谢谢
    • @Duncan,pylab.draw() 会阻止应用程序的其余部分,通过一个回调函数使用它来制作动画。函数的传递方式取决于您的后端。例如,使用默认 GTK,您调用 gobject.idle_add(animate); plt.show()。我认为您的主要问题是如何保持模拟运行(在单独的进程或线程中)并同时更新 GTK 窗口。我会试着做一个例子。
    【解决方案2】:

    听起来 Mark 有您正在寻找的答案,但如果您决定采用 whatnick 的方法并从单个 png 构建动画,这里是实现 Amit 建议使用 mencoder 的代码(来自 http://en.wikibooks.org/wiki/Mplayer):

    mencoder mf://*.png -mf w=400:h=400 -ovc lavc -lavcopts vcodec=xvid -of avi -o output.avi
    

    【讨论】:

      【解决方案3】:

      核心技术是使用 set_data 更新正在渲染的元素的数据。然后调用draw()。看看你的圆和线元素是否有 set_data 功能。否则你可以使用pyvtk。另一种选择是将绘图渲染并保存为 png 文件,然后根据这些文件构建动画。

      【讨论】:

      • 为了补充这个答案,我最近做了这样的事情:我保存了我所有的情节,后来用'mencoder'制作了一部'电影'
      • 我知道有一种“即时”的方法:通过打开交互模式,您可以调用 pylab.draw() 方法,该方法每次都会重绘绘图。我已经有了改变数据等的方法(我只是改变我的一个圆圈的颜色)我只想知道,我如何使用 pylab.plot() 在图中显示圆圈和线条,我不知道 pylab.plot() 的语法,它让您只绘制具有某些形状的标准图,而没有图形或任何东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 2010-12-18
      • 2014-08-15
      相关资源
      最近更新 更多