How can i clean up previous drawing before drawing again with matplotlib in PySimpleGui?
I wanted to draw a bar chart which i could be able to draw but not able to delete using the following code:
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import PySimpleGUI as sg
import random
layout=[[sg.B('Draw'),sg.B('Delete')],[sg.Canvas(key='canvas1')]]
window=sg.Window("Test", layout)
def draw_figure(canvas, figure):
figure_canvas_agg = FigureCanvasTkAgg(figure, canvas)
figure_canvas_agg.get_tk_widget().forget()
figure_canvas_agg.draw()
figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=1)
return figure_canvas_agg
def drawBars(x_data,y_data,barColor,legend):
plt.cla()
p1 = plt.bar(x_data, y_data, width=0.9, color=barColor)
plt.legend((p1[0],), (legend,))
plt.tight_layout()
fig = plt.gcf()
return fig
l=range(1,10)
y_data=list(l)
x_data=list(random.sample(l,len(l)))
while True:
event, value = window.read()
if event == sg.WIN_CLOSED:
break
if event == 'Draw':
draw_figure(window['canvas1'].TKCanvas, drawBars(x_data,y_data,'red','plot'))
if event == 'Delete':
pass
#what code i should here to do the job?
window.close()
Are there any functions that i can call to clean up any previous drawings? Can someone please helpme with it, i was looking for it for really really long time in google, all i found are some related codes [1] that didn't work well with me, i couldn't find a simple and clean one. Thank you guys.
[1]https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Matplotlib_Browser.py
CodePudding user response:
I put your code into OpenAI's Codex, and this is what I got back:
Code
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import PySimpleGUI as sg
import random
layout=[[sg.B('Draw'),sg.B('Delete')],[sg.Canvas(key='canvas1')]]
window=sg.Window("Test", layout)
def draw_figure(canvas, figure):
figure_canvas_agg = FigureCanvasTkAgg(figure, canvas)
figure_canvas_agg.get_tk_widget().forget()
figure_canvas_agg.draw()
figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=1)
return figure_canvas_agg
def drawBars(x_data,y_data,barColor,legend):
plt.cla()
p1 = plt.bar(x_data, y_data, width=0.9, color=barColor)
plt.legend((p1[0],), (legend,))
plt.tight_layout()
fig = plt.gcf()
return fig
l=range(1,10)
y_data=list(l)
x_data=list(random.sample(l,len(l)))
figure_canvas_agg = None
while True:
event, value = window.read()
if event == sg.WIN_CLOSED:
break
if event == 'Draw':
if figure_canvas_agg is not None:
figure_canvas_agg.clear()
figure_canvas_agg = draw_figure(window['canvas1'].TKCanvas, drawBars(x_data,y_data,'red','plot'))
if event == 'Delete':
if figure_canvas_agg is not None:
figure_canvas_agg.clear()
window.close()
Explanation of changes
- Added a global variable
figure_canvas_agg
to store theFigureCanvasTkAgg
object. - In the
Draw
event, check if thefigure_canvas_agg
is notNone
. If it is notNone
, call theclear
method of theFigureCanvasTkAgg
object. - In the
Delete
event, check if thefigure_canvas_agg
is notNone
. If it is notNone
, call theclear
method of theFigureCanvasTkAgg
object.