In [1]:
    
%matplotlib 
 
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as manimation
plt.ion()
    
    
    
In [2]:
    
frames = 100
diff_max = np.pi
diff_min = np.pi/10
npoints=50
    
In [3]:
    
# We want a square figure with a black background
fig = plt.figure(facecolor='k', figsize=(5,5))
# Obviously a polar plot and enough space to see all the curves
ax = fig.add_subplot(111, polar=True)
ax.set_xlim(0,1.1)
ax.set_ylim(0,1.1)
# Let's put everything in black and remove the axis 
ax.set_axis_bgcolor('black')
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
for spine in ax.spines.itervalues():
    spine.set_visible(False)
    
In [4]:
    
x = np.linspace(0,2*np.pi,npoints)
line = ax.plot(np.zeros_like(x), np.ones_like(x), color='w', linewidth=40, solid_capstyle='round',solid_joinstyle='round')[0]
fig.tight_layout()
    
In [5]:
    
def init():
    return line
def basic_motion(iframe):
    return (np.sin(iframe*np.pi/(frames-1)-np.pi/2)+1)/2*2*np.pi+iframe*2*np.pi/(frames-1)
def diff_motion(iframe):
    return -diff_min+(np.sin(iframe*2*np.pi/(frames-1)+np.pi/2)-1)/2*diff_max
def update_image(iframe):
    x = np.linspace(basic_motion(iframe), basic_motion(iframe)+diff_motion(iframe), npoints)
    line.set_xdata(x)
    return line
    
In [6]:
    
map_animation = manimation.FuncAnimation(fig, update_image, init_func=init, frames=frames, interval=50, repeat=True)
plt.show()
    
In [7]:
    
map_animation.save('wait-wait.gif', writer='imagemagic', dpi=40, fps=25, savefig_kwargs=dict(facecolor=fig.get_facecolor(), edgecolor='none'))
    
    
And if everything worked properly you should get a tidy gif :