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文件读取的3种方法及路径转义
Jun 21 Python
sublime text 3配置使用python操作方法
Jun 11 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
Python基于plotly模块实现的画图操作示例
Jan 23 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
了解不常见但是实用的Python技巧
May 23 Python
django实现后台显示媒体文件
Apr 07 Python
Python流程控制语句的深入讲解
Jun 15 Python
Python3 requests模块如何模仿浏览器及代理
Jun 15 Python
python类共享变量操作
Sep 03 Python
python中的unittest框架实例详解
Feb 05 Python
python实现股票历史数据可视化分析案例
Jun 10 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
You might like
PHP游戏编程25个脚本代码
2011/02/08 PHP
php日期操作技巧小结
2016/06/25 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
2012/03/15 Javascript
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
JavaScript中提前声明变量或函数例子
2014/11/12 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
Spring Boot/VUE中路由传递参数的实现代码
2018/03/02 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
2020/02/28 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
Python入门学习指南分享
2018/04/11 Python
解决python 输出是省略号的问题
2018/04/19 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
Jupyter notebook如何修改平台字体
2020/05/13 Python
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
C语言50道问题
2014/10/23 面试题
写好自荐信的技巧
2013/11/08 职场文书
揠苗助长教学反思
2014/02/04 职场文书
法定代表人资格证明书
2014/09/11 职场文书
共青团员自我评价范文
2014/09/14 职场文书
论文致谢词范文
2015/05/14 职场文书
校运会广播稿
2015/08/19 职场文书
2016年五一促销广告语
2016/01/28 职场文书