1

私は線の一般化アルゴリズムを持っており、プロットにスクロール バーを追加して許容範囲を広げたいと考えています (つまり、線をより一般化します)。matplotlib を使用すると、これはどのように可能になりますか?

要約すると、スライダーをクリックしてドラッグすると、許容範囲の増加が線に反映されます。


これにはまだ本当に苦労しています。1 から 10 までの単純なスケールのスライダーが 1 つだけ必要です。


うん、デモは役に立ちます、私はただ1つのスライダーを動作させるのに苦労しています.これは私がこれまでに持っているものです.

fig = mp.figure()
ax = fig.add_subplot(111)
fig.subplots_adjust(left=0.25, bottom=0.25)
min0=1
max0=10
tolerance = 0

chain1 = ChainLoader('Wiggle1.txt')
chain = chain1[0]

chain2 =  chain.generalise(tolerance)

axcolor = 'lightgoldenrodyellow'
axmin = fig.add_axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
axmax  = fig.add_axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor)

tolerance = Slider(axmin, 'Min', 1, 10, valinit=min0)
#smax = Slider(axmax, 'Max', 0, 30000, valinit=max0)

def update(val):
    tolerance = tolerance.val
    #pp.show()

tolerance.on_changed(update)
#smax.on_changed(update)
chain2 =  chain.generalise(tolerance)
pp.plotPolylines(chain2)
pp.show()   

私の問題は、def update セクションの書き方です。何か助けはありますか?

from PointPlotter import PointPlotter 
from ChainHandler import ChainLoader
pp=PointPlotter()
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider 

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

tolerance = 0 
f0 = 0
chain2 = ChainLoader('Wiggle1.txt')
for chain in chain2:

    chain2 =  chain.generalise(tolerance)
    pp.plotPolylines(chain2)

axcolor = 'lightgoldenrodyellow'

axtol = plt.axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)

tolerance = Slider(axtol, 'tol', 0.1, 30.0, valinit=f0)

def update(val):
    tolerance = tolerance.val 
    for chain in chain2:

        chain2 =  chain.generalise(tolerance)
        pp.plotPolylines(chain2)

        pp.plotPolylines(chain2)

tolerance.on_changed(update) 

plt.show()

とても近い!現在はプロットしていますが、スクロール バーを使用すると、「UnboundLocalError: 割り当て前に参照されたローカル変数 'tolerance'」が返されます。@tcaswell何か助けて?

4

1 に答える 1

3

sliderウィジェット(doc)が必要です。

例のデモは次のとおりです。

http://matplotlib.org/examples/widgets/slider_demo.html

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons

ax = plt.subplot(111)
plt.subplots_adjust(left=0.25, bottom=0.25)
t = np.arange(0.0, 1.0, 0.001)
a0 = 5
f0 = 3
s = a0*np.sin(2*np.pi*f0*t)
l, = plt.plot(t,s, lw=2, color='red')
plt.axis([0, 1, -10, 10])

axcolor = 'lightgoldenrodyellow'
axfreq = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor=axcolor)
axamp  = plt.axes([0.25, 0.15, 0.65, 0.03], facecolor=axcolor)

sfreq = Slider(axfreq, 'Freq', 0.1, 30.0, valinit=f0)
samp = Slider(axamp, 'Amp', 0.1, 10.0, valinit=a0)

def update(val):
    amp = samp.val
    freq = sfreq.val
    l.set_ydata(amp*np.sin(2*np.pi*freq*t))
    plt.draw()
sfreq.on_changed(update)
samp.on_changed(update)

resetax = plt.axes([0.8, 0.025, 0.1, 0.04])
button = Button(resetax, 'Reset', color=axcolor, hovercolor='0.975')
def reset(event):
    sfreq.reset()
    samp.reset()
button.on_clicked(reset)

rax = plt.axes([0.025, 0.5, 0.15, 0.15], facecolor=axcolor)
radio = RadioButtons(rax, ('red', 'blue', 'green'), active=0)
def colorfunc(label):
    l.set_color(label)
    plt.draw()
radio.on_clicked(colorfunc)

plt.show()

これをあなたのケースに適応させるには:

#smax.on_changed(update)
chain2 =  chain.generalise(tol)
pp.plotPolylines(chain2)

def update(val):
    tol = tolerance.val # get the value from the slider
    chain2 =  chain.generalise(tol) # shove that value into your code
    ax.cla() # clear the axes
    pp.plotPolylines(chain2) # re-plot your new results

# register the call back
tolerance.on_changed(update)

変数名の再利用には注意してください ( aに 1 回、 the にtolerance1 回の 2 回使用すると、Python は古い変数をまったく異なる型の新しい変数で喜んで上書きします)。floatSlider

ではupdate、最も強引なアプローチを採用し、 をクリアしてaxesから再描画しました。一般に、返されたアーティストを取得しplotPolylinesて、新しいデータで更新する必要があります。(そのステップでサポートが必要な場合は、データ構造に関する詳細を記載した新しい質問を開いてください)。

理解する方法は、スライダーが変更されたことに気付くと、スライダーの現在の値である単一の引数 ( ) で.on_changed( ) に渡された関数を呼び出すことです。その関数内では、好きなことを行うことができ、スライダーが変更されるたびに完全に実行されます。updateval

于 2013-02-03T01:18:44.570 に答える