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将图片批量从png格式转换至WebP格式
Aug 22 Python
利用python实现简单的邮件发送客户端示例
Dec 23 Python
tensorflow 使用flags定义命令行参数的方法
Apr 23 Python
Python requests库用法实例详解
Aug 14 Python
Python如何获得百度统计API的数据并发送邮件示例代码
Jan 27 Python
详解用python写一个抽奖程序
May 10 Python
使用matplotlib绘制图例标签中带有公式的图
Dec 13 Python
tensorflow没有output结点,存储成pb文件的例子
Jan 04 Python
如何实现更换Jupyter Notebook内核Python版本
May 18 Python
pycharm设置默认的UTF-8编码模式的方法详解
Jun 01 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
Jun 28 Python
Python中qutip用法示例详解
Oct 02 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
You might like
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
javascript Prototype 对象扩展
2009/05/15 Javascript
学习ExtJS Panel常用方法
2009/10/07 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
Nodejs进程管理模块forever详解
2014/06/01 NodeJs
js实现图片点击左右轮播
2015/07/08 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
mvc 、bootstrap 结合分布式图简单实现分页
2016/10/10 Javascript
JS实现含有中文字符串的友好截取功能分析
2017/03/13 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
[35:55]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.11
2020/12/13 DOTA
python内存管理分析
2015/04/08 Python
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
css3给背景图片加颜色遮罩的方法
2019/11/05 HTML / CSS
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
英国运动风奢侈品购物网站:Maison De Fashion
2020/08/28 全球购物
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
C#可否对内存进行直接的操作
2015/02/26 面试题
年终自我鉴定
2013/10/09 职场文书
国际政治个人自荐信范文
2013/11/26 职场文书
国窖1573广告词
2014/03/21 职场文书
医疗纠纷协议书
2014/04/16 职场文书
珍爱生命演讲稿
2014/05/10 职场文书
文艺晚会策划方案
2014/06/11 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书
Java字符串逆序方法详情
2022/03/21 Java/Android