2016-12-21 8 views
-2

私は完全にうまく動作するコードを開発しましたが、今は私のコンピュータをいつも私のコンピュータに持っていなくても教授に見せたいと思っています。コードは:Bokehのスライダーを使った震えプロット

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

a = 0.5 

X, Y = np.mgrid[0:1.05:0.025, 0:1.05:0.025] 
varX = #Some equation with X, Y and a (as a parameter) 
varY = #Some other equation 

U = varX-X 
V = varY-Y 

length = np.sqrt(U**2 + V**2) 

fig, ax = plt.subplots() 
Q = plt.quiver(X, Y, varX-X, varY-Y, 
       color='r', 
       scale=3*(2 ** .5), units='y') 

plt.subplots_adjust(left=0.25, bottom=0.25) 

plt.axis([0, 1, 0, 1]) 

axcolor = 'lightgoldenrodyellow' 
axa = plt.axes([0.25, 0.10, 0.65, 0.03], axisbg=axcolor) 

sa = Slider(axa, 'Alfa', 0, 1, valinit=a) 

def update(val): 
    a = sa.val 

    varX = #Same equation as before 
    varY = #Same equation 

    Q.set_UVC(varX - X, varY - Y) 
    fig.canvas.draw_idle() 

sa.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): 
    sa.reset() 
button.on_clicked(reset) 

plt.show() 

私が言ったように、このコードは魅力的なように機能しますが、どうすれば結果を保存できますか?私は

+0

どこかでコードをオンラインにしますか?どのようにjsの書き換えが何か変わると思うかわからない – chris

+0

Bokeh(最後に関連するコード)で 'multi_line'を使って震えを作ることができます:http://bokeh.pydata.org/ja/dev/docs/gallery /quiver.htmlしかし、ボタンをクリックしたときにPythonコードを実行するインタラクティブなアプリケーションを作るためには、同じ問題があります:アプリケーションは永久に実行され、どこかでホストされる必要があります。 – bigreddot

+0

ありがとう、bigreddot。 はい、私はそのコードを見て、私は自分の機能に合わせて書き直しました。スライダがなければ、すべてが完璧に機能します(取得したいフェーズの肖像画は正確です)が、スライダを追加して動作させる方法は実際には分かりません。コールバック関数でUとVを変更する必要がありますが、これはPython関数(ストリームライン)から来るxsとysを変更するので、私は行き詰まってしまったと思います。 私は考え続ける必要があります、すべての助けは非常に感謝します。 – javirk

答えて

1
Javirk ...事前に

おかげで、

をHTML-jsのバージョンを作ることに思っていたが、それのためにボケ同様のバージョンを作ることができなかったとmpld3はスライダーをサポートしていないようです

最終的に私はそれを自分で理解することができた。私はサーバーをセットアップしたくないので、 "multi_line"ではなく "segment"を使用しなければなりませんでした。コード:

from __future__ import division 

import numpy as np 

from bokeh.layouts import row, widgetbox 
from bokeh.models import CustomJS, Slider 
from bokeh.plotting import figure, output_file, show, ColumnDataSource 

#Declaration of variables 

xx = np.linspace(0, 1, 50) 
yy = np.linspace(0, 1, 50) 

Y, X = np.meshgrid(xx, yy) 

x0 = X[::2, ::2].flatten() 
y0 = Y[::2, ::2].flatten() 

#Equations and so, result: x1,y1 with same dimensions as x0,y0 
#x1,y1 are the coordinates of the final point of the segment 

source = ColumnDataSource(data=dict(x0=x0, y0=y0, x1=x1, y1=y1)) 

#Plot 
plot = figure(x_range=(0, 1), y_range=(0, 1), x_axis_label='H', y_axis_label='C', 
       title="Retrato de fases. Modelo simplificado") 
plot.segment('x0', 'y0', 'x1', 'y1', source=source, line_width=1) 

#JS function that activates when slider value is changed 
callback = CustomJS(args=dict(source=source), code=""" 
    var data = source.data; 
    var alpha = alpha.value; 

    x0 = data['x0']; 
    y0 = data['y0']; 
    x1 = data['x1']; 
    y1 = data['y1']; 

    for (i = 0; i < x0.length; i++) { 
     #Same equations as before, but written in JS 
    } 
    source.trigger('change'); 
""") 

#Set up all the sliders 
alfa_slider = Slider(start=0, end=1, value=alpha, step=.01, title="Alpha", callback=callback) 
callback.args["alpha"] = alpha_slider 

output_file("slider.html", title="Phase Portrait") 

layout = row(
    plot, 
    widgetbox(alpha_slider), 
) 
show(layout) 
関連する問題