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配置文件解析模块ConfigParser使用实例
Apr 13 Python
详解python中的json的基本使用方法
Dec 21 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
May 08 Python
python3.7.0的安装步骤
Aug 27 Python
python将控制台输出保存至文件的方法
Jan 07 Python
Python3.7 dataclass使用指南小结
Feb 22 Python
Pycharm远程调试原理及具体配置详解
Aug 08 Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
May 25 Python
Python HTMLTestRunner如何下载生成报告
Sep 04 Python
如何用Python进行时间序列分解和预测
Mar 01 Python
python基础详解之if循环语句
Apr 24 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
You might like
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
解析PHP中的正则表达式以及模式匹配
2013/06/19 PHP
用js实现上传图片前的预览(TX的面试题)
2007/08/14 Javascript
jquery attr 设定src中含有&(宏)符号问题的解决方法
2011/07/26 Javascript
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
2015/03/27 Javascript
javascript实现拖动元素交换位置
2015/11/29 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
JavaScript常用本地对象小结
2016/03/28 Javascript
js实现日历的简单算法
2017/01/24 Javascript
原生JS实现垂直手风琴效果
2017/02/19 Javascript
vue组件间通信解析
2017/03/01 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
jquery学习笔记之无new构建详解
2017/12/07 jQuery
javascript使用substring实现的展开与收缩文字功能示例
2019/06/17 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
详解使用mocha对webpack打包的项目进行"冒烟测试"的大致流程
2020/04/27 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
python类继承用法实例分析
2015/05/27 Python
Python装饰器用法示例小结
2018/02/11 Python
django模板加载静态文件的方法步骤
2019/03/01 Python
python matplotlib 绘图 和 dpi对应关系详解
2020/03/14 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
几款好用的python工具库(小结)
2020/10/20 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
高档奢华时装在线目的地:FORWARD by elyse walker
2017/10/16 全球购物
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
竞聘演讲稿范文
2014/01/12 职场文书
简易版租房协议书范本
2014/10/13 职场文书
共青团员自我评价
2015/03/10 职场文书
七年级思品教学反思
2016/02/20 职场文书
合作合同协议书
2016/03/21 职场文书
解决python绘图使用subplots出现标题重叠的问题
2021/04/30 Python
Python实现学生管理系统(面向对象版)
2021/06/24 Python