Cle*_*leb 6 python slider matplotlib
我想构建正态分布的直方图,并在平均值、标准差和样本量发生变化时更新绘图;类似于这里的帖子。
然而,我对这个update功能很挣扎。在上面的例子中
l, = plot(f(S, 1.0, 1.0))
Run Code Online (Sandbox Code Playgroud)
和
def update(val):
l.set_ydata(f(S, sGmax.val, sKm.val))
Run Code Online (Sandbox Code Playgroud)
使用但绘制直方图时必须如何更改?因此,我不确定如何使用返回值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()
Run Code Online (Sandbox Code Playgroud)
一种选择是清除轴并重新绘制直方图。另一种选择,更符合l.set_valuematplotlib 滑块示例方法的精神,是使用 numpy 生成直方图数据,使用条形图并使用bar.set_height轴上的重新缩放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()
Run Code Online (Sandbox Code Playgroud)
更新:
使用清除轴 ( ax.cla()) 和重绘的版本ax.hist(...),
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)
#Redraw histogram
ax.cla()
ax.hist(nd, normed=True, bins=n_bins0, alpha=0.5)
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)
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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2741 次 |
| 最近记录: |