我知道这些问题:(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')
不幸的是,这个情节完全弄乱了轴
我把if i == 0
语句放入,因为我不知道事先的迭代次数(是的,我在这种情况下做,但不是在针对的应用程序中)并且不知何故必须'初始化'的情节和传说。
我的问题可归纳如下:
1.)如何更新我的情节?如果我运行优化器10,000次迭代,我不希望在我的图中有10,000个覆盖线(文件大小)
2.)我在哪里放置legend
命令?
我正在运行python 2.6.6和matplotlib 0.99.1.1
编辑:
This似乎是一个类似的问题,同样没有答案。
答案 0 :(得分: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的完整图库。