Python不调包实现条形图

Python绘制条形图:从简单到负数情况的实现
本文介绍了如何使用Python手写条形图,并提供了两种版本的代码,分别兼容Python2和Python3。示例中详细展示了如何绘制条形图,包括处理负数情况的方法。代码简洁易懂,适用于初学者和有经验的开发者进行数据可视化。

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'])

效果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值