分享一个拿来即用的柱状图绘制函数

news2024/11/15 13:34:43

分享一个自己写的柱状图绘制函数,可用来绘制横向的多柱状图、堆积柱状图,纵向的多柱状图、堆积柱状图。便于我们方便快捷的绘制相应的柱状图。该函数参数不多,只用于观察数据形式是足够的,若要绘制更加精美的柱状图,大家可自行调整。

欢迎关注本人同名公众号--交通数据探索师

import random
import matplotlib.pyplot as plt
import numpy as np

def generate_colors(num):
    """随机生成num个不同的颜色"""
    random.seed(123)

    colors = []
    while len(colors) <= num:
        color = '#{:06x}'.format(random.randint(0, 0xFFFFFF))
        if color not in colors:
            colors.append(color)
    return colors

def bars(data, cols, labels, kind='s', title='', x_label='', y_label='', width=0.4, grid=False, x_rotation=0,
         y_rotation=0, legend=False, filename=''):
    """绘制柱状图 包括双柱状图等多柱状图  横竖累积柱状图
    demo: bars(data, cols=['a', 'b', 'c', 'd', 'e'], labels=['b', 'c', 'd', 'e'], width=0.2, filename='l1')
    cols中第一个元素对应x轴, 其余元素对应y轴
    kind: 绘制柱状图的种类  {h: 横柱状图, s: 竖柱状图, l1: 竖累积柱状图, l2: 横累积柱状图}
    title: 标题
    x_label: x轴标签
    y_label: y轴标签
    width: 柱子宽度
    grid: 是否显示网格
    x_rotation: x轴标签旋转角度
    legend: 是否显示图例
    filename: 保存的文件名
    """
    # 解决中文乱码问题,并设置字体
    plt.rcParams['axes.unicode_minus'] = False
    plt.rcParams['font.family'] = ['SimHei']
    plt.rcParams['font.sans-serif'] = ['SimHei']
    
    fig, ax = plt.subplots(figsize=(6, 2.5), dpi=300)

    x_ticks = np.arange(data[cols[0]].nunique())

    if len(cols[1:]) > 4:
        bar_colors = generate_colors(len(cols) - 1)
    else:
        # 设置好的四个颜色 如果柱子个数<=4就用这四个颜色中的几个
        bar_colors = ['#63b5ef', '#73de94', '#ffce7b', '#ff948c']

    if (len(cols) - 1) % 2 == 0:  # 偶数根柱子
        center = (len(cols) - 1) / 2
        for r, col in enumerate(cols[1:]):
            if kind == 's':
                ax.bar([x + (r - center) * width + width / 2 for x in x_ticks], data[col], lw=0.4,
                       color=bar_colors[r], edgecolor="k", label=labels[r], width=width)
                plt.xticks(x_ticks, labels=data[cols[0]].unique())
                plt.xlabel(x_label, fontsize=5)
                plt.ylabel(y_label, fontsize=5)
            elif kind == 'h':
                ax.barh([x + (r - center) * width + width / 2 for x in x_ticks], data[col], lw=0.4,
                        color=bar_colors[r], edgecolor="k", label=labels[r], height=width)
                plt.yticks(x_ticks, labels=data[cols[0]].unique())
                plt.xlabel(y_label, fontsize=5)
                plt.ylabel(x_label, fontsize=5)  
            elif kind == 'l1':
                # r==0表示是最下面那根柱子, 则bottom=0 否则==前面几列的和
                bottom = 0 if r == 0 else data[cols[1:][:r]].sum(axis=1)
                ax.bar(x_ticks, data[col], bottom=bottom, lw=0.4,
                       color=bar_colors[r], edgecolor="k", label=labels[r], width=width)
                plt.xticks(x_ticks, labels=data[cols[0]].unique())
                plt.xlabel(x_label, fontsize=5)
                plt.ylabel(y_label, fontsize=5)
            elif kind == 'l2':
                bottom = 0 if r == 0 else data[cols[1:][:r]].sum(axis=1)
                ax.barh(x_ticks, data[col], left=bottom, lw=0.4,
                        color=bar_colors[r], edgecolor="k", label=labels[r], height=width)
                plt.yticks(x_ticks, labels=data[cols[0]].unique())
                plt.xlabel(y_label, fontsize=5)
                plt.ylabel(x_label, fontsize=5)
            else:
                print('kind参数输入错误: {h: 横柱状图, s: 竖柱状图, l1: 竖累积柱状图, l2: 横累积柱状图}')

    else:
        center = (len(cols) - 1) // 2
        for r, col in enumerate(cols[1:]):
            if kind == 's':
                ax.bar([x + (r - center) * width for x in x_ticks], data[col], lw=0.4,
                       color=bar_colors[r], edgecolor="k", label=labels[r], width=width)
                plt.xticks(x_ticks, labels=data[cols[0]].unique())
                plt.xlabel(x_label, fontsize=5)
                plt.ylabel(y_label, fontsize=5)
            elif kind == 'h':
                ax.barh([x + (r - center) * width for x in x_ticks], data[col], lw=0.4,
                        color=bar_colors[r], edgecolor="k", label=labels[r], height=width)
                plt.yticks(x_ticks, labels=data[cols[0]].unique())
                plt.xlabel(y_label, fontsize=5)
                plt.ylabel(x_label, fontsize=5)
            elif kind == 'l1':
                # r==0表示是最下面那根柱子, 则bottom=0 否则==前面几列的和
                bottom = 0 if r == 0 else data[cols[1:][:r]].sum(axis=1)
                ax.bar(x_ticks, data[col], bottom=bottom, lw=0.4,
                       color=bar_colors[r], edgecolor="k", label=labels[r], width=width)
                plt.xticks(x_ticks, labels=data[cols[0]].unique())
                plt.xlabel(x_label, fontsize=5)
                plt.ylabel(y_label, fontsize=5)
            elif kind == 'l2':
                bottom = 0 if r == 0 else data[cols[1:][:r]].sum(axis=1)
                ax.barh(x_ticks, data[col], left=bottom, lw=0.4,
                        color=bar_colors[r], edgecolor="k", label=labels[r], height=width)
                plt.yticks(x_ticks, labels=data[cols[0]].unique())
                plt.xlabel(y_label, fontsize=5)
                plt.ylabel(x_label, fontsize=5)
            else:
                print('kind参数输入错误: {h: 横柱状图, s: 竖柱状图, l1: 竖累积柱状图, l2: 横累积柱状图}')

    # 修饰参数
    plt.title(title, fontsize=7)
    if grid:
        plt.grid(axis='both', linestyle=":")
    if legend:
        plt.legend(fontsize=5, ncols=4, loc='lower center', bbox_to_anchor=(0.5, -0.27))
    else:
        plt.legend(fontsize=5)
    # 轴刻度参数
    ax.tick_params(axis='x', labelsize=5, rotation=x_rotation)
    ax.tick_params(axis='y', labelsize=5, rotation=y_rotation)
    plt.tight_layout()
    if filename == '':
        plt.savefig('柱状图.png')
    else:
        plt.savefig('{filename}.png')
    return fig

