1

I'm trying to make the interactive histogram but during

update old histogram is not been cleared, as shown in the image below.

enter image description here)

above plot is generated using following code

from functools import lru_cache
import scipy.stats as ss
import matplotlib.pyplot as plt
import matplotlib.widgets as widgets

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.25)

weight = ss.lognorm(0.23, 0, 70.8)

@lru_cache
def sampling(n):
    return [ weight.rvs().mean() for i in range(1000) ]

theme = {
    'color' : "#1f77b4",
    'alpha' : 0.7,
}

t = ax.hist(sampling(100), **theme)

slider = widgets.Slider(
    ax      = plt.axes([0.25, 0.1, 0.5, 0.03]),
    label   = "n",
    valmin  = 10,
    valmax  = 1000,
    valinit = 100,
    valstep = 1

def update(val):
    global t
    del t
    t = ax.hist(sampling(int(val)), **theme)
    fig.canvas.draw_idle()

slider.on_changed(update)
ax.set_title('Distribution of Sample Size Mean')
plt.show()
rho
  • 771
  • 9
  • 24

1 Answers1

3

ax.hist is returning a tuple containing the number of bins, the edges of the bins and then the patches... you thus need to capture the patches and remove them in update.

You need to use t.remove() in update, as in:

*_, patches = ax.hist()

def update(val):
    global patches
    for p in patches:
        p.remove()

    *_, patches = ax.hist(sampling(int(val)), **theme)
    fig.canvas.draw_idle()
Andrew Micallef
  • 360
  • 1
  • 10