2013-04-10 78 views
2

我知道這些問題:(A),(B)(C) - 所有這些都解決了我的問題的一部分。
我也讀過Animations Cookbook
但是,我的問題似乎沒有在上述任何一箇中解決。
我希望繪製優化器運行時由優化器返回的目標函數。我不知道優化器將運行多少次迭代。獨立是如何得到的含有目標函數的數組,這個問題可以在這個小例子,被隔離:Python Matplotlib:動態更新圖 - 數組長度不知道先驗

import numpy as np 
import matplotlib.pyplot as plt 

SIZE = 50 
R1 = 0.5 
R2 = 0.75 

plt.ion() 

fig = plt.figure() 
ax = fig.add_subplot(111) 
fig.canvas.set_window_title('broken spiral') 

for i in range(0, SIZE): 
    A.append(R1 * i * np.sin(i)) 
    B.append(R2 * i * np.cos(i)) 
    line1, = ax.plot(A,'-k',label='black') 
    line2, = ax.plot(B,'-r',label='red') 
    legend = ax.legend(loc=0) 
    plt.draw() 

plt.savefig('test_broken_spiral.png') 

這裏的情節只是「pseudo'更新的。真正發生的是,每次迭代都會生成一條AB的新行,覆蓋原始行,並生成新的圖例條目。經過50次迭代後,我有100行和100個圖例條目。
我想這下:

for i in range(0, SIZE): 
    A.append(R1 * i * np.sin(i)) 
    B.append(R2 * i * np.cos(i)) 
    if i == 0: 
    line1, = ax.plot(A,'-k',label='black') 
    line2, = ax.plot(B,'-r',label='red') 
    legend = ax.legend(loc=0) 
    plt.draw() 
    else: 
    line1.set_ydata(A) 
    line2.set_ydata(B) 
    plt.draw() 

plt.savefig('test_broken_spiral.png') 

不幸的是,該地塊已經完全搞砸了軸。
我把if i == 0聲明放在裏面,因爲我不知道提前迭代的次數(是的,我在這種情況下做,但不是在這個應用中的目標),並且不知何故必須'初始化'情節和圖例。
我的問題可以總結如下:
1.)如何更新我的情節?如果我運行優化器進行10,000次迭代,我不想在我的圖(文件大小)中使用10,000個覆蓋線。
2.)我在哪裏放置legend命令?

我運行的Python 2.6.6和matplotlib 0.99.1.1

編輯:
This似乎是一個類似的問題,同樣沒有答案的問題。

回答

2

只是要與空數據線對象的循環之外:

line1, = ax.plot([], [],'-k',label='black') 
line2, = ax.plot([], [],'-r',label='red') 
ax.legend() 
for i in range(0, SIZE): 
    A.append(R1 * i * np.sin(i)) 
    B.append(R2 * i * np.cos(i)) 
    line1.set_ydata(A) 
    line1.set_xdata(range(len(A))) 
    line2.set_ydata(B) 
    line2.set_xdata(range(len(B))) 
    ax.relim() 
    ax.autoscale_view() 
    plt.draw() 

你大概可以多一點聰明的關於更新xdata

如需更完整的示例,請參閱here以及animation examples的完整畫廊。