show_x_axis: Display X axis
        head: Show first [head:] elements
        tail: Show last [-tail:] elements
        padding: Padding size between columns (default 0)
        height: Override graph height
        label_length: Force X axis label string size, may truncate label
        show_min_max: Display Min and Max values on the left of the graph
        show_title: Display graph title (if any)
        show_data_range: Display X axis data range

def plot(graph, show_x_axis=True,
             head=None, tail=None, label_length=4, padding=0,
             height=2, show_min_max=True, show_data_range=True,
             show_title=True):
        """
        show_x_axis: Display X axis
        head: Show first [head:] elements
        tail: Show last [-tail:] elements
        padding: Padding size between columns (default 0)
        height: Override graph height
        label_length: Force X axis label string size, may truncate label
        show_min_max: Display Min and Max values on the left of the graph
        show_title: Display graph title (if any)
        show_data_range: Display X axis data range
        """
        def __plot(graph):
            def get_padding_str(label, value):
                padding_str = ''
                if  len(label) < label_length:
                    diff = label_length - len(label)
                    padding_str = ' ' * diff
                padding_str2 = ''
                if  len(str(value)) < m:
                    diff = m - len(str(value))
                    padding_str2 = ' ' * diff
                return '%s%s' % (padding_str,padding_str2)
            out = zip(*graph.strings)
            out.reverse()
            if graph.title and show_title:
                print graph.title
            lines = [sep.join(a) for a in out]
            if show_min_max:
                lines[0] = lines[0] + "   -- Max: %s" % str(max(graph.data))
                lines[-1] = lines[-1] + "   -- Min %s" % str(min(graph.data))
            print '\n'.join(lines)
            if graph.labels and show_x_axis:
                print (u'%s' % x_sep.join(['<%s>[%s]%s'
                        % (label[:label_length], str(v),
                            get_padding_str(label, v))
                            for label, v in zip(graph.labels, graph.data)]))
            if show_data_range and graph.labels:
                print 'Data range: %s - %s' % (graph.first_x, graph.last_x)

        graph.clean_range()
        if head:
            graph.head = head
        if tail:
            graph.tail = tail

        if height:
            graph.height = height

        if label_length < 1:
            label_length = 4

        max_label_length = max(map(len, graph.labels or ['']))

        if max_label_length < label_length:
            label_length = max_label_length

        sep = ''
        if padding >= 1:
            sep = ' ' * padding
        m = max(map(len, map(str, graph.data)))  # length of longest value
        x_sep = '  '
        if show_x_axis and graph.labels:
            # 2('[])' + 2('<>') + 1 space
            sep = ' ' * (label_length + 1 + 2 + m + 2)

        __plot(graph)