2017-03-13 6 views
3

標準分布のヒストグラムを作成し、平均、標準偏差、およびサンプルサイズが変更されたときにプロットを更新したいと思います。ポストに類似する。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() 

答えて

2

1つのオプションは、軸をクリアし、ちょうどヒストグラムを再プロットすることです。もう1つの選択肢は、マットプロットスライダーexamplel.set_valueアプローチの精神で、numpyでヒストグラムデータを生成し、棒グラフを使用してbar.set_heightbar.set_xを軸としてrescaleで更新することです。完全な例は次のようになります。

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() 

UPDATE:明確な軸(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() 
+0

を再描画します、ticks、ticklabels)、 'ax.clear()' 'ax.hist()'の解決策よりも好きな点はありません。したがって、(簡単な)ソリューションのコードも提供したいと思うかもしれません。 – ImportanceOfBeingErnest

+0

それは仕事を完了したようです、ありがとう(upvoted)!あなたが@ImportanceOfBeingErnestの提案に従ってコードを更新できるなら、私は非常に感謝しています。 – Cleb

+0

私は例を追加しましたが、多くのバーを再描画すると、再描画が遅くなることがありますが、スライディングがブリッティングされているかどうかは分かりません。 –

関連する問題