【问题标题】:Draw moving polygons with matplotlib使用 matplotlib 绘制移动多边形
【发布时间】:2015-08-11 16:24:02
【问题描述】:

我有许多多边形,其顶点在模拟的每个时间步都会移动,并且在计算出所有新的多边形形式之后,它们必须绘制到 matplotlib 图中。

当代码是静态的时,我使用路径和补丁来绘制多边形,比如

for polygon in P:
    path = Path(polygon)
    patch = patches.PathPatch(path, facecolor='none', lw=1)
    ax.add_patch(patch)

当然,在更新多边形时这样做会导致绘制最后一个多边形,这不是一个干净的更新。多边形的格式是一个带有numpy数组的列表,每一个都是多边形的一个顶点,如[[0.1223, 0.234], [0.123,0.4323], [0.2133, 0.5433]]

我确实可以将没有线条的顶点绘制为points = ax.plot(vertices[:,0], vertices[:,1], '.')[0],并使用points.set_data(...) 更新它们,然后绘制画布。我没有使用 FuncAnimation,因为我看到的示例由于 FuncAnimation 本身而更新了数据;在我的例子中,数据是通过迭代生成的,在每次迭代结束时,必须绘制多边形的变化。

【问题讨论】:

    标签: python matplotlib plot


    【解决方案1】:

    试试下面的例子。它将绘制一个在圆圈中移动的框。它应该很容易适应您的应用程序。

    import matplotlib.pyplot as plt
    from matplotlib.path import Path
    import matplotlib.patches as patches
    
    import numpy as np
    import math
    import time
    
    verts = np.array([[0.,0.],[0.,1.],[1.,1.],[1.,0.],[0.,0.]])
    
    codes = [Path.MOVETO,
             Path.LINETO,
             Path.LINETO,
             Path.LINETO,
             Path.CLOSEPOLY,
             ]
    
    path = Path(verts, codes)
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.set_xlim(-2,2)
    ax.set_ylim(-2,2)
    plt.show(block=False)
    i=0.0
    while i<100:
    #for i in range(100):
        ax.clear()
        x=math.sin(i)
        y=math.cos(i)
    
        print x, y
    
        verts2=np.copy(verts)
        for j in range(len(verts)):
            verts2[j]=verts[j]+np.array([x,y])
        path = Path(verts2, codes)
        patch = patches.PathPatch(path, facecolor='orange', lw=2)
        ax.add_patch(patch)
        plt.draw()
        i+=0.1
    

    【讨论】:

    • 确实,主要的变化是对于许多多边形,我必须遍历包含它们的列表,然后构建每个补丁,最后绘制所有内容。我认为关键是 ax.clear(),因为在旧代码中我有效地尝试了我无法“清除屏幕缓冲区”或清除最后一个情节。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 2019-08-26
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多