def aliases_figure(f0, fs): t = np.linspace(0, 1, 50*fs) y = np.sin(f0 * 2*np.pi * t) sig = Signal(t, y) alias_sig = Signal(t, y) fig = sig.get_fig(size=(1080,300),title="Aliases of {} Hz signal".format(f0)) alias_sig.update_line_opts({'line_color' : 'orange', 'line_alpha': 1}) alias_sig.create_line_renderer(fig) alias_x = np.linspace(0, 1, fs, endpoint=False) alias_y = np.sin(f0 * 2*np.pi * alias_x) alias_points = ColumnDataSource({ 'x' : alias_x, 'y' : alias_y, 'y0': np.zeros(alias_x.size) }) fig.circle(x='x', y='y', source=alias_points, fill_color='red', line_width=3, line_color='red') fig.segment(x0='x', x1='x', y0='y0', y1='y', source=alias_points,line_width=3, line_color='red') handle = show(fig, notebook_handle=True) def frame_gen(fv): return {'y': np.sin(fv*2*np.pi*t)} anim_sets = [] for k in range(1, 6): f_previous = f0 + (k-1)*fs f_alias = f0 + k*fs frame_values = np.linspace(f_previous, f_alias, 60) anim = FrameAnimation(alias_sig.data_source(), frame_gen, frame_values) anim_sets.append(AnimationSet([anim])) anim_sets.append(AnimationSet([Pause(1)])) AnimateSets(anim_sets, handle).run()