def add_functions(t, ft, gt, xt, animated=False): sig_ft = Signal(t, ft) sig_gt = Signal(t, gt) sig_xt = Signal(t, xt) y_max = max(sig_ft.max(), sig_gt.max(), sig_xt.max()) y_min = min(sig_ft.min(), sig_gt.min(), sig_xt.min()) def update_axis_range(fig): fig.x_range.start = t[0] fig.x_range.end = t[-1] fig.y_range.start = y_min fig.y_range.end = y_max fig_ft = sig_ft.create_fig(size=(900,300), title='f(t)', scale='time') update_axis_range(fig_ft) fig_ft.xaxis.axis_label = 't' fig_ft.yaxis.axis_label = 'f(t)' sig_ft.update_line_opts({'line_color':'red'}) sig_ft.create_renderers(fig_ft, ['line', 'stems']) fig_gt = sig_gt.create_fig(size=(900,300), title='g(t)', scale='time') update_axis_range(fig_gt) fig_gt.xaxis.axis_label = 't' fig_gt.yaxis.axis_label = 'g(t)' sig_gt.update_line_opts({'line_color':'green'}) sig_gt.update_stem_opts({'line_color':'green'}) sig_gt.create_renderers(fig_gt, ['line', 'stems']) fig_xt = sig_xt.create_fig(size=(1800,300), title='x(t)', scale='time') update_axis_range(fig_xt) fig_xt.xaxis.axis_label = 't' fig_xt.yaxis.axis_label = 'x(t)' sig_xt.update_line_opts({'line_color':'purple', 'line_width': 5, 'line_alpha':1}) sig_xt.create_renderers(fig_xt, ['line']) # sig_gt.update_line_opts({'line_width':1, 'line_alpha':0.6}) sig_ft.create_renderers(fig_xt, ['stems']) # sig_ft.update_line_opts({'line_width':1, 'line_alpha':0.6}) # sig_ft.create_renderers(fig_xt, ['line']) extra_ds = ColumnDataSource({'x':t, 'y0': np.zeros(t.size), 'y1': gt}) opts = stem_defaults.copy() opts.update({'line_color':'green'}) fig_xt.segment(x0='x', x1='x', y0='y0', y1='y1', source=extra_ds, **opts) handle = show(column(row(fig_ft, fig_gt), fig_xt), notebook_handle=True) if animated: ft_anim = sig_ft.create_stem_animation(frames=t.size) gt_anim = sig_gt.create_stem_animation(frames=t.size) xs = np.array_split(extra_ds.data['x'], t.size) y1 = np.array_split(extra_ds.data['y1'], t.size) y0 = np.array_split(extra_ds.data['y0'], t.size) data = [{ 'x': xs[frame], 'y1': y1[frame], 'y0': y0[frame]} for frame in range(0, t.size)] gt_on_figxt = StreamAnimation(extra_ds, data) slide_to_data = [{ 'y0': [ (frame, ft[frame]) ], 'y1': [ (frame, xt[frame]) ] } for frame in range(0, t.size)] slide_to = UpdateAnimation(extra_ds, slide_to_data) a1set = AnimationSet([ft_anim]) a2set = AnimationSet([gt_anim, gt_on_figxt]) a3set = AnimationSet([slide_to]) AnimateSets([a1set, a2set, a3set], handle, fps=45).run()