import holoviews as hv from holoviews import opts import numpy as np hv.extension('bokeh') def clifford_equation(a,b,c,d,x0,y0): xn,yn = x0,y0 coords = [(x0,y0)] for i in range(10000): x_n1 = np.sin(a*yn) + c*np.cos(a*xn) y_n1 = np.sin(b*xn) + d*np.cos(b*yn) xn,yn = x_n1,y_n1 coords.append((xn,yn)) return coords opts.defaults( opts.Curve(color='black'), opts.Points(color='red', alpha=0.1, width=400, height=400)) def clifford_attractor(a,b,c,d): return hv.Points(clifford_equation(a,b,c,d,x0=0,y0=0)) clifford_attractor(a =-1.5, b=1.5, c=1, d=0.75 ) clifford = hv.DynamicMap(clifford_attractor, kdims=['a','b','c','d']) clifford # When run live, this cell's output should match the behavior of the GIF below clifford.redim.range(a=(-1.5,-1),b=(1.5,2),c=(1,1.2),d=(0.75,0.8), x=(-2,2), y=(-2,2)) def interactive_clifford(a,b,c,d,x=0,y=0): coords = clifford_equation(a,b,c,d,x0=x,y0=y) points = hv.Points(coords).opts(color='green') start = hv.Points(coords[0]).opts(color='black', size=10, alpha=1) step = hv.Curve(coords[:2], group='Init') text = hv.Text(0,1.75, 'x:{x:.2f} y:{y:.2f}'.format(x=coords[0][0],y=coords[0][1])) return points * start * step * text from holoviews.streams import PointerXY # When run live, this cell's output should match the behavior of the GIF below iclifford = hv.DynamicMap(interactive_clifford, kdims=['a','b','c','d'], streams=[PointerXY(x=0,y=0)]) iclifford.redim.range(a=(-1.4,-1),b=(1.6,1.8),c=(1,1.5),d=(0.7,0.8), x=(-2,2), y=(-2,2))