使用如下示例数据进行演示

import pandas as pd

data = pd.DataFrame(
    {
        '1': list('abcdefg'),
        '2':range(1, 8),
        '3': range(2, 9),
        '4': range(3, 10),
        '5': range(4, 11),
        '6': range(5, 12)
    }
)

竖柱状图

bars(data, ['1', '2', '3', '4', '5', '6'], ['2', '3', '4', '5', '6'], width=0.1, kind='s')

bars(data, ['1', '2', '3', '4'], ['2', '3', '4'], width=0.1, kind='s')

 

横柱状图

bars(data, ['1', '2', '3', '4'], ['2', '3', '4'], width=0.2, kind='h')

bars(data, ['1', '2', '3', '4'], ['2', '3', '4'], width=0.2, kind='l1')

 

横累积柱状图

bars(data, ['1', '2', '3', '4'], ['2', '3', '4'], width=0.4, kind='l2')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038675.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Avnet ZUBoard 1CG开发板上手—深度学习新选择

Avnet ZUBoard 1CG 开发板上手—深度学习新选择 摘要 本文主要介绍了 Avnet ZUBoard 1CG 开发板的特性、架构、硬件单元等概念&#xff0c;并对如何使用以太网接口和串口连接开发板进行基本介绍&#xff0c;同时辅以两个应用例程演示其功能。 原文链接&#xff1a; FreakSt…

