2016-08-18 1 views
0

새로운 데이터가 선택되면 PYQT 임베디드 Matplotlib 플롯을 다시 그리게 만들려고합니다. 첫 번째 플롯을 완벽하게 그립니다. 나는 온라인에서 보지 못했던 여러 가지 변형을 시도해 보았습니다. 어떤 도움이라도 대단히 감사합니다.PYQT4에 임베드 된 MatPlotlib를 새로 고치는 방법은 무엇입니까?

데프 mpl_plot (자기, plot_page, replot = 0) : #Data이 목록

하기 matplotlib를 삽입 할 때 pyplot 대신 객체 지향 API를 사용해야합니다
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  


    par1 = fig.add_subplot(1,1,1) 
    par2 = fig.add_subplot(1,1,1)  

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



    ax2.spines["right"].set_position(("outward", 25)) 
    self.make_patch_spines_invisible(ax2) 
    ax2.spines["right"].set_visible(True) 
    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] 

    #Plot Chart 
    plt.hold(True) #Has to be included for multiple curves 

    plt.plot(fac_flow, fac_lift, 'b', linestyle = "dashed", linewidth = 1) 

    #plt.plot(flow,f_lift,'b.') #Plot datapoints only 

    #Plot Factory Power 
    ax1.plot(fac_flow, fac_power, 'r', linestyle = "dashed", linewidth = 1) 
    #ax1.plot(flow,f_power,'r.') #Plot datapoints only 

    ax2.plot(fac_flow, fac_eff, 'g', linestyle = "dashed", linewidth = 1) 

    #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 = fac_max_eff * 0.90  

    bep_corrected = bep * 0.90 

    ax2.annotate('BEP', xy=(fac_max_eff_bpd, bep_corrected), xycoords='data', 
      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') 
    #ax1.set_ylabel("BHP", color = 'r') 
    #ax1.set_ylabel("Effiency", color = 'g') 

    # Set tight layout 
    fig = self.mplwidget.figure.tight_layout() 
    fig = self.mplwidget_2.figure.tight_layout() 
    fig = self.mplwidget_3.figure.tight_layout() 

답변

0

에 저장됩니다. PyQt4에 임베딩 예제를 보려면 here

그림을 다시 그리려면 FigureCanvas 개체의 draw() 메서드를 호출하십시오.

from matplotlib.figure import Figure 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 

fig = Figure() 
ax = fig.add_subplot(111) 
canvas = FigureCanvas(fig) 
canvas.show() 

canvas.draw() # Redraw figure 
+0

matplotlib를 처음 사용했습니다. 저는 Python xy 패키지와 QT 디자이너를 사용하고 있습니다. 파이썬 xy는 내가 사용하고있는 QT 용 MPL 위젯을 내장하고 있습니다. replot 때까지 나를 위해 잘 작동합니다 : 현재 설치 (pyplot) 다시 그리게 만들 수있는 방법이 있습니까? –

+0

필자는 파이썬 xy에 익숙하지 않지만'self.mplwidget.figure'를 통해 그림에 액세스 할 수있는 모양으로되어 있으므로'self.mplwidget.figure.canvas.draw()'를 호출 할 수 있어야합니다. – user3419537

+0

나는이 글을 쓴 후 주 플롯을 위해 일하고 있지만, 서브 플로트는 아직 명확하게 정리하지 않고 계속해서 그 위에 놓는 것을 발견했다. 누구든지 서브 플로트 처리에 대한 제안을 가지고 있습니까? –