1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation
np.random.seed(19680801)
fig = plt.figure(figsize=(7, 7)) ax = fig.add_axes([0, 0, 1, 1], frameon=False) ax.set_xlim(0, 1), ax.set_xticks([]) ax.set_ylim(0, 1), ax.set_yticks([])
n_drops = 50 rain_drops = np.zeros(n_drops, dtype=[('position', float, 2), ('size', float, 1), ('growth', float, 1), ('color', float, 4)])
rain_drops['position'] = np.random.uniform(0, 1, (n_drops, 2)) rain_drops['growth'] = np.random.uniform(50, 200, n_drops)
scat = ax.scatter(rain_drops['position'][:, 0], rain_drops['position'][:, 1], s=rain_drops['size'], lw=0.5, edgecolors=rain_drops['color'], facecolors='none')
def update(frame_number): current_index = frame_number % n_drops
rain_drops['color'][:, 3] -= 1.0/len(rain_drops) rain_drops['color'][:, 3] = np.clip(rain_drops['color'][:, 3], 0, 1)
rain_drops['size'] += rain_drops['growth']
rain_drops['position'][current_index] = np.random.uniform(0, 1, 2) rain_drops['size'][current_index] = 5 rain_drops['color'][current_index] = (0, 0, 0, 1) rain_drops['growth'][current_index] = np.random.uniform(50, 200)
scat.set_edgecolors(rain_drops['color']) scat.set_sizes(rain_drops['size']) scat.set_offsets(rain_drops['position'])
animation = FuncAnimation(fig, update, interval=10) plt.show()
|