def function(f='sin(x)', xmin=-1, xmax=1, steps=200, p='x', g=None, erange=False, plotter=xy_data, complex_plane=False, **kwargs): """ Plots the function over the specified range f function or list of functions to plot; can be string functions xmin, xmax, steps range over which to plot, and how many points to plot p if using strings for functions, p is the parameter name g optional dictionary of extra globals. Try g=globals() erange Use exponential spacing of the x data? plotter function used to plot the generated data complex_plane plot imag versus real of f? **kwargs are sent to spinmob.plot.real_imag.data() """ if not g: g = {} # do the opposite kind of update() for k in globals().keys(): if not g.has_key(k): g[k] = globals()[k] # if the x-axis is a log scale, use erange if erange: x = _fun.erange(xmin, xmax, steps) else: x = _n.linspace(xmin, xmax, steps) # make sure it's a list so we can loop over it if not type(f) in [type([]), type(())]: f = [f] # loop over the list of functions xdatas = [] ydatas = [] labels = [] for fs in f: if type(fs) == str: a = eval('lambda ' + p + ': ' + fs, g) a.__name__ = fs else: a = fs # try directly evaluating try: y = a(x) # do it the slow way. except: y = [] for z in x: y.append(a(z)) xdatas.append(x) ydatas.append(y) labels.append(a.__name__) if not kwargs.has_key('xlabel'): kwargs['xlabel'] = p if not kwargs.has_key('label'): kwargs['label'] = labels # plot! if complex_plane: plotter(real(ydatas),imag(ydatas), **kwargs) else: plotter(xdatas, ydatas, **kwargs)
def function(f='sin(x)', xmin=-1, xmax=1, steps=200, p='x', g=None, erange=False, plotter=xy_data, complex_plane=False, **kwargs): """ Plots the function over the specified range f function or list of functions to plot; can be string functions xmin, xmax, steps range over which to plot, and how many points to plot p if using strings for functions, p is the parameter name g optional dictionary of extra globals. Try g=globals() erange Use exponential spacing of the x data? plotter function used to plot the generated data complex_plane plot imag versus real of f? **kwargs are sent to spinmob.plot.real_imag.data() """ if not g: g = {} # do the opposite kind of update() for k in list(globals().keys()): if k not in g: g[k] = globals()[k] # if the x-axis is a log scale, use erange if erange: x = _fun.erange(xmin, xmax, steps) else: x = _n.linspace(xmin, xmax, steps) # make sure it's a list so we can loop over it if not type(f) in [type([]), type(())]: f = [f] # loop over the list of functions xdatas = [] ydatas = [] labels = [] for fs in f: if type(fs) == str: a = eval('lambda ' + p + ': ' + fs, g) a.__name__ = fs else: a = fs # try directly evaluating try: y = a(x) # do it the slow way. except: y = [] for z in x: y.append(a(z)) xdatas.append(x) ydatas.append(y) labels.append(a.__name__) if 'xlabel' not in kwargs: kwargs['xlabel'] = p if 'label' not in kwargs: kwargs['label'] = labels # plot! if complex_plane: plotter(_n.real(ydatas),_n.imag(ydatas), **kwargs) else: plotter(xdatas, ydatas, **kwargs)
def parametric_function(fx='sin(t)', fy='cos(t)', tmin=-1, tmax=1, steps=200, p='t', g=None, erange=False, **kwargs): """ Plots the parametric function over the specified range fx, fy function or list of functions to plot; can be string functions xmin, xmax, steps range over which to plot, and how many points to plot p if using strings for functions, p is the parameter name g optional dictionary of extra globals. Try g=globals()! erange Use exponential spacing of the t data? **kwargs are sent to spinmob.plot.xy.data() """ if not g: g = {} for k in globals().keys(): if not g.has_key(k): g[k] = globals()[k] # if the x-axis is a log scale, use erange if erange: r = _fun.erange(tmin, tmax, steps) else: r = _n.linspace(tmin, tmax, steps) # make sure it's a list so we can loop over it if not type(fy) in [type([]), type(())]: fy = [fy] if not type(fx) in [type([]), type(())]: fx = [fx] # loop over the list of functions xdatas = [] ydatas = [] labels = [] for fs in fx: if type(fs) == str: a = eval('lambda ' + p + ': ' + fs, g) a.__name__ = fs else: a = fs x = [] for z in r: x.append(a(z)) xdatas.append(x) labels.append(a.__name__) for n in range(len(fy)): fs = fy[n] if type(fs) == str: a = eval('lambda ' + p + ': ' + fs, g) a.__name__ = fs else: a = fs y = [] for z in r: y.append(a(z)) ydatas.append(y) labels[n] = labels[n] + ', ' + a.__name__ # plot! xy_data(xdatas, ydatas, label=labels, **kwargs)
def parametric_function(fx='sin(t)', fy='cos(t)', tmin=-1, tmax=1, steps=200, p='t', g=None, erange=False, **kwargs): """ Plots the parametric function over the specified range fx, fy function or list of functions to plot; can be string functions xmin, xmax, steps range over which to plot, and how many points to plot p if using strings for functions, p is the parameter name g optional dictionary of extra globals. Try g=globals()! erange Use exponential spacing of the t data? **kwargs are sent to spinmob.plot.xy.data() """ if not g: g = {} for k in globals().keys(): if not g.has_key(k): g[k] = globals()[k] # if the x-axis is a log scale, use erange if erange: r = _fun.erange(tmin, tmax, steps) else: r = _n.linspace(tmin, tmax, steps) # make sure it's a list so we can loop over it if not type(fy) in [type([]), type(())]: fy = [fy] if not type(fx) in [type([]), type(())]: fx = [fx] # loop over the list of functions xdatas = [] ydatas = [] labels = [] for fs in fx: if type(fs) == str: a = eval('lambda ' + p + ': ' + fs, g) a.__name__ = fs else: a = fs x = [] for z in r: x.append(a(z)) xdatas.append(x) labels.append(a.__name__) for n in range(len(fy)): fs = fy[n] if type(fs) == str: a = eval('lambda ' + p + ': ' + fs, g) a.__name__ = fs else: a = fs y = [] for z in r: y.append(a(z)) ydatas.append(y) labels[n] = labels[n]+', '+a.__name__ # plot! xy_data(xdatas, ydatas, label=labels, **kwargs)