Problem
I want to display a slider linked to a Play button from ipywidgets and then update an imshow
plot from matplotlib. However I want the image to stay there and only draw the artists that changed and not have to clear the output to draw everything again. bqplot handles this situation quite well but the displaying a gridheatmap has revealed challenging for editing tick labels and other parts of the design that matplotlib handles so well. Some people have used interact
but that approach limits my freedom to handle traitlets.
My code
slider=wd.IntSlider(value=0,min=0,max=49,continuous_update=False)
play_button=wd.Play(
value=0,
min=0,
max=49,
step=1,
interval=850,
description="Press play",
disabled=False
)
def slider_update():
global im
global fig
slider.value=change.new
label.value="Time: {}".format(slider.value)
with out:
new_data=random_data[:,:,slider.value]
im.set_data(new_data)
im.set_clim(0,np.max(new_data))
background = fig.canvas.copy_from_bbox(ax.bbox)
fig.canvas.flush_events()
fig.canvas.restore_region(background)
ax.draw_artist(im)
fig.canvas.blit(ax.bbox)
plt.show(fig)
label=wd.Label("Time: 0")
# slider.observe(slider_update, "value")
wd.jslink((play_button,"value"),(slider,"value"))
widget=wd.interactive(slider_update,idx=slider)
out=wd.Output()
app=wd.VBox([wd.HBox([play_button,slider,label]),out])
display(app)
Output
Intended output
But the image updates only the artiosts so as to get a smooth animation (this last image was accomplished by having display(app,fig)
which does not do what I want.
Can anyone give a hand?