clamp靶机复现

靶机设置 设置靶机为NAT模式 靶机IP发现 nmap 192.168.112.0/24 靶机IP为192.168.112.143 目录扫描 dirsearch 192.168.112.143 访问浏览器 提示让我们扫描更多的目录 换个更大的字典&#xff0c;扫出来一个 /nt4stopc/ 目录 目录拼接 拼接 /nt4stopc/ 发现页面中有很多…

数据结构----队列

一、队列 1&#xff09;队列定义 队列(Queue)是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表。 允许插入的端是队尾&#xff0c;允许删除的端是队头。队列是一个先进先出(FIFO)的线性表&#xff0c;相应 的也有顺序存储和链式存储两种方式。 2&#…

macOS Sonoma 14.6.1 (23G93) Boot ISO 原版可引导镜像下载

macOS Sonoma 14.6.1 (23G93) Boot ISO 原版可引导镜像下载 2024 年 8 月 8 日凌晨&#xff0c;macOS Sonoma 14.6.1 发布&#xff0c;本更新包含了重要的错误修复&#xff0c;并解决了导致高级数据保护无法启用或停用的问题。同时带来了 macOS Ventura 13.6.9 安全更新。 本…

ant-design源码解析——Upload上传组件

前言 文件上传是我们开发中不可或缺的一部分&#xff0c;我们将在本文深入解析Ant Design Upload组件的实现。 相信看完以后对于React以及Ant Design的工作原理理解能更上一层楼。 Upload.tsx 入口函数upload.tsx直接引用了AjaxUpload组件&#xff0c;引用了一些能力&#…

UVa1660/LA3031 Cable TV Network

UVa1660/LA3031 Cable TV Network 题目链接题意分析AC 代码 题目链接 本题是2004年icpc欧洲区域赛东南欧赛区的题目 题意 给定一个n&#xff08;n≤50&#xff09;个点的无向图&#xff0c;求它的点连通度&#xff0c;即最少删除多少个点&#xff0c;使得图不连通。如下图所示…

Java日志体系框架总结:JUL、JCL、SLF4J、Log4j、Logback、Log4j2

概述 日志记录是应用程序运行中必不可少的一部分。具有良好格式和完备信息的日志&#xff0c;可以在程序出现问题时帮助开发人员迅速地定位错误的根源。日志所能提供的功能是多种多样的&#xff0c;包括记录程序运行时产生的错误信息、状态信息、调试信息和执行时间信息等。 …

Day 22~28 MySQL

MySQL 1、数据库 JavaEE&#xff1a;企业级开发 Web 前端 &#xff08;页面&#xff1a;展示&#xff0c;数据&#xff09; 后台&#xff08;连接点&#xff1a;连接数据库JDBC&#xff0c;连接前端&#xff08;控制&#xff0c;控制视图跳转&#xff0c;给前端传递数据&…

dedecms织梦 验证码不显示问题

dedecms验证码不显示呢?近期小编仔细研究了一下并根据网上的各个版本总结下面几种解决方法&#xff1a; 问题一&#xff1a;首先先确定php配置环境没问题&#xff0c;如果一个服务器有的网站显示验证码有的不显示&#xff0c;可以排除运行环境的问题;出现这种情况有可能是&…

学习日志8.14--ALC(Access Control List)访问控制列表

