003《Python数据分析、挖掘与可视化(第2版)》/例9-37.py
import gif
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

r, c = 2, 30
positions = np.random.randint(-10, 10, (r,c))
stop_positions = np.random.randint(-39, 39, (r,c))
colors = np.random.random((c,3))

# 选择后端渲染引擎,这一句非常重要,否则会因为内存不足而中途结束
matplotlib.use('Agg')

@gif.frame
def draw():
    plt.scatter(*positions, marker='*', s=60, c=colors)
    plt.xlim(-40, 40)
    plt.ylim(-40, 40)

frames = []
while True:
    offsets = np.random.choice((1,-1), (r,c))
    offsets[positions==stop_positions] = 0
    if offsets.any():
        positions = positions + offsets
        positions[positions>39] = 39
        positions[positions<-39] = -39
        frame = draw()
        frames.append(frame)
    else:
        break
# 保存GIF动图,大约需要10-30分钟
gif.save(frames, 'brown.gif')