matlibplot生成情节混乱

时间:2013-06-12 10:17:40

标签: python gtk

我在单独的GtkNotebook标签和不同的类中有以下代码:

第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() 

情节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 个答案:

答案 0 :(得分:1)

混合后端提供的matplotlib类和来自pylab或pyplot的命令通常不是一个好主意。我有很多问题(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导入并查看错误弹出的位置。