def make_graph(values, lower_limit=<NUM_LIT:0.0>, upper_limit=<NUM_LIT>, style="<STR_LIT>"):
values = [float(n) for n in values]<EOL>mn, mx = min(values), max(values)<EOL>mn = mn if lower_limit is None else min(mn, float(lower_limit))<EOL>mx = mx if upper_limit is None else max(mx, float(upper_limit))<EOL>extent = mx - mn<EOL>if style == '<STR_LIT>':<EOL><INDENT>bar = '<STR_LIT>'<EOL>bar_count = len(bar) - <NUM_LIT:1><EOL>if extent == <NUM_LIT:0>:<EOL><INDENT>graph = '<STR_LIT:_>' * len(values)<EOL><DEDENT>else:<EOL><INDENT>graph = '<STR_LIT>'.join(bar[int((n - mn) / extent * bar_count)] for n in values)<EOL><DEDENT><DEDENT>elif style in ['<STR_LIT>', '<STR_LIT>', '<STR_LIT>']:<EOL><INDENT>vpad = values if len(values) % <NUM_LIT:2> == <NUM_LIT:0> else values + [mn]<EOL>vscale = [round(<NUM_LIT:4> * (vp - mn) / extent) for vp in vpad]<EOL>l = len(vscale) // <NUM_LIT:2><EOL>if '<STR_LIT>' in style:<EOL><INDENT>vbits = [[<NUM_LIT:0>, <NUM_LIT>, <NUM_LIT>, <NUM_LIT>, <NUM_LIT>][vs] for vs in vscale]<EOL><DEDENT>elif '<STR_LIT>' in style:<EOL><INDENT>vbits = [[<NUM_LIT:0>, <NUM_LIT>, <NUM_LIT>, <NUM_LIT>, <NUM_LIT>][vs] for vs in vscale]<EOL><DEDENT>else:<EOL><INDENT>assert('<STR_LIT>' in style)<EOL>vb2 = [vscale[<NUM_LIT:0>]] + vscale + [<NUM_LIT:0>]<EOL>vbits = []<EOL>for i in range(<NUM_LIT:1>, l + <NUM_LIT:1>):<EOL><INDENT>c = <NUM_LIT:0><EOL>for j in range(min(vb2[i - <NUM_LIT:1>], vb2[i], vb2[i + <NUM_LIT:1>]), vb2[i] + <NUM_LIT:1>):<EOL><INDENT>c |= [<NUM_LIT:0>, <NUM_LIT>, <NUM_LIT>, <NUM_LIT>, <NUM_LIT>][j]<EOL><DEDENT>vbits.append(c)<EOL><DEDENT><DEDENT>graph = '<STR_LIT>'<EOL>for i in range(<NUM_LIT:0>, l, <NUM_LIT:2>):<EOL><INDENT>b1 = vbits[i]<EOL>b2 = vbits[i + <NUM_LIT:1>]<EOL>if b2 & <NUM_LIT>:<EOL><INDENT>b2 = b2 - <NUM_LIT><EOL><DEDENT>b2 = b2 << <NUM_LIT:3><EOL>graph += chr(<NUM_LIT> + b1 + b2)<EOL><DEDENT><DEDENT>else:<EOL><INDENT>raise NotImplementedError("<STR_LIT>" % style)<EOL><DEDENT>return graph<EOL>
Draws a graph made of unicode characters.

:param values: An array of values to graph.
:param lower_limit: Minimum value for the y axis (or None for dynamic).
:param upper_limit: Maximum value for the y axis (or None for dynamic).
:param style: Drawing style ('blocks', 'braille-fill', 'braille-peak', or 'braille-snake').
:returns: Bar as a string