2013-06-12 116 views
0

我在單獨GtkNotebook選項卡和在不同的類以下代碼:matlibplot生成情節混亂

劇情NO.1:

 self.vsm_fig = plt.figure(1) 
     subplots_adjust(bottom=0.20) 
     self.vsm_canvas = FigureCanvas(self.vsm_fig) 
     self.vsm_chart_vbox.pack_start(self.vsm_canvas) 
     self.vsm_toolbar = NavigationToolbar(self.vsm_canvas, self.vsm_chart_vbox) 
     self.vsm_chart_vbox.pack_start(self.vsm_toolbar,False,False, 3) 

     if len(results_vsm) >= 1: 
      for key,value in results_vsm.items(): 
       plt.plot([0,1],[0,value], label=key) 
      plt.axis([0, 1, 0, 1]) 
      plt.legend() 
      plt.show() 
      self.vsm_canvas.draw() 

劇情NO.2:

 self.tf_idf_fig = plt.figure(2)  
     subplots_adjust(bottom=0.20) 
     self.tf_idf_canvas = FigureCanvas(self.tf_idf_fig) 
     self.tf_idf_chart_vbox.pack_start(self.tf_idf_canvas) 
     self.tf_idf_toolbar = NavigationToolbar(self.tf_idf_canvas, self.tf_idf_chart_vbox) 
     self.tf_idf_chart_vbox.pack_start(self.tf_idf_toolbar,False,False, 3) 

     if len(results_tfidf) >= 1: 
      plt.bar(*zip(*zip(count(), results_tfidf.values()))) 
      plt.title("TF IDF Chart") 
      plt.xticks(*zip(*zip(count(), results_tfidf.keys())),rotation='vertical') 
      plt.xlabel("Word") 
      plt.ylabel("TF*IDF") 
      self.tf_idf_canvas.draw() 

爲什麼當我執行self.tf_idf_canvas.draw()的第二個標籤不會生成情節。我試圖用plt.show()來看看會發生什麼,結果這兩個地塊是生成的。

回答

1

混合由pylab或pyplot後端和命令提供的matplotlib類通常不是一個好主意。我有很多問題(memleaks等),直到我清理掉所有pylab調用並使用類方法。

所以添加你需要的進口喜歡

from matplotlib.figure import Figure 
from matplotlib.backends.backend_gtkagg import\ 
    FigureCanvasGTKAgg as FigureCanvas 
from matplotlib.backends.backend_gtkagg import\ 
    NavigationToolbar2GTKAgg as NavigationToolbar 

等,與任何GTK後端你想使用。

然後,

self.vsm_fig = Figure() 
self.vsm_fig.subplots_adjust(bottom=0.20) 
... 
    plot = self.vsm_fig.add_subplot() 
    plot.bar(*zip(*zip(count(), results_tfidf.values()))) 
    plot.set_title("TF IDF Chart") 
    plot.set_xticks(*zip(*zip(count(), results_tfidf.keys())),rotation='vertical') 
    plot.set_xlabel("Word") 
    plot.set_ylabel("TF*IDF") 
    self.vsm_canvas.show_now() 

,並相應地與所述第二曲線。確保你沒有遺漏任何東西的最簡單的方法就是刪除pylab或pyplot導入並查看彈出錯誤的位置。