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()类似于展示的图形
到此这篇关于matplotlib绘制甘特图的万能模板案例的文章就介绍到这了,更多相关matplotlib 甘特图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?

