1

到目前为止,这是我的脚本:

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

我现在要做的是为其设置动画,这样我就不必每次都关闭绘图,以便 python 重新计算并显示下一张图像。相反,它应该每隔 5 秒向我展示一个新的情节。对我来说最好的方法是什么?

4

3 回答 3

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它是一个更新绘图数据并返回它的函数。

于 2013-01-16T13:49:34.930 回答
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 秒。实际上,我不太确定您想如何处理脚本的两个部分(包含绘图命令的两个循环),但希望我的代码能以正确的方式指导您。

评论

首先,我建议在编写 python 代码时遵守一些约定。使用 4 空格缩进,这使您的代码更具可读性。其次,我建议将 numpy 用于数组。你导入它但你不使用它。这使您的代码绝对更快。第三,也是最后,你知道plot(x,y,"bx")matplotlib 的签名吗?我觉得真的很方便。

于 2013-01-16T13:37:40.660 回答
0

我建议使用 matplotlib 的面向对象接口,在美工教程中得到了很好的总结。

有了这个,您可以更好地控制图形行为,并且可以简单地在循环中重绘绘图:

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

于 2013-01-16T13:54:15.593 回答