使用matplotlib制作动画,其中点会动态添加到图表中。

4
我已经写了一个简单的代码,它使用while循环在一定的范围内生成随机点 (x0, y0)。在设置每个点的坐标后,在空图表中绘制该点,在while循环结束时显示。

但是,我想使用matplotlib设置动画,使我能够看到初始图形,并逐渐将计算它们的代码添加到其中。 我已经寻找了一些示例,但我发现这些示例主要涉及波动等问题,我想我需要稍微不同的方法。

这是基本代码:

from numpy import *
from pylab import *
import random

figure(figsize=(8,6), dpi=150)
x = np.linspace(-1, 4.5, 250)

h=5
a=0.5
b=4

ylim(-0.5,5.5)
xlim(-1,5.0)

i= 0

while i< 500:
    R1 = random.random()
    R2 = random.random()
    x0 = (b - a)*R1 + a
    y0 = h*R2
    scatter(x0, y0, 10, color="red")
    i = i + 1

show()  

感谢您的帮助!

编辑:动画代码

import numpy as np
import matplotlib.pyplot as plt
from pylab import *
import matplotlib.animation as animation
import random

fig = plt.figure(figsize=(8,6), dpi=150)
x = np.linspace(-2, 4.5, 250)


h=4
a=1
b=3

hlines(y=h, xmin=1, xmax=3, linewidth=1.5)
vlines(x=a, ymin=0, ymax=4, linewidth=1.5)
vlines(x=b, ymin=0, ymax=4, linewidth=1.5)

ylim(-2.5,10.5)
xlim(-2.5,4.5)
grid()

def data_gen():
    i = 0
    while i< 1:
        R1 = random.random()
        R2 = random.random()
        x0 = (b - a)*R1 + a
        y0 = h*R2
        i = i + 1
        yield x0, y0


line, = plot([], [], linestyle='none', marker='o', color='r')

ax = gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

xdata, ydata = [], []

def run(data):
    x0,y0 = data
    xdata.append(x0)
    ydata.append(y0)
    line.set_data(xdata, ydata)

    return line,

ani = animation.FuncAnimation(fig, run, data_gen, blit=True, interval=0.5,
    repeat=False)
plt.show()

你的代码在我这里可以运行。你观察到了什么问题? - Bennett Brown
这段程序相关的内容是:http://matplotlib.org/examples/animation/animate_decay.html 这个链接可以提供你所需的功能。使用以下代码:line, = ax.plot([], [], linestyle='none', marker='o', color='r') - tacaswell
@tcaswell 谢谢你的建议:我已经设置了一个目的地居中的代码(我会在上面发布)。但是,有一些奇怪的事情正在发生:例如,如果我告诉程序通过设置i=5来绘制5个点,它实际上会返回7个点而不是5个。即使我设置i=1,图表上仍然有两个附加点。为什么会这样?我找不到任何原因。 - LorenzoLMP
1个回答

0

我不确定这是否正是您要寻找的内容;无论如何,您可以在run函数内生成随机点并将其绘制出来。您不需要使用blit = True,也不需要在每一帧之间清除轴。
以下是我的代码:

from pylab import *
from matplotlib.animation import FuncAnimation
import random

fig = plt.figure(figsize=(8,6), dpi=150)
x = np.linspace(-2, 4.5, 250)

h=4
a=1
b=3

hlines(y=h, xmin=a, xmax=b, linewidth=1.5)
vlines(x=a, ymin=0, ymax=h, linewidth=1.5)
vlines(x=b, ymin=0, ymax=h, linewidth=1.5)

ylim(-2.5,10.5)
xlim(-2.5,4.5)
grid()

ax = gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

def run(i):
        R1 = random.random()
        R2 = random.random()
        x0 = (b - a)*R1 + a
        y0 = h*R2
        ax.scatter(x0, y0, 10, color='red')

ani = FuncAnimation(fig = fig, func = run, frames = 500, interval = 10, repeat = False)
plt.show()

这会产生以下动画:

enter image description here

我将这个动画剪裁到100个点以获得一个更轻的文件,小于2MB;上述代码产生了一个有500个点的动画。


你也知道如何删除点吗? - Christian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接