首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何强制matplotlib更新绘图

如何强制matplotlib更新绘图
EN

Stack Overflow用户
提问于 2010-08-19 00:00:14
回答 1查看 2.9K关注 0票数 2

我正在尝试构建一个小GUI,它有一个曲线图,每次读取新的数据样本时都会更新。我不喜欢使用计时器运行它,因为数据将以不同的时间间隔到达。相反,我正在尝试使用信号进行实现,其中数据收集函数将在读取数据时发出信号,然后绘画函数将在绘画完成时发出信号。

现在看来,问题是画布没有在我调用canvas.draw()时立即更新。当这个程序运行时,data_collect()和paint()轮流发送信号,但是这个图形直到我停止这个进程之后才会更新。当调用paint()时,如何强制matplotlib更新图形?

下面是一段相对简单的示例代码,它不是最优的,但希望能传达出我正在尝试做的事情的味道……

代码语言:javascript
运行
复制
N_length = 150;
count = [0];

def sinval(delay):

    k = 0;
    x = [];

    # set up data vector with sinusoidal data in it.
    while k < N_length:  
        x.append(math.sin(2*math.pi*k/N_length));
        k += 1;

    def next():

        time.sleep(delay);
        outstring = "%0.3e" % (x[count[0]]);

        if (count[0] == (N_length-1)):
            count[0] = 0;
        else:
            count[0] += 1;

        return outstring;

    return next;


class DesignerMainWindow(QtGui.QMainWindow, Ui_mplMainWindow):

    def __init__(self, parent = None):
        super(DesignerMainWindow, self).__init__(parent)
        self.setupUi(self)

        QtCore.QObject.connect(self.mplStartButton, QtCore.SIGNAL("clicked()"), self.start_graph);
        QtCore.QObject.connect(self.mplStopButton, QtCore.SIGNAL("clicked()"), self.stop_graph);
        QtCore.QObject.connect(self.mplQuitButton, QtCore.SIGNAL("clicked()"), QtGui.qApp, QtCore.SLOT("quit()"));
        QtCore.QObject.connect(self, QtCore.SIGNAL("data_collect()"), self.data_collect);
        QtCore.QObject.connect(self, QtCore.SIGNAL("paint()"), self.paint);

    def start_graph(self):

        # generates first "empty" plots
        self.user = [];
        self.l_user, = self.mpl.canvas.ax.plot([], self.user, label='sine wave');

        # set up the axes. 
        self.mpl.canvas.ax.set_xlim(0, 300);
        self.mpl.canvas.ax.set_ylim(-1.1, 1.1);
        self.mpl.canvas.draw();

        # start the data collection process.
        self.delay = 0.05;
        self.next = sinval(self.delay);
        self.emit(QtCore.SIGNAL('data_collect()'));


    def data_collect(self):
        outstring = self.next();
        self.user.append(float(outstring.split()[0]));
        self.l_user.set_data(range(len(self.user)), self.user);
        self.emit(QtCore.SIGNAL('paint()'));


    def paint(self):
        self.mpl.canvas.draw();
        self.emit(QtCore.SIGNAL('data_collect()'));
EN

Stack Overflow用户

发布于 2010-08-19 01:13:16

我猜在paint()之后调用QCoreApplication::processEvents会有所帮助。更优雅的做法是使用单独的QThread来读取数据。看看这个thread

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3514074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档