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 相关文章推荐
Django实现简单分页功能的方法详解
Dec 05 Python
python线程池threadpool使用篇
Apr 27 Python
python监控文件并且发送告警邮件
Jun 21 Python
Python将主机名转换为IP地址的方法
Aug 14 Python
Python 依赖库太多了该如何管理
Nov 08 Python
python中的RSA加密与解密实例解析
Nov 18 Python
python 实现简单的FTP程序
Dec 27 Python
通过实例了解Python str()和repr()的区别
Jan 17 Python
python 使用递归的方式实现语义图片分割功能
Jul 16 Python
python os.rename实例用法详解
Dec 06 Python
解决Pycharm 运行后没有输出的问题
Feb 05 Python
Python3使用Selenium获取session和token方法详解
Feb 16 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
You might like
php发送html格式文本邮件的方法
2015/06/10 PHP
PHP面向对象程序设计之对象生成方法详解
2016/12/02 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
2018/10/31 PHP
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
解决vue里碰到 $refs 的问题的方法
2017/07/13 Javascript
基于vue实现分页效果
2017/11/06 Javascript
Node.js Express安装与使用教程
2018/05/11 Javascript
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
[46:20]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第二场 1月22日
2021/03/11 DOTA
Python_LDA实现方法详解
2017/10/25 Python
Python numpy生成矩阵、串联矩阵代码分享
2017/12/04 Python
Python中defaultdict与lambda表达式用法实例小结
2018/04/09 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
Python提取频域特征知识点浅析
2019/03/04 Python
python将字符串list写入excel和txt的实例
2019/07/20 Python
在linux系统下安装python librtmp包的实现方法
2019/07/22 Python
Python实现直播推流效果
2019/11/26 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
Python列表推导式实现代码实例
2020/09/09 Python
深入解析HTML5使用SVG图像时的viewBox属性用法
2015/09/02 HTML / CSS
在C中是否有模拟继承等面向对象程序设计特性的好方法
2012/05/22 面试题
2019入党申请书格式
2019/06/25 职场文书
python可视化之颜色映射详解
2021/09/15 Python