到目前为止,这是我的脚本:
import numpy as np
import matplotlib.pyplot as plt
import random
t=0
r=3.0
n=0
A=[]
for x in range(10):
for y in range(10):
A.append([random.uniform(0,1),random.uniform(0,1)])
for m in range(len(A)):
plt.plot(A[m][0],A[m][1], "x", color="blue")
plt.show()
while n<=100:
for m in range(len(A)):
A[m][0]=r*A[m][0]*(1-A[m][0])
A[m][1]=r*A[m][1]*(1-A[m][1])
for m in range(len(A)):
plt.plot(A[m][0],A[m][1], "x", color="blue")
plt.show()
n+=1
我现在要做的是为它制作动画,这样我每次都可以关闭该剧情,以便重新计算下一个图像。相反,它应该告诉我每个说5s的新情节。对我来说最好的方法是什么?
答案 0 :(得分:7)
您可以使用matplotlib.animation
包:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random
t=0
r=3.0
n=0
A=[]
for x in range(10):
for y in range(10):
A.append([random.uniform(0,1),random.uniform(0,1)])
A = np.array(A).transpose()
fig = plt.figure()
line, = plt.plot(A[0],A[1], "x", color="blue")
def update():
for i in range(100):
A[0], A[1] = r*A[0]*(1-A[0]), r*A[1]*(1-A[1])
yield A
def draw(data):
line.set_xdata(data[0])
line.set_ydata(data[1])
return line,
ani = animation.FuncAnimation(fig, draw, update, interval=1000, blit=False)
plt.show()
update
函数是一个生成器,它为后续步骤生成数据,而draw
是一个更新绘图数据并返回它的函数。
答案 1 :(得分:1)
使用plt.ion()
启用交互式绘图(打开绘图窗口时不会停止执行),然后使用plt.clf()
清除绘图。
工作样本是:
import numpy as np
import matplotlib.pyplot as plt
plt.ion()
import random
t=0
r=3.0
n=0
A=[]
for x in range(10):
for y in range(10):
A.append([random.uniform(0,1),random.uniform(0,1)])
for m in range(len(A)):
plt.plot(A[m][0],A[m][1], "x", color="blue")
plt.draw()
plt.pause(1)
while n<=100:
for m in range(len(A)):
A[m][0]=r*A[m][0]*(1-A[m][0])
A[m][1]=r*A[m][1]*(1-A[m][1])
for m in range(len(A)):
plt.plot(A[m][0],A[m][1], "x", color="blue")
plt.draw()
plt.pause(1)
plt.clf()
您必须使用plt.draw()
强制GUI立即更新,并plt.pause(t)
中断t秒。实际上,我不太确定你想如何处理你的脚本的两个部分(包含plot-commands的两个循环)的动画,但希望我的代码能以正确的方式引导你。
<强>说明强>
首先,我建议在编写python时坚持一些约定。使用4空格缩进,这使您的代码更具可读性。其次,我建议将numpy用于数组。您导入它但不使用它。这使您的代码肯定更快。
第三个也是最后一个,您是否知道matplotlib的签名plot(x,y,"bx")
?我觉得这很方便。
答案 2 :(得分:0)
我建议使用matplotlib的面向对象接口,在artist tutorial中很好地总结。
通过这种方式,您可以更好地控制图形行为,并可以简单地在循环中重绘图形:
import numpy as np
import matplotlib.pyplot as plt
import random
from time import sleep
t=0
r=3.0
n=0
A=[]
for x in range(10):
for y in range(10):
A.append([random.uniform(0,1),random.uniform(0,1)])
fig = plt.figure()
ax = fig.add_subplot(111)
for m in range(len(A)):
ax.plot(A[m][0],A[m][1], "x", color="blue")
fig.show()
sleep(1)
while n<=100:
for m in range(len(A)):
A[m][0]=r*A[m][0]*(1-A[m][0])
A[m][1]=r*A[m][1]*(1-A[m][1])
ax.clear()
for m in range(len(A)):
ax.plot(A[m][0],A[m][1], "x", color="blue")
fig.canvas.draw()
sleep(1)
n+=1
您的脚本所做的主要更改是使用fig.show
代替plt.show
,并在更改数据后使用fig.canvas.draw
更新数字。