diff --git a/util/graph.py b/util/graph.py index 195aacf..ddfd62e 100644 --- a/util/graph.py +++ b/util/graph.py @@ -108,4 +108,103 @@ def vbar(value, width): """wrapper function""" return VBar(value, width).get_chars() +class BrailleGraph(object): + """ + graph using Braille chars + scaled to passed values + """ + chars = { + (0, 0): u" ", + (1, 0): u"\u2840", + (2, 0): u"\u2844", + (3, 0): u"\u2846", + (4, 0): u"\u2847", + (0, 1): u"\u2880", + (0, 2): u"\u28a0", + (0, 3): u"\u28b0", + (0, 4): u"\u28b8", + (1, 1): u"\u28c0", + (2, 1): u"\u28c4", + (3, 1): u"\u28c6", + (4, 1): u"\u28c7", + (1, 2): u"\u28e0", + (2, 2): u"\u28e4", + (3, 2): u"\u28e6", + (4, 2): u"\u28e7", + (1, 3): u"\u28f0", + (2, 3): u"\u28f4", + (3, 3): u"\u28f6", + (4, 3): u"\u28f7", + (1, 4): u"\u28f8", + (2, 4): u"\u28fc", + (3, 4): u"\u28fe", + (4, 4): u"\u28ff" + } + def __init__(self, values): + """ + Args: + + values (list): list of values + """ + self.values = values + # length of values list must be even + # because one Braille char displays two values + if len(self.values) % 2 == 1: + self.values.append(0) + self.steps = self.get_steps() + self.parts = [tuple(self.steps[i:i+2]) + for i in range(len(self.steps))[::2]] + + @staticmethod + def get_height(value, unit): + """ + Compute height of a value relative to unit + + Args: + + value (number): value + + unit (number): unit + """ + if value < unit / 10.: + return 0 + elif value <= unit: + return 1 + elif value <= unit * 2: + return 2 + elif value <= unit * 3: + return 3 + else: + return 4 + + def get_steps(self): + """ + Convert the list of values to a list of steps + + Return: list + """ + maxval = max(self.values) + unit = maxval / 4. + if unit == 0: + return [0] * len(self.values) + stepslist = [] + for value in self.values: + stepslist.append(self.get_height(value, unit)) + return stepslist + + def get_chars(self): + """ + Decide which chars to draw + + Return: str + """ + chars = [] + for part in self.parts: + chars.append(BrailleGraph.chars[part]) + return "".join(chars) + +def braille(values): + """wrapper function""" + return BrailleGraph(values).get_chars() + # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4