2017-06-09 9 views
0

私は化学反応の進行を示すグラフを描こうとしています。進捗自体(時間または反応ステップ)は、スライダを使用して変更可能でなければなりません。 私はこれまで持っているコード:スライダのmatplotlibを使ってxの値を更新

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

fig, ax = plt.subplots() 
plt.subplots_adjust(bottom=0.25) 
fig.canvas.set_window_title('Reaktionsfortschritt') 

t0 = 0 
t = np.arange(0, t0, .5) 
k0 = 0.17 
a = np.exp(- k0 * t) 

l, = plt.plot(t, a, lw=3, color='crimson') 
plt.axis([0, 20, 0, 1]) 

axrs = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor='lightblue') 
srs = Slider(axrs, 'Reaktionsschritte', 0, 20, valinit=0) 

def xval(*args): 
    x = srs.val 
    t = np.arange(0, x, 0.5) 
    #l.set_ydata(np.exp(- 0.6 * t)) 
    #plt.plot(t, a) 
    fig.canvas.draw_idle() 

srs.on_changed(xval) 

plt.show() 

私の知る限りXVAL関数を使用して更新されたプロットレンジ(t)を理解するように。しかし、グラフのプロットはありません。 私は、plt.plot(t, a)l.set_ydata(...)を使って再植え付けを試みました。

は今I(b)の生成物の形成を記述する第2の機能を追加し、

OK]を編集しました。私はこの関数をupdate-functionと同じ方法で追加しました。その結果、私は非常に奇妙な振る舞いをします。スライダを使用して、正のx方向のみにプロットすることができます。そこに私は戻っていない。グラフが描画されると、スライダーの値を小さくすると、「取り消し」されません。それは何か?

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

fig, ax = plt.subplots() 
plt.subplots_adjust(bottom=0.25) 
fig.canvas.set_window_title('Reaktionsfortschritt') 

t = np.arange(0, 0, .5) 
k0 = 0.17 
a = np.exp(- k0 * t) 
b = 1 - np.exp(- k0 * t) 
# plot 
l, = plt.plot(t, a, lw=3, color='crimson') 
m, = plt.plot(t, b, lw=3, color='dodgerblue') 
plt.axis([0, 20, 0, 1]) 
plt.grid(True) 

axrs = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor='lightblue') 
srs = Slider(axrs, 'Zeit', 0, 20, valinit=0) 

def update(x): 
    t = np.arange(0, x, 2) 
    ax.lines.pop(0) # remove previous line plot 
    ax.plot(t, np.exp(- k0 * t), lw=3, color='crimson') 
    ax.plot(t, 1 - np.exp(- k0 * t), lw=3, color='dodgerblue') 
    fig.canvas.draw() 

srs.on_changed(update) 

plt.show() 
+0

お知らせを動作します。あなたはスライダーで何を変えたいですか?プロットされた点の数を変更したいので、xdataとydataを変更します。 – Michael

+0

あなたの編集のために私の答えを編集しました。これが何が起こっているかについての洞察を与えることを願っています。 – Michael

答えて

2

あなたは、x軸に時間を持っているし、同じ機能毎回によって作成されたあなたのプロットの最大時間を変更したいと仮定すると、私はこの思い付いた:

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

fig, ax = plt.subplots() 
plt.subplots_adjust(bottom=0.25) 
fig.canvas.set_window_title('Reaktionsfortschritt') 

t0 = 0 
t = np.arange(0, t0, .5) 
k0 = 0.17 
a = np.exp(- k0 * t) 

l, = ax.plot(t, a, lw=3, color='crimson') 
plt.axis([0, 20, 0, 1]) 

axrs = plt.axes([0.25, 0.1, 0.65, 0.03]) 
srs = Slider(axrs, 'Reaktionsschritte', 0, 20, valinit=0) 

def update(x): 
    t0 = x 
    t = np.arange(0, t0, .5) 
    ax.lines.pop(0) # remove previous line plot 
    ax.plot(t, np.exp(- k0 * t), lw=3, color='crimson') # plot new one 
    fig.canvas.draw() 

srs.on_changed(update) 

plt.show() 

参照してください。 Sliderの値を変更するときに何をして、これがあなたがしたいと思っていたものかを教えてください。あなたの編集する



あなたが2番目のプロットを追加するとき、あなたは2つのlinesオブジェクトを持っています。 (Sliderに触れる前に)コードを実行した直後にax.linesを印刷し、実際には2つのリストlinesのリストであることを確認してください。次にax.lines.pop(0)を呼び出して、1つの要素がリストからポップされていることを確認してください。これは上記のコードの機能で、スライダーに触れるたびにaxesオブジェクトaxの行が削除されます(updateが呼び出されたため)。fig.canvas.draw()を呼び出した後、前のプロットが消えてしまいます。スライダーに一度触れると、linesという新しい2つがaxに追加され、1つだけが削除されます。これは帰ることがないと思う理由です。あなたは今、2番目のプロットを追加した場合
だから、あなただけax.lines.pop(0)でリストax.linesから2回ポップする必要があり、コードは 'T'は空の配列であることを微;-)

+0

これはまさに私が欲しかったものです!迅速な回答とあなたのお手伝いをありがとうございます。 – Manuel

+0

うまく動作します。ご説明いただきありがとうございます。 – Manuel

関連する問題