ACL访问控制列表是一条或者多条流量规则的集合&#xff0c;作用主要用于流量的匹配&#xff0c;还可以匹配路由。通过ACL对流量加以控制&#xff0c;通过配合使用过滤工具&#xff0c;对流量进行拦截。需要注意的是ACL只是一个个匹配工具&#xff0c;负责匹配源IP地址、目的IP地…

nestjs 全栈进阶--typeorm 一对一

1. 介绍 在 TypeORM 中&#xff0c;一对一&#xff08;One-to-One&#xff09;关系是一种数据库关系&#xff0c;其中一个表中的每一行只与另一个表中的一行相关联。比如用户和身份证 2. 准备 我们还是将就上节课的项目&#xff0c;不过我们需要把数据库删除了 右键&#x…

[CSS3]2D与3D变换技术详解

文章目录 2D变换&#xff08;2D Transform&#xff09;3D变换&#xff08;3D Transform&#xff09;结语 CSS3中的2D变换与3D变换是指通过transform属性对HTML元素进行几何操作&#xff0c;使其在二维或三维空间中进行移动、旋转、缩放和倾斜等变换。这些变换为前端开发者提供了…

秒通多语种!2024年超实用的4款翻译在线工具,真心好用

互联网时代让沟通变得没有界限。不论是和邻居闲聊家常&#xff0c;还是与远在海外的朋友畅谈&#xff0c;现在都非常容易。特别是对于正在学习外语的人来说&#xff0c;在线翻译工具就像是超级英雄的披风一样重要。我研究了很多资料&#xff0c;找到了几款性价比非常高的翻译在…

Java虚拟机:类的加载机制

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 034 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

【BUU】[Dest0g3 520迎新赛]Really Easy SQL

2024/8/14 [Dest0g3 520迎新赛]Really Easy SQL 题目标题说明是SQL注入 题目首页 页面title显示是钓鱼站点。 钓鱼站点主要为将我们的输入信息保存在数据库。后台应该是插入语句。 这里无论输入什么都显示密码错误, 只能尝试盲注&#xff0c;基于时间的盲注, 这里经过测试p…

OPC DAY-上海场提前预告:Softing带您探索“智能工厂中的OPC应用”

&#xff08;图片来源于&#xff1a;OPC基金会官网&#xff09; 时间&#xff1a;2024年9月25日 14:00-14:30 | OPC DAY-上海站 地点&#xff1a;上海国家会展中心-5.1H M5-03会议室 2024年9月24-28日&#xff0c;第二十四届中国国际工业博览会将于国家会展中心&#xff08;上…

Linux 中的同步机制

代码基于&#xff1a;Kernel 6.6 临界资源&#xff1a;指哪些在同一时刻只允许被一个线程访问的软件或硬件资源。这种资源的特点是&#xff0c;如果有线程正在使用&#xff0c;其他进程必须等待直到该线程释放资源。 临界区&#xff1a;指在每个线程中访问临界资源的那段代码。…

vue3结合海康WEB开发包,开发web在线预览视频

我们这里选择V3.3版本 文档地址&#xff1a;https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type20&id4c945d18fa5f49638ce517ec32e24e24 解压过后&#xff0c;会有三个文件夹 在docs中&#xff0c;点开Demo使用说明&#xff0c;按照流程先测试下&…

赋能基层,融合创新:EasyCVR视频汇聚平台构建平安城市视频共享系统

一、雪亮工程建设的意义 雪亮工程的核心在于通过高清视频监控、环境监测和智能预警等先进技术手段&#xff0c;构建一个高效、智能、安全、便捷的社会安全防控体系。这一工程的建设不仅代表了现代化科技手段在城市治安管理中的应用&#xff0c;更是提升社会安全保障能力、推动…

树形结构查找(B树、B+树)

平衡树结构的树高为 O(logn) &#xff0c;平衡树结构包括两种平衡二叉树结构&#xff08;分别为 AVL 树和 RBT&#xff09;以及一种树结构&#xff08;B-Tree&#xff0c;又称 B 树&#xff0c;它的度大于 2 &#xff09;。AVL 树和 RBT 适合内部存储的应用&#xff0c;而 B 树…