使用Matplotlib和PyQt4更快地重新绘制

时间:2016-09-15 22:19:27

标签: python python-2.7 matplotlib pyqt4

我正试图移动一个光标'通过插入x,y坐标作为函数参数,在我的图形中。我每秒只能达到一帧,因为我的功能是绘制整个图形而不是重新绘制点(光标)。我正在使用Pythonxy包附带的QT设计器中的Matplotlib小部件。有没有办法重新绘制ax3.plot线,如下所示,并省略其他一切?我见过使用循环的例子,但是我不能这样做,因为我已经在GUI循环中了。我的解决方案是在我想要重新绘制时使用工作线程来表示GUI线程中的函数,但是除非我重绘整个绘图,否则我没有多少运气。我也看着blitting。我认为我的解决方案可能就在那里,但在阅读完文档之后,我仍然不确定如何实现它。我非常感谢能得到的任何帮助。

from PyQt4 import QtGui
import ui_sof_test  #Gui File
import sys
from matplotlib.ticker import AutoMinorLocator

class Gui(QtGui.QMainWindow, ui_sof_test.Ui_MainWindow):    
    def __init__(self):        
        super(self.__class__, self).__init__()        
        self.setupUi(self)  # This is defined in ui_pumptest.py file automatically       
        self.mpl_plot(0)  
        self.move_dot()

    cursorplot = 0
    def move_dot(self, x = 100, y = 5, color = 'r'):
        fig = self.mplwidget_3.figure
        par = fig.add_subplot(111)
        ax3 = par.twinx()
        plty = fig.gca()
        plty.yaxis.set_visible(False)                
        ax3.plot(x, y, color, marker = 'o', linewidth = 1)                
        fig.canvas.draw()
        #ax3.cla()                

    def mpl_plot(self, plot_page, replot = 0):  #Data stored in lists 
        fig = self.mplwidget_3.figure    #Add a figure   
        #Clears Figure if data is replotted
        if replot == 1:
            fig.clf()
        plty = fig.gca()
        plty.yaxis.set_visible(False)        
        par0 = fig.add_subplot(111)
        #Add Axes
        plt = par0.twinx()
        #Plot Chart
        plt.hold(False)        
        plt.plot([0,100,200,300,400,500], [1,3,2,4,7,5], 'b', linestyle = "dashed", linewidth = 1) 
        #Plot Factory Power        
        minorLocatorx = AutoMinorLocator()        
        plt.xaxis.set_minor_locator(minorLocatorx)
        plt.tick_params(which='both', width= 0.5)
        plt.tick_params(which='major', length=7)
        plt.tick_params(which='minor', length=4, color='k')

        #Plot y axis minor tick marks
        minorLocatory = AutoMinorLocator()
        plt.yaxis.set_minor_locator(minorLocatory)
        plt.tick_params(which='both', width= 0.5)
        plt.tick_params(which='major', length=7)
        plt.tick_params(which='minor', length=4, color='k')

        plt.minorticks_on()
        #Make Border of Chart White
        fig.set_facecolor('white')    

        #Plot Grid        
        plt.grid(b=True, which='both', color='k', linestyle='-') 

        #Manually make vertical gridlines. Above line doesn't make vertical lines for some reason
        for xmaj in plt.xaxis.get_majorticklocs():
            plt.axvline(x=xmaj, color = 'k',ls='-')
        for xmin in plt.xaxis.get_minorticklocs():
            plt.axvline(x=xmin, color = 'k', ls='-')

        #Set Scales         

        plt.yaxis.tick_left()

        # Set Axes Colors
        plt.tick_params(axis='y', colors='b')       
        # Set Chart Labels        
        plt.yaxis.set_label_position("left")
        plt.set_xlabel(" ")
        plt.set_ylabel(" " , color = 'b')
        fig.canvas.draw() 
        self.move_dot()

def main():
    app = QtGui.QApplication(sys.argv)  # A new instance of QApplication
    form = Gui()  # We set the form to be our ExampleApp (design)
    form.show()  # Show the form
    app.exec_()  # and execute the. app

if __name__ == '__main__':  # if we're running file directly and not importing it
    main()  # run the main function

0 个答案:

没有答案