Source code for modelparameters.sympy.plotting.textplot

from __future__ import print_function, division

from ..core.symbol import Dummy
from ..core.compatibility import range
from ..utilities.lambdify import lambdify


[docs]def textplot(expr, a, b, W=55, H=18): """ Print a crude ASCII art plot of the SymPy expression 'expr' (which should contain a single symbol, e.g. x or something else) over the interval [a, b]. Examples ======== textplot(sin(t)*t, 0, 15) """ free = expr.free_symbols if len(free) > 1: raise ValueError("length can not be greater than 1") x = free.pop() if free else Dummy() f = lambdify([x], expr) a = float(a) b = float(b) # Calculate function values y = [0] * W for x in range(W): try: y[x] = f(a + (b - a)/float(W)*x) except (TypeError, ValueError): y[x] = 0 # Normalize height to screen space ma = max(y) mi = min(y) if ma == mi: if ma: mi, ma = sorted([0, 2*ma]) else: mi, ma = -1, 1 for x in range(W): y[x] = int(float(H)*(y[x] - mi)/(ma - mi)) margin = 7 print for h in range(H - 1, -1, -1): s = [' '] * W for x in range(W): if y[x] == h: if (x == 0 or y[x - 1] == h - 1) and (x == W - 1 or y[x + 1] == h + 1): s[x] = '/' elif (x == 0 or y[x - 1] == h + 1) and (x == W - 1 or y[x + 1] == h - 1): s[x] = '\\' else: s[x] = '.' # Print y values if h == H - 1: prefix = ("%g" % ma).rjust(margin)[:margin] elif h == H//2: prefix = ("%g" % ((mi + ma)/2)).rjust(margin)[:margin] elif h == 0: prefix = ("%g" % mi).rjust(margin)[:margin] else: prefix = " "*margin s = "".join(s) if h == H//2: s = s.replace(" ", "-") print(prefix + " | " + s) # Print x values bottom = " " * (margin + 3) bottom += ("%g" % a).ljust(W//2 - 4) bottom += ("%g" % ((a + b)/2)).ljust(W//2) bottom += "%g" % b print(bottom)