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使用pyhook监控键盘并实现切换歌曲的功能
Jul 18 Python
python中PIL安装简单教程
Apr 21 Python
python3.0 模拟用户登录,三次错误锁定的实例
Nov 02 Python
python使用tensorflow保存、加载和使用模型的方法
Jan 31 Python
用python写一个定时提醒程序的实现代码
Jul 22 Python
python 实现一个反向单位矩阵示例
Nov 29 Python
python模拟点击网页按钮实现方法
Feb 25 Python
Python如何存储数据到json文件
Mar 09 Python
详解PyQt5信号与槽的几种高级玩法
Mar 24 Python
keras训练浅层卷积网络并保存和加载模型实例
Jul 02 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
Aug 27 Python
5 分钟读懂Python 中的 Hook 钩子函数
Dec 09 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
You might like
PHP安全技术之 实现php基本安全
2010/09/04 PHP
php 对输入信息的进行安全过滤的函数代码
2012/06/29 PHP
浅谈php中mysql与mysqli的区别分析
2013/06/10 PHP
php支付宝系列之电脑网站支付
2018/05/30 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
Vue Promise的axios请求封装详解
2018/08/13 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
2019/03/19 Javascript
解决Nuxt使用axios跨域问题
2020/07/06 Javascript
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
python中元类用法实例
2014/10/10 Python
Python3实现从文件中读取指定行的方法
2015/05/22 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
2019/04/04 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
意大利婴儿产品网上商店:Mukako
2018/10/14 全球购物
考博自荐信
2013/10/25 职场文书
企业后勤岗位职责
2014/02/28 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
上课说话检讨书500字
2014/11/01 职场文书
教师个人学习总结
2015/02/11 职场文书
运动会开幕式主持词
2015/07/01 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
高三物理教学反思
2016/02/20 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL