Python Tkinter: Embed a matplotlib plot in a widget
11,584
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()
Author by
Admin
Updated on June 04, 2022Comments
-
Admin almost 2 years
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