The following is based on this Mathematica notebook: http://library.wolfram.com/infocenter/MathSource/780/
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
particles = 1000
length = 2 # along x-axis
width = 0.2 # along y-axis
wavelength = 0.3 * length
amplitude = 0.1 * wavelength
t = 0 # TODO: animation from 0 to 1
x = np.random.uniform(0, length, particles)
y = np.random.uniform(0, width, particles)
x += amplitude * np.sin((2 * np.pi / wavelength) * x - 2 * np.pi * t)
fig, ax = plt.subplots(figsize=(12, 1))
ax.scatter(x, y)
ax.axis('equal')
ax.axis('tight');
Animation of 1D standing wave: http://www.acs.psu.edu/drussell/Demos/StandingWaves/StandingWaves.html
Animation of 2D sound propagation: http://www.acs.psu.edu/drussell/Demos/rad2/mdq.html
Another 1D animation: http://blog.soton.ac.uk/soundwaves/wave-basics/ways-of-showing-waves/
Another 2D animation: http://blog.soton.ac.uk/soundwaves/wave-basics/point-sources-inverse-square-law/