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类参数self使用示例
Feb 17 Python
python操作日期和时间的方法
Mar 11 Python
python3设计模式之简单工厂模式
Oct 17 Python
Python设计模式之代理模式简单示例
Jan 09 Python
python 美化输出信息的实例
Oct 15 Python
python实现汽车管理系统
Nov 30 Python
Python这样操作能存储100多万行的xlsx文件
Apr 16 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
Pytest框架之fixture的详细使用教程
Apr 07 Python
基于Python的Jenkins的二次开发操作
May 12 Python
Python读取yaml文件的详细教程
Jul 21 Python
python opencv通过4坐标剪裁图片
Jun 05 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
You might like
PHP程序员编程注意事项
2008/04/10 PHP
php 错误处理经验分享
2011/10/11 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
Thinkphp实现MySQL读写分离操作示例
2014/06/25 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
Laravel推荐使用的十个辅助函数
2019/05/10 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
Javascript实现简单二级下拉菜单实例
2014/06/15 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
Jquery搜索父元素操作方法
2015/02/10 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
Python导入模块时遇到的错误分析
2017/08/30 Python
python中的turtle库函数简单使用教程
2018/07/23 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
python远程邮件控制电脑升级版
2019/05/23 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
2019/06/18 Python
Django stark组件使用及原理详解
2019/08/22 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
Python笔记之facade模式
2019/11/20 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
python实现图片素描效果
2020/09/26 Python
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
教师自我鉴定范文
2013/11/10 职场文书
个人优缺点自我评价
2014/01/27 职场文书
安全生产演讲稿
2014/05/09 职场文书
2014年教师节活动总结
2014/08/29 职场文书
教师节感谢信
2015/01/22 职场文书
2015入党个人自传范文
2015/06/26 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
MySQL开启事务的方式
2021/06/26 MySQL
Python各协议下socket黏包问题原理
2022/04/12 Python
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python
在虚拟机中安装windows server 2008的图文教程
2022/06/28 Servers