0

Someone suggested earlier that I call fig.canvas.draw() to refresh my plot with new data. It worked great on the main plot, however I also have subplots included in the chart. The subplots are getting redrawn, however the old subplots, along with axes and other items are not getting cleared. Does anyone know how to get rid of the old subplot curves and other items when I replot?

def mpl_plot(self, plot_page, replot = 0):  #Data stored in lists  

    if plot_page == 1:             #Plot 1st Page                        
        plt = self.mplwidget.axes                                
        fig = self.mplwidget.figure #Add a figure           

    if plot_page == 2:          #Plot 2nd Page
        plt = self.mplwidget_2.axes 
        fig = self.mplwidget_2.figure    #Add a figure

    if plot_page == 3:           #Plot 3rd Page
        plt = self.mplwidget_3.axes 
        fig = self.mplwidget_3.figure    #Add a figure    

    if replot == 1:

        #self.mplwidget_2.figure.clear()          

        print replot

    par1 = fig.add_subplot(111)
    par2 = fig.add_subplot(111)      


    #Add Axes
    ax1 = par1.twinx()        
    ax2 = par2.twinx() 



    impeller = str(self.comboBox_impellers.currentText())  #Get Impeller
    fac_curves = self.mpl_factory_specs(impeller)    
    fac_lift = fac_curves[0]        
    fac_power = fac_curves[1]
    fac_flow = fac_curves[2]
    fac_eff = fac_curves[3]        
    fac_max_eff = fac_curves[4]
    fac_max_eff_bpd = fac_curves[5]
    fac_ranges = self.mpl_factory_ranges()
    min_range = fac_ranges[0]
    max_range = fac_ranges[1]
    #bep = fac_ranges[2]
    #Plot Chart
    plt.hold(False)    #Has to be included for  multiple curves
    #Plot Factory Pressure
    plt.plot(fac_flow, fac_lift, 'b', linestyle = "dashed", linewidth = 1)



    #Plot Factory Power
    ax1.plot(fac_flow, fac_power, 'r', linestyle = "dashed", linewidth = 1)       
    ax2.plot(fac_flow, fac_eff, 'g', linestyle = "dashed", linewidth = 1)


    #Move spines
    ax2.spines["right"].set_position(("outward", 25))
    self.make_patch_spines_invisible(ax2)
    ax2.spines["right"].set_visible(True)  
    #Plot x axis minor tick marks
    minorLocatorx = AutoMinorLocator()        
    ax1.xaxis.set_minor_locator(minorLocatorx)
    ax1.tick_params(which='both', width= 0.5)
    ax1.tick_params(which='major', length=7)
    ax1.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')
    #Make Border of Chart White


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

    #set shaded Area 
    plt.axvspan(min_range, max_range, facecolor='#9BE2FA', alpha=0.5)    #Yellow rectangular shaded area

    #Set Vertical Lines
    plt.axvline(fac_max_eff_bpd, color = '#69767A')

    #BEP MARKER   *** Can change marker style if needed
    bep = fac_max_eff * 0.90     #bep is 90% of maximum efficiency point

    bep_corrected = bep * 0.90   # We knock off another 10% to place the arrow correctly on chart

    ax2.annotate('BEP', xy=(fac_max_eff_bpd, bep_corrected), xycoords='data',   #Subtract 2.5 shows up correctly on chart
            xytext=(-50, 30), textcoords='offset points',
            bbox=dict(boxstyle="round", fc="0.8"),
            arrowprops=dict(arrowstyle="-|>",
                            shrinkA=0, shrinkB=10,
                            connectionstyle="angle,angleA=0,angleB=90,rad=10"),
                    )
    #Set Scales         
    plt.set_ylim(0,max(fac_lift) + (max(fac_lift) * 0.40))    #Pressure 
    #plt.set_xlim(0,max(fac_flow))

    ax1.set_ylim(0,max(fac_power) + (max(fac_power) * 0.40))     #Power
    ax2.set_ylim(0,max(fac_eff) + (max(fac_eff) * 0.40))    #Effiency


    # Set Axes Colors
    plt.tick_params(axis='y', colors='b')
    ax1.tick_params(axis='y', colors='r')
    ax2.tick_params(axis='y', colors='g')

    # Set Chart Labels        
    plt.set_xlabel("BPD")
    plt.set_ylabel("Feet" , color = 'b')

    #To redraw plot


    fig.canvas.draw()
Mike C.
  • 1,761
  • 2
  • 22
  • 46
  • 2
    A general comment: You should not mix OO syntax and matplab-like syntax. Especially in your case of embedding into QT, stick with matplotlibs OO Api. – MaxNoe Aug 18 '16 at 22:24
  • Yes, you can use the [fig.clf()](http://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure.clf) command. Take a look into [this question](http://stackoverflow.com/questions/8213522/matplotlib-clearing-a-plot-when-to-use-cla-clf-or-close). And I agree, by the way, with @MaxNoe comment. The hybrid composition of your plotting code is bound to cause you problems eventually. Treat each figure as its on object and leave the plt instructions to the bare minimum. – armatita Aug 21 '16 at 12:36

0 Answers0