Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Tkinter: Embed a matplotlib plot in a widget

I have already search for this, for example Python Tkinter Embed Matplotlib in GUI but still can't figure it out. Basically i am trying to plot a fancy graph for a player abilities for a basketball game inside the player window made up with 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()

what happens is that the player window has now the plot widget but the plot is not shown. On the other side, just plotting the abilities not embedded in tkinter works fine. Sorry for my english. thanks in advance

like image 920
Costantino Avatar asked Dec 10 '25 08:12

Costantino


1 Answers

After you setup self.ax, you need to call self.ax.bar, not pl.bar to plot the bars in self.fig. Here's a runnable example:

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()
like image 91
unutbu Avatar answered Dec 13 '25 19:12

unutbu



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!