2

(A)(B)、および(C)の質問を認識しています。これらはすべて、私の問題の一部に対応しています。Animations Cookbook
も読みましたが、 私の質問は上記のいずれにも当てはまらないようです。 オプティマイザの実行中に、オプティマイザによって返された目的関数をプロットしたいと考えています。オプティマイザーが何回反復を実行するかは事前にわかりません。目的関数を含む配列を取得する方法に関係なく、問題は次の最小限の例で分離できます。

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')

ここでは、プロットは「疑似」更新のみです。実際に起こることは、反復ごとにAとの新しい行Bが生成され、元の行の上に重なるだけでなく、新しい凡例エントリも生成することです。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')

残念ながら、このプロットは軸を完全に台無しにしています。繰り返しの回数が事前にわからないため (はい、この場合はわかりますが、対象となるアプリケーションではわかりません)、何らかの方法でプロットと凡例を「初期化」する必要があるため
、ステートメントを挿入しました。 私の質問は次のように要約できます: 1.) プロットを更新するにはどうすればよいですか? オプティマイザーを 10,000 回繰り返して実行すると、プロット (ファイルサイズ) に 10,000 行が重なって表示されることは望ましくありません。2.)コマンド はどこに配置すればよいですか?if i == 0


legend

私はpython 2.6.6とmatplotlib 0.99.1.1を実行しています

編集:
これは同様の質問のようですが、同じ未回答の問題があります。

4

1 に答える 1

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

より完全な例については、こちらとアニメーション例の完全なギャラリーを参照してください。

于 2013-04-10T15:52:36.390 に答える