【问题标题】:Python Tkinter: Embed a matplotlib plot in a widgetPython Tkinter:在小部件中嵌入 matplotlib 图
【发布时间】:2013-09-14 00:31:51
【问题描述】:

我已经搜索过这个,例如Python Tkinter Embed Matplotlib in GUI,但仍然无法弄清楚。基本上,我正在尝试在由 tkinter 组成的播放器窗口内为篮球比赛的球员能力绘制一个精美的图表

    self.fig = Figure(figsize=(1.5,1.5))
    self.ax = self.fig.add_axes([0.025,0.025,0.95,0.95],polar=True)
    self.plot_widget = FigureCanvasTkAgg(self.fig, master=self.top)
    self.ax.grid(False)

    N = 5
    theta = np.arange(0.0, 2*np.pi, 2*np.pi/N)
    radii = [self.thisPlayer.rebounds,self.thisPlayer.freeThrows,self.thisPlayer.steal,self.thisPlayer.underRim,self.thisPlayer.distance]
    width = [2*np.pi/(N),2*np.pi/(N),2*np.pi/(N),2*np.pi/(N),2*np.pi/(N)]
    bars = pl.bar(0 , 20,width=2*np.pi, linewidth = 0) + pl.bar(theta, radii, width=width, bottom=0.2)

    for r,bar in zip(radii, bars):
        bar.set_facecolor( cm.jet(r/20.))
        bar.set_alpha(0.5)

    self.ax.set_xticklabels([])
    self.ax.set_yticklabels([])
    self.plot_widget.show()
    self.plot_widget.get_tk_widget().pack()

发生的情况是播放器窗口现在具有绘图小部件,但未显示绘图。另一方面,仅绘制未嵌入 tkinter 的功能就可以正常工作。对不起我的英语不好。 提前致谢

【问题讨论】:

    标签: python matplotlib plot tkinter embed


    【解决方案1】:

    设置self.ax 后,您需要调用self.ax.bar,而不是pl.bar 来绘制self.fig 中的条形图。这是一个可运行的示例:

    import matplotlib.pyplot as plt
    import numpy as np
    import Tkinter as tk
    import matplotlib.figure as mplfig
    import matplotlib.backends.backend_tkagg as tkagg
    pi = np.pi
    
    
    class App(object):
        def __init__(self, master):
            self.master = master
            self.thisPlayer = Bunch(
                rebounds=20.0,
                freeThrows=5.0,
                steal=5.0,
                underRim=10,
                distance=10)
            self.fig = mplfig.Figure(figsize=(1.5, 1.5))
            self.ax = self.fig.add_axes([0.025, 0.025, 0.95, 0.95], polar=True)
            self.canvas = tkagg.FigureCanvasTkAgg(self.fig, master=master)
            self.ax.grid(False)
    
            N = 5
            theta = np.arange(0.0, 2 * pi, 2 * pi / N)
            radii = [self.thisPlayer.rebounds, self.thisPlayer.freeThrows,
                     self.thisPlayer.steal, self.thisPlayer.underRim,
                     self.thisPlayer.distance]
            width = [2 * pi / (N)] * 5
            bars = (
                # self.ax.bar(0, 20, width=2 * pi, linewidth=0) +
                self.ax.bar(theta, radii, width=width, bottom=0.2))
            cmap = plt.get_cmap('jet')
            for r, bar in zip(radii, bars):
                bar.set_facecolor(cmap(r / 20.))
                bar.set_alpha(0.5)
            self.ax.set_xticklabels([])
            self.ax.set_yticklabels([])
            self.canvas.get_tk_widget().pack()
            self.canvas.draw()
    
    
    class Bunch(object):
        """
        http://code.activestate.com/recipes/52308
        foo=Bunch(a=1,b=2)
        """
        def __init__(self, **kwds):
            self.__dict__.update(kwds)
    
    
    def main():
        root = tk.Tk()
        app = App(root)
        tk.mainloop()
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      猜你喜欢
      • 2015-02-17
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多