如何在使用滑块时更新直方图?

时间:2017-03-13 12:59:06

标签: python matplotlib slider

我想为正态分布建立直方图,并在平均值,标准偏差和样本量改变时更新图表;类似于帖子here

但是,我在使用update功能。在上面的例子中

l, = plot(f(S, 1.0, 1.0))

def update(val):
    l.set_ydata(f(S, sGmax.val, sKm.val))
使用

但是在绘制直方图时如何更改?因此,我不确定如何使用plt.hist的返回值,将它们正确传递给update,然后相应地更新绘图。任何人都可以解释一下吗?

这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider


def update(val):
    mv = smean.val
    stdv = sstd.val
    n_sample = round(sn.val)
    # what needs to go here? how to replace xxx
    xxx(np.random.normal(mv, stdv, n_sample))
    plt.draw()


ax = plt.subplot(111)
plt.subplots_adjust(left=0.25, bottom=0.25)

m0 = -2.5
std0 = 1
n0 = 1000
n_bins0 = 20

nd = np.random.normal(m0, std0, n0)

# what needs to be returned here?
plt.hist(nd, normed=True, bins=n_bins0, alpha=0.5)

axcolor = 'lightgray'
axmean = plt.axes([0.25, 0.01, 0.65, 0.03], axisbg=axcolor)
axstd = plt.axes([0.25, 0.06, 0.65, 0.03], axisbg=axcolor)
axssize = plt.axes([0.25, 0.11, 0.65, 0.03], axisbg=axcolor)

smean = Slider(axmean, 'Mean', -5, 5, valinit=m0)
sstd = Slider(axstd, 'Std', 0.1, 10.0, valinit=std0)
sn = Slider(axssize, 'n_sample', 10, 10000, valinit=n0)

smean.on_changed(update)
sstd.on_changed(update)
sn.on_changed(update)

plt.show()

1 个答案:

答案 0 :(得分:3)

一种选择是清除轴并重新绘制直方图。另一个选项,更符合matplotlib滑块examplel.set_value方法的精神,是使用numpy生成直方图数据,使用条形图并使用bar.set_height和{{更新1}}轴上有rescale。完整的例子是:

bar.set_x

更新:

使用清晰轴(import numpy as np import matplotlib.pyplot as plt from matplotlib.widgets import Slider def update(val): mv = smean.val stdv = sstd.val n_sample = round(sn.val) nd = np.random.normal(loc=mv, scale=stdv, size=n_sample) #Update barchart height and x values hist, bins = np.histogram(nd, normed=True, bins=n_bins0) [bar.set_height(hist[i]) for i, bar in enumerate(b)] [bar.set_x(bins[i]) for i, bar in enumerate(b)] ax.relim() ax.autoscale_view() plt.draw() def reset(event): mv.reset() stdv.reset() n_sample.reset() ax = plt.subplot(111) plt.subplots_adjust(left=0.25, bottom=0.25) m0 = -2.5 std0 = 1 n0 = 1000 n_bins0 = 20 nd = np.random.normal(m0, std0, n0) hist, bins = np.histogram(nd, normed=True, bins=n_bins0) b = plt.bar(bins[:-1], hist, width=.3) axcolor = 'lightgray' axmean = plt.axes([0.25, 0.01, 0.65, 0.03], axisbg=axcolor) axstd = plt.axes([0.25, 0.06, 0.65, 0.03], axisbg=axcolor) axssize = plt.axes([0.25, 0.11, 0.65, 0.03], axisbg=axcolor) smean = Slider(axmean, 'Mean', -5, 5, valinit=m0) sstd = Slider(axstd, 'Std', 0.1, 10.0, valinit=std0) sn = Slider(axssize, 'n_sample', 10, 10000, valinit=n0) smean.on_changed(update) sstd.on_changed(update) sn.on_changed(update) plt.show() )和重绘ax.cla()

的版本
ax.hist(...)