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中的面向对象编程的概念
Apr 27 Python
简单学习Python time模块
Apr 29 Python
Python闭包之返回函数的函数用法示例
Jan 27 Python
详谈Numpy中数组重塑、合并与拆分方法
Apr 17 Python
python 将print输出的内容保存到txt文件中
Jul 17 Python
在python中使用with打开多个文件的方法
Jan 07 Python
Python Numpy库datetime类型的处理详解
Jul 13 Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 Python
django使用F方法更新一个对象多个对象字段的实现
Mar 28 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 Python
Python连接Mysql进行增删改查的示例代码
Aug 03 Python
Django自定义YamlField实现过程解析
Nov 11 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
You might like
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
PHP下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
PHP新手入门学习方法
2011/05/08 PHP
PHP版国家代码、缩写查询函数代码
2011/08/14 PHP
php使用cookie保存用户登录的用户名实例
2015/01/26 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
关于jquery的多个选择器的使用示例
2013/10/18 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
2014/03/17 Javascript
javascript动态创建表格及添加数据实例详解
2015/05/13 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
vue中的mescroll搜索运用及各种填坑处理
2019/10/30 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
Python实现图像几何变换
2015/07/06 Python
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
Python端口扫描简单程序
2016/11/10 Python
Python安装lz4-0.10.1遇到的坑
2018/05/20 Python
python实现美团订单推送到测试环境,提供便利操作示例
2019/08/09 Python
keras 解决加载lstm+crf模型出错的问题
2020/06/10 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
阿里旅行:飞猪
2017/01/05 全球购物
奥地利婴儿用品和玩具购物网站:baby-markt.at
2020/01/26 全球购物
书香校园活动方案
2014/02/28 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
材料物理专业求职信
2014/09/01 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
首席执行官观后感
2015/06/03 职场文书
小型企业的绩效考核制度模板
2019/11/21 职场文书