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中使用成员运算符的示例
May 13 Python
基于python爬虫数据处理(详解)
Jun 10 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
对python requests的content和text方法的区别详解
Oct 11 Python
利用python循环创建多个文件的方法
Oct 25 Python
Python中正则表达式的用法总结
Feb 22 Python
anaconda如何查看并管理python环境
Jul 05 Python
Python连接字符串过程详解
Jan 06 Python
python3 deque 双向队列创建与使用方法分析
Mar 24 Python
django 模版关闭转义方式
May 14 Python
Python闭包及装饰器运行原理解析
Jun 17 Python
python爬虫线程池案例详解(梨视频短视频爬取)
Feb 20 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
You might like
PHP 错误之引号中使用变量
2009/05/04 PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
2012/03/07 PHP
php数据访问之增删改查操作
2016/05/09 PHP
php微信开发之上传临时素材
2016/06/24 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
2016/01/05 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
html5+javascript实现简单上传的注意细节
2016/04/18 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
jQuery+HTML5实现弹出创意搜索框层
2016/12/29 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
微信小程序wx:for和wx:for-item的用法详解
2018/04/01 Javascript
详解vue-router传参的两种方式
2018/09/10 Javascript
深入理解vue-class-component源码阅读
2019/02/18 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
2021/02/07 Vue.js
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
python概率计算器实例分析
2015/03/25 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
python @classmethod 的使用场合详解
2019/08/23 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
python3中for循环踩过的坑记录
2020/12/14 Python
Python字节单位转换(将字节转换为K M G T)
2021/03/02 Python
linux面试相关问题
2013/04/28 面试题
企业安全生产责任书
2014/04/14 职场文书
中学推普周活动总结
2015/05/07 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书