2013-03-05 20 views
-1

我有一組開始在點XN隨機路徑。我有一個滑塊,其改變所述初始點X從而生成新N路徑。我希望能夠更新路徑,但set_ydata只接受1D數組。目前我正在清理軸並在每次更新時進行繪圖,這不是非常有效。在matplotlib中有沒有內置的方法?更新2D陣列爲y數據在matplotlib動畫

xJ = arange(-10,10,0.1) 
psinaive = zeros((xJ.shape[0])) 
uapprox = zeros((xJ.shape[0],Nt)) 

wplot = [] 
wcondplot = [] 

for i,x in enumerate(xJ): 
    WJ = sqrt(dt)*np.random.randn(Ntraj,Nt) 
    WJ[:,0] = x 
    WJ = np.cumsum(WJ,1) 
    wplot.append(WJ) 
    cond = V(WJ,limits)[0] 
    wcondplot.append(WJ[cond,:]) 
    wa = 1.0/WJ.shape[0]*exp(-phi(WJ[:,-1],alpha)/lmbda) 
    psinaive[i] = sum(wa[cond]) 
    uapprox[i,:] = 1.0/psinaive[i]*np.dot(wa[cond],WJ[cond,:]).flatten() 
    if i % 10 == 0: 
     print '..%.1f'%x, 



J = -lmbda*log(psinaive) 

#plot results 

ax1=subplot(221) 
plot(xJ,J) 
plot(xJ,Jl(xJ,ti,tf,alpha,R,v,t1,limits)) 
title('$J(x,t)$') 
plt.axvline(x=-10) 

subplot(222) 
plot(xJ,uapprox[:,0]) 

ax3 = subplot(223) 
plot(t,wplot[0].T,alpha=0.2) 
title('%d paths'%Ntraj) 
ylim((-15,15)) 
ymin,ymax = ylim() 
plt.axvline(x=t1, ymin=(d-ymin)/(ymax-ymin), linewidth=2, color='k') 
plt.axvline(x=t1, ymin=(b-ymin)/(ymax-ymin), ymax = (c-ymin)/(ymax-ymin), linewidth=2, color='k') 
plt.axvline(x=t1, ymax=(a-ymin)/(ymax-ymin), linewidth=2, color='k') 

ax4 = subplot(224) 
ax4.set_title('No alive paths') 
if len(wcondplot[0])>0: 
    ax4.plot(t,wcondplot[0].T,alpha=0.2) 
    ax4.set_title('%d alive from %d paths'%(len(wcondplot[0]),Ntraj)) 
ylim((-15,15)) 
ymin,ymax = ylim() 
plt.axvline(x=t1, ymin=(d-ymin)/(ymax-ymin), linewidth=2, color='k') 
plt.axvline(x=t1, ymin=(b-ymin)/(ymax-ymin), ymax = (c-ymin)/(ymax-ymin), linewidth=2, color='k') 
plt.axvline(x=t1, ymax=(a-ymin)/(ymax-ymin), linewidth=2, color='k') 
subplots_adjust(0.15,0.25) 


axsx = axes([0.15,0.1,0.75,0.1]) 
slx = Slider(axsx,'x',0,len(xJ),0,valfmt='%.0f') 



def updatex(val): 
    x = int(val) 

    ax1.cla() 
    ax1.plot(xJ,J) 
    ax1.plot(xJ,Jl(xJ,ti,tf,alpha,R,v,t1,limits)) 
    ax1.set_title('$J(x,t)$') 
    ax1.axvline(x=xJ[x]) 

    ax3.cla() 
    ax3.plot(t,wplot[x].T,alpha=0.2) 
    ax3.set_title('%d paths'%Ntraj) 
    ax3.set_ylim((-15,15)) 
    ymin,ymax = ax3.get_ylim() 
    ax3.axvline(x=t1, ymin=(d-ymin)/(ymax-ymin), linewidth=2, color='k') 
    ax3.axvline(x=t1, ymin=(b-ymin)/(ymax-ymin), ymax = (c-ymin)/(ymax-ymin), linewidth=2, color='k') 
    ax3.axvline(x=t1, ymax=(a-ymin)/(ymax-ymin), linewidth=2, color='k') 

    ax4.cla() 
    ax4.set_title('No alive paths') 
    if len(wcondplot[x])>0: 
     ax4.plot(t,wcondplot[x].T,alpha=0.4) 
     ax4.set_title('%d alive from %d paths'%(len(wcondplot[x]),Ntraj)) 
    ax4.set_ylim((-15,15)) 
    ymin,ymax = ax4.get_ylim() 
    ax4.axvline(x=t1, ymin=(d-ymin)/(ymax-ymin), linewidth=2, color='k') 
    ax4.axvline(x=t1, ymin=(b-ymin)/(ymax-ymin), ymax = (c-ymin)/(ymax-ymin), linewidth=2, color='k') 
    ax4.axvline(x=t1, ymax=(a-ymin)/(ymax-ymin), linewidth=2, color='k') 
    draw() 

slx.on_changed(updatex) 

結果是:

Result

+0

你能提供一段代碼嗎?例如,你現在如何繪製你的'N'個隨機路徑。 'set_ydata'或'set_data'絕對是正確的功能 – danodonovan 2013-03-05 11:30:13

回答

1

你可以使用一個事實,即如果數組包含NaN的,matplotlib將創建不同的段,儘管陣列的

x = (np.arange(5 * 4) % 4).reshape(5, 4) * 1. 
x[x==3] = np.nan 
y = x + (np.arange(5 * 4)/4).reshape(5,4)*1. 
line2d = plt.plot(x.flatten(),y.flatten()) [0] 
print x,y 
> [[ 0., 1., 2., nan], 
> [ 0., 1., 2., nan], 
> [ 0., 1., 2., nan], 
> [ 0., 1., 2., nan], 
> [ 0., 1., 2., nan]] 
> [[ 0. 1. 2. nan] 
> [ 1. 2. 3. nan] 
> [ 2. 3. 4. nan] 
> [ 3. 4. 5. nan] 
> [ 4. 5. 6. nan]] 

然後你就可以毫無問題使用set_data()方法,例如1D-mensionality :

line2d.set_data(y.flatten()+3) 
+0

除了着色,這可能是一個很好的解決方案。 – poeticcapybara 2013-03-05 12:52:37

0

嘗試使用set_data,因爲它可以節省您不必清除和重製(你已經意識到很慢)。一個用法示例:

fig = figure() 
ax = fig.add_subplot(111) 
p = ax.plot(x, y) 

# you do something to your data and want to replot 

p.set_data(x, y) 

如果您可以發佈您的代碼,那麼我們可以幫助您找到確切的解決方案。