实时动态标绘

2024-05-19 12:25:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于从matplotlib动态更新散点图的问题。 我有下面的Python类

''' PolygonHandler.py - Python source for polygon handling '''
import numpy as np
import matplotlib.pyplot as plt


class PolygonHandler:
    # Constructor
    def __init__(self):
        self.X = []
        self.Y = []
        self.numberPoints = 0

    # Print the polygon
    def draw(self):
        plt.scatter(self.X,self.Y)
        plt.draw()

    def update(self):
        for i in range(1,self.numberPoints):
            self.X[i] += np.random.normal()*0.01
            self.Y[i] += np.random.normal()*0.01


    # append a point
    def add(self,x,y):
        self.numberPoints += 1
        self.X.append(x)
        self.Y.append(y)

该类用于接收信息并将点添加到PolygonHandler类的实时循环中。现在作为一个例子,我想设计以下循环

^{pr2}$

如何告诉翻译绘制散点图,并在更新后删除之前的点?现在,我的图绘制了这些点和它们以前的位置。在

文森特

非常感谢你的帮助

另一个问题是matplotlib打开的窗口一旦我点击它(比如把它移到屏幕上的另一个地方)就会冻结并停止应答,有没有办法防止这种情况发生?在


Tags: importselfformatplotlibdefasnpplt
1条回答
网友
1楼 · 发布于 2024-05-19 12:25:11

这里有一个方法可以使用matplotlib中的动画。在

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

class PolygonHandler:
    # Constructor
    def __init__(self):
        self.X = []
        self.Y = []
        self.numberPoints = 0
        self.fig , ax = plt.subplots()
        self.sc = ax.scatter(self.X,self.Y)
        ax.set_xlim(0,3)
        ax.set_ylim(0,3)

    # Print the polygon
    def update(self,_):
        for i in range(self.numberPoints):
            self.X[i] += np.random.normal()*0.01
            self.Y[i] += np.random.normal()*0.01
        self.sc.set_offsets(np.column_stack((self.X,self.Y)))
        return self.sc,

    # append a point
    def add(self,x,y):
        self.numberPoints += 1
        self.X.append(x)
        self.Y.append(y)

这样你就可以画出你的3次随机行走:

^{pr2}$

关键元素是方法set_offsets(),它替代散点图的数据。然后这样的散点对象由update()返回,这样matplotlib知道它必须被更新。有关类处理的matplotlib动画的另一个源,请参见thismatplotlib示例。在

最后一行中blit=True时,动画速度更快,但根据您的操作系统,它可能无法工作。在

相关问题 更多 >