Python手写条形图
Python打印条形图
Python3版
def bars(values, labels=None):
labels = labels or [str(i + 1) for i in range(len(values))]
maximum = max(values)
label_max_length = max(len(label) for label in labels)
for value, label in zip(values, labels):
length = int(value / maximum * 100)
print('%{}s'.format(label_max_length) % label, '#' * length, value)
bars([9, 15, 22, 50])
bars([9, 45, 22, 5], ['a', 'bb', 'ccc', 'MapReduce'])
效果
兼容Python2和3的版本
#!/usr/bin/python2
# coding=utf-8
def bars(values, labels=None, scaling=100):
"""
values: 数据列表
labels: 标签列表
scaling: 缩放比例
"""
labels = labels or [str(i + 1) for i in range(len(values))]
maximum = max(values)
label_max_length = max(len(label) for label in labels)
for value, label in zip(values, labels):
length = int((scaling * value) / maximum)
print('{} {} {}'.format('%{}s'.format(label_max_length) % label, '#' * length, value))
bars([9, 15, 22, 50])
bars([9, 45, 22, 5], ['a', 'bb', 'ccc', 'MapReduce'])
通常CentOS7装好了Python2,此代码可直接扔上去跑
标签为中文时可能会对不齐
Python2的/
和Python3不一样,3/2
结果是1
Python2的乘除法顺序有点奇怪,建议加括号
scaling
参数用来调整条形的长度
上面两个没考虑负数的情况
#!/usr/bin/python2
SCALING = 90
def get_bar_length(value, max_abs):
return int((abs(value) * SCALING) / max_abs)
def right_bar(length, value):
return '{} {}'.format('#' * length, value)
def left_bar(length, value, length_left):
return '{} {}'.format(value, '#' * length).rjust(length_left, ' ')
def bar(bar_length, value, length_left, mid):
if value > 0:
left = ' ' * length_left
right = right_bar(bar_length, value)
elif value < 0:
left = left_bar(bar_length, value, length_left)
right = ''
else:
left = ' ' * length_left
right = '0'
print(left + mid + right)
def bars(values, labels=None):
labels = labels or [str(i + 1) for i in range(len(values))]
label_max_length = max(len(label) for label in labels)
maximum = max(values)
minimum = min(values)
max_abs = max(abs(maximum), abs(minimum))
if max_abs == 0:
for value, label in zip(values, labels):
print(label, value)
else:
if minimum < 0:
value_length = len(str(minimum))
bar_length_left = get_bar_length(minimum, max_abs)
length_left = value_length + bar_length_left + 1
else:
length_left = 0
for value, label in zip(values, labels):
mid = ' %{}s '.format(label_max_length) % label
bar_length = get_bar_length(value, max_abs)
bar(bar_length, value, length_left, mid)
# bars([-1, -2, -3, -4])
# bars([0, 0, 0, 0])
# bars([1, 2, 3, 4])
bars([-12.5, -1.1, 0.0, 1.9, 9.1], ['Spark', 'Flink', 'TensorFlow', 'ClickHouse', 'HBase'])
效果