3

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

1 Answer 1

4

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()
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.