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实现连接mongodb的方法
May 08 Python
python实现图片变亮或者变暗的方法
Jun 01 Python
Python使用Redis实现作业调度系统(超简单)
Mar 22 Python
python3 对list中每个元素进行处理的方法
Jun 29 Python
Python使用matplotlib 画矩形的三种方式分析
Oct 31 Python
Python文字截图识别OCR工具实例解析
Mar 05 Python
Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
Mar 14 Python
TensorFlow实现批量归一化操作的示例
Apr 22 Python
Python调用.net动态库实现过程解析
Jun 05 Python
如何利用python之wxpy模块玩转微信
Aug 17 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
Nov 19 Python
Python3爬虫ChromeDriver的安装实例
Feb 06 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
You might like
PHP计算2点经纬度之间的距离代码
2013/08/12 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
phpStorm2020 注册码
2020/09/17 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
手把手教你自己写一个js表单验证框架的方法
2010/09/14 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
javascript查找字符串中出现最多的字符和次数的小例子
2013/10/29 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
ant design 日期格式化的实现
2020/10/27 Javascript
Python 编码处理-str与Unicode的区别
2016/09/06 Python
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
2019/07/22 Python
python在不同条件下的输入与输出
2020/02/13 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
浅谈keras 模型用于预测时的注意事项
2020/06/27 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
M.M.LaFleur官网:美国职业女装品牌
2020/10/27 全球购物
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
会计专业毕业生推荐信
2013/11/05 职场文书
资产经营总监岗位职责范文
2013/12/01 职场文书
好军嫂事迹材料
2014/01/15 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
2014乡镇班子个人对照检查材料思想汇报
2014/09/26 职场文书
土地租赁协议书
2015/01/29 职场文书
事业单位个人总结
2015/02/12 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书