matplotlib绘制甘特图的万能模板案例
作者:王小王-123 发布时间:2022-07-11 20:24:08
标签:matplotlib,甘特图
定义一个绘制甘特图的类
# -*- 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()
类似于展示的图形
来源:https://wxw-123.blog.csdn.net/article/details/124063816


猜你喜欢
- 本文研究的主要内容是Python中装饰器相关学习总结,具体如下。装饰器(decorator)功能引入日志函数执行时间统计执行函数前预备处理执
- 1.命令介绍最近学习并使用了一个python的内置函数dir,首先help一下:>>> help(dir)Help on
- 1 硬件设备TTL串口摄像头(VC0706)USB转TTL烧录器2 serial安装第一次安装的是serial的包导包的时候发现下载错了,正
- 本文实例讲述了Python实现FTP上传文件或文件夹实例。分享给大家供大家参考。具体如下:import sys import os impo
- 1. 案例【三酷猫列表记账】操作需求:(1)用列表对象记录三酷猫每天钓鱼的种类和数量(2)统计三酷猫所钓水产品的总数量和预计收获金额(3)打
- 为了实现项目中的搜索功能,我们使用的是全文检索框架haystack+搜索引擎whoosh+中文分词包jieba安装和配置安装所需包pip i
- 有时候,依赖 vue 响应方式来更新数据是不够的,相反,我们需要手动重新渲染组件来更新数据。或者,我们可能只想抛开当前的
- --用SQL多条可以将多条数据组成一棵XML树L一次插入 --将XML树作为varchar参数传入用 --insert xx select
- 名称:YUI Compressor最新版本:2.4.2用途:js/css压缩必备指数:使用难度:(YUI Compressor非常易用,只是
- 初识OpenCVOpenCV是一个开源的,跨平台的计算机视觉库,它采用优化的C/C++代码编写,能够充分利用多核处理器的优势,提供了Pyth
- 出现这样的问题是当你浏览UTF-8编码的时候,服务器默认用UTF-8的引擎来输出html,当你用再浏览GB2312的页面时,它还是用UTF-
- 在写cmu14-445的project时,我希望在本地vscode编辑代码,然后在docker中编译和测试代码。但是如果测试出了问题,直接在
- 看下面的例子就明白了class Test(object): def __init__(self, value='hell
- 目录一、目标二、环境准备1、基本信息2、数据库环境准备3、建库 & 导入分表三、配置&实践1、pom文件 &nbs
- 这是借鉴了一位兄弟的代码,然后进行修改的,原来代码存在问题,用了2小时,自己修改,终于画出了滑稽脸,也算是对于今天学的turtle绘画库的一
- 阅读上一篇:FrontPage XP设计教程1——站点初建与管理接下来的工作就是读者朋友们最为关心的网页的制作和编辑了。我们知道,一个站点是
- 最近在写博客,刚好写到用户注册注销模块,觉得这一方面还是挺有趣的。当尝试掀开 Django 的源代码时一切 API 就不会变得那么摸不着。顺
- 在各类的前端开发工具里,在功能上虽然Editplus显得有些“单薄”,但是仍然是很多我辈做开发的人们离不开的工具,因为他小巧,语言高亮,支持
- 最近用Python写了个 * ,需要部署到Linux环境的服务器上,由于之前本地开发时使用virtualenv,使用这个虚拟环境有个好处是项目
- 作为一名优秀的接口调用工程师,对接口的返回信息进行校验是必不可少的。校验需要保证所返回的数据格式和内容正确,以此确保页面的正确展示和用户体验