matplotlib绘制甘特图的万能模板案例

作者:王小王-123 时间:2022-07-11 20:24:08 

定义一个绘制甘特图的类

# -*- 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()

类似于展示的图形

matplotlib绘制甘特图的万能模板案例

来源:https://wxw-123.blog.csdn.net/article/details/124063816

标签:matplotlib,甘特图
0
投稿

猜你喜欢

  • 举例讲解Python面向对象编程中类的继承

    2022-02-09 02:59:14
  • SQL语句练习实例之五 WMS系统中的关于LIFO或FIFO的问题分析

    2011-11-03 16:59:59
  • Asp DatePart 函数的语法详解(用于计算日期并返回指定的时间间隔)

    2012-12-04 20:04:29
  • python实现隐马尔科夫模型HMM

    2023-05-05 13:33:57
  • 12个步骤教你理解Python装饰器

    2021-01-25 18:28:56
  • 收藏整理的一些Python常用方法和技巧

    2023-01-04 10:42:38
  • python+opencv实现阈值分割

    2023-05-19 11:23:50
  • SqlServer将查询结果转换为XML和JSON

    2024-01-18 20:25:59
  • Golang 单元测试和基准测试实例详解

    2024-05-05 09:27:58
  • python实现最速下降法

    2023-08-10 18:19:51
  • python中统计相同字符的个数方法实例

    2021-04-21 00:28:58
  • Python创建文件夹与文件的快捷方法

    2022-08-31 19:50:49
  • Python OpenCV读取png图像转成jpg图像存储的方法

    2023-01-07 13:23:56
  • 在Django的视图(View)外使用Session的方法

    2023-06-24 02:28:32
  • 记一次python 内存泄漏问题及解决过程

    2021-06-18 17:28:14
  • MySQL之xtrabackup备份恢复的实现

    2024-01-15 06:59:08
  • 小学生也能看懂的Golang异常处理recover panic

    2024-02-08 20:32:36
  • Python计算开方、立方、圆周率,精确到小数点后任意位的方法

    2023-05-21 21:01:52
  • MySQL启用SSD存储的实例详解

    2024-01-26 02:14:07
  • 使用python脚本自动创建pip.ini配置文件代码实例

    2022-03-03 15:05:58
  • asp之家 网络编程 m.aspxhome.com