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 相关文章推荐
Win7上搭建Cocos2d-x 3.1.1开发环境
Jul 03 Python
Python中还原JavaScript的escape函数编码后字符串的方法
Aug 22 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
Apr 18 Python
Python+OpenCV人脸检测原理及示例详解
Oct 19 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
Python面向对象基础入门之设置对象属性
Dec 11 Python
对python中的six.moves模块的下载函数urlretrieve详解
Dec 19 Python
Python django框架应用中实现获取访问者ip地址示例
May 17 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
python 读取更新中的log 或其它文本方式
Dec 24 Python
使用keras根据层名称来初始化网络
May 21 Python
Python如何向SQLServer存储二进制图片
Jun 08 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
You might like
php microtime获取浮点的时间戳
2010/02/21 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
详解Vue生命周期的示例
2017/03/10 Javascript
集合Bootstrap自定义confirm提示效果
2017/09/19 Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
2017/12/29 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
vue-cli初始化项目中使用less的方法
2018/08/09 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
Vue.js更改调试地址端口号的实例
2018/09/19 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
2019/11/01 Javascript
微信小程序实现抖音播放效果的实例代码
2020/04/11 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
在服务器端实现无间断部署Python应用的教程
2015/04/16 Python
在Python中操作字典之update()方法的使用
2015/05/22 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
Python GUI库PyQt5样式QSS子控件介绍
2020/02/25 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
美国在线乐器和设备商店:Musician’s Friend
2018/07/06 全球购物
英国在线滑雪板和冲浪商店:The Board Basement
2020/01/11 全球购物
学期自我鉴定
2013/11/04 职场文书
教师实习自我鉴定
2013/12/14 职场文书
绿色环保演讲稿
2014/05/10 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
党务工作者主要事迹材料
2015/11/03 职场文书
青少年法制教育心得体会
2016/01/14 职场文书