Python万能模板案例之matplotlib绘制甘特图


Posted in Python onApril 13, 2022

定义一个绘制甘特图的类

# -*- coding: utf-8 -*-
 
from datetime import datetime
import sys
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager
import matplotlib.dates as mdates
import logging
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
 
class Gantt(object):
    #颜色色标:参考http://colorbrewer2.org/
    RdYlGr = ['#d73027', '#f46d43', '#fdae61','#fee08b', '#ffffbf', '#d9ef8b','#a6d96a', '#66bd63', '#1a9850']
 
    POS_START = 1.0
    POS_STEP = 0.5
 
    def __init__(self, tasks):
        self._fig = plt.figure(figsize=(15,10))
        self._ax = self._fig.add_axes([0.1, 0.1, .75, .5])
 
        self.tasks = tasks[::-1]  # 倒序
 
    def _format_date(self, date_string):
        try:
            date = datetime.datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S')  # 将日期字符串转换成datetime类型
        except ValueError as err:
            logging.error("String '{0}' can not be converted to datetime object: {1}"
                   .format(date_string, err))
            sys.exit(-1)
        mpl_date = mdates.date2num(date)  # 得到日期类型的时间戳
        return mpl_date
 
    def _plot_bars(self):
        i = 0
        for task in self.tasks:
            start = self._format_date(task['start'])  # 获取任务开始时间的时间戳
            end = self._format_date(task['end'])      # 获取任务结束时间的时间戳
            bottom = (i * Gantt.POS_STEP) + Gantt.POS_START
            width = end - start    # 柱子的宽度
            self._ax.barh(bottom, width, left=start, height=0.3,align='center', label=task['label'],color = Gantt.RdYlGr[i%len(Gantt.RdYlGr)])
            i += 1
 
    def _configure_yaxis(self):
        task_labels = [t['label'] for t in self.tasks]   # 所有的刻度文本标签
        pos = self._positions(len(task_labels))          # 素有的刻度值
        ylocs = self._ax.set_yticks(pos)                 # 设置y轴刻度线
        ylabels = self._ax.set_yticklabels(task_labels)  # 设置y轴刻度标签
        plt.setp(ylabels, size='medium')                 # 设置y轴刻度标签属性(中号字)
 
    def _configure_xaxis(self):
        self._ax.xaxis_date()     # 使用时间轴
        rule = mdates.rrulewrapper(mdates.WEEKLY, interval=1)   # 生成时间生成器(每周1个值,从周日开始)
        loc = mdates.RRuleLocator(rule)                         # 生成时间刻度
        formatter = mdates.DateFormatter("%m/%d")               # 生成时间格式
 
        self._ax.xaxis.set_major_locator(loc)          # 设置主刻度
        self._ax.xaxis.set_major_formatter(formatter)  # 设置主刻度标签格式
        xlabels = self._ax.get_xticklabels()           # 获取刻度标签对象
        plt.setp(xlabels, rotation=70, fontsize=10)    # 设置刻度标签对象的属性(30度旋转,字体大小10)
 
    def _configure_figure(self):
        self._configure_xaxis()
        self._configure_yaxis()
 
        self._ax.grid(True, axis='x',color='gray')
        self._set_legend()
        self._fig.autofmt_xdate()
 
    def _set_legend(self):
        font = font_manager.FontProperties(size='small')
        self._ax.legend(loc='upper right', prop=font)
 
    def _positions(self, count):
        end = count * Gantt.POS_STEP + Gantt.POS_START
        pos = np.arange(Gantt.POS_START, end, Gantt.POS_STEP)
        return pos
    
    def show(self):
        self._plot_bars()
        self._configure_figure()
        plt.show()

调用及数据格式

if __name__ == '__main__':
    TEST_DATA = (
                 { 'label': '项目调研', 'start':'2019-02-01 12:00:00', 'end': '2019-03-15 18:00:00'},
                 { 'label': '项目准备', 'start':'2019-02-15 09:00:00', 'end': '2019-04-09 12:00:00'},
                 { 'label': '制定方案', 'start':'2019-04-10 12:00:00', 'end': '2019-05-30 18:00:00'},
                 { 'label': '项目实施', 'start':'2019-05-01 09:00:00', 'end': '2019-08-31 13:00:00'},
                 { 'label': '项目培训', 'start':'2019-07-01 09:00:00', 'end': '2019-09-21 13:00:00'},
                 { 'label': '项目验收', 'start':'2019-09-22 09:00:00', 'end': '2019-10-22 13:00:00'},
                 { 'label': '项目竣工', 'start':'2019-10-23 09:00:00', 'end': '2019-11-23 13:00:00'},
                )
    
    gantt = Gantt(TEST_DATA)
    plt.xlabel('项目日期')
    plt.ylabel('项目进度')
    plt.title('项目进度甘特图')
    plt.figure(figsize=(10,10),dpi=150)
    gantt.show()

类似于展示的图形

Python万能模板案例之matplotlib绘制甘特图

 到此这篇关于matplotlib绘制甘特图的万能模板案例的文章就介绍到这了!

Python 相关文章推荐
python中将字典转换成其json字符串
Jul 16 Python
python中使用pyhook实现键盘监控的例子
Jul 18 Python
Python中操作MySQL入门实例
Feb 08 Python
编写Python脚本批量下载DesktopNexus壁纸的教程
May 06 Python
Python使用CMD模块更优雅的运行脚本
May 11 Python
Python实现Linux命令xxd -i功能
Mar 06 Python
Python中列表、字典、元组数据结构的简单学习笔记
Mar 20 Python
Python三级目录展示的实现方法
Sep 28 Python
numpy排序与集合运算用法示例
Dec 15 Python
在django项目中导出数据到excel文件并实现下载的功能
Mar 13 Python
Keras:Unet网络实现多类语义分割方式
Jun 11 Python
python空元组在all中返回结果详解
Dec 15 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
You might like
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
PHP扩展编写点滴 技巧收集
2010/03/09 PHP
php metaphone()函数及php localeconv() 函数实例解析
2016/05/15 PHP
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
通过JS获取Request.QueryString()参数的值实现方法
2016/09/27 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
用nodeJS搭建本地文件服务器的几种方法小结
2017/03/16 NodeJs
基于Vue的文字跑马灯组件(npm 组件包)
2017/05/24 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
2018/11/14 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
2018/11/16 Javascript
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
python二分查找算法的递归实现方法
2016/05/12 Python
python将字母转化为数字实例方法
2019/10/04 Python
Python三元运算与lambda表达式实例解析
2019/11/30 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
Python3.x+pyqtgraph实现数据可视化教程
2020/03/14 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
iKRIX意大利网上商店:男女豪华服装和配件
2019/10/09 全球购物
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
应急管理培训方案
2014/06/12 职场文书
自我管理的活动方案
2014/08/25 职场文书
支部书记四风对照材料
2014/08/28 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书
纯CSS实现酷炫的霓虹灯效果
2021/04/13 HTML / CSS
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers
SQLServer中exists和except用法介绍
2021/12/04 SQL Server
Golang gRPC HTTP协议转换示例
2022/06/16 Golang
Flink 侧流输出源码示例解析
2022/09/23 Servers