Python Matplotlib:动态更新绘图-数组长度未知

Python Matplotlib:动态更新绘图-数组长度未知,python,dynamic,matplotlib,Python,Dynamic,Matplotlib,我知道这些问题:,和-所有这些问题都解决了我的部分问题。 我也读了 然而,我的问题似乎没有在上述任何一项中得到解决。 我希望在优化器运行时绘制优化器返回的目标函数。我事先不知道优化器将运行多少次迭代。不管我如何得到包含目标函数的数组,这个问题可以在这个最小的例子中分离出来: import numpy as np import matplotlib.pyplot as plt SIZE = 50 R1 = 0.5 R2 = 0.75 plt.ion() fig = plt.fig

我知道这些问题:,和-所有这些问题都解决了我的部分问题。
我也读了
然而,我的问题似乎没有在上述任何一项中得到解决。
我希望在优化器运行时绘制优化器返回的目标函数。我事先不知道优化器将运行多少次迭代。不管我如何得到包含目标函数的数组,这个问题可以在这个最小的例子中分离出来:

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')
不幸的是,这个图把轴完全弄乱了。
我将
if I==0
语句放入,因为我事先不知道迭代次数(是的,在本例中我知道,但在针对的应用程序中我不知道),并且必须以某种方式“初始化”绘图和图例。
我的问题可以总结如下:
1.)如何更新绘图?如果我运行优化器进行10000次迭代,我不希望绘图中有10000条重叠线(文件大小)。
2.)将
图例放置在何处

我正在运行python 2.6.6和matplotlib 0.99.1.1

编辑:

这似乎是一个类似的问题,有相同的未回答问题。

只需将包含空数据的行对象置于循环之外:

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() 
在更新扩展数据方面,您可能会更聪明一些

有关更完整的示例,请参阅和的完整图库