網站首頁 編程語言 正文
定義一個繪制甘特圖的類
# -*- 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
相關推薦
- 2022-09-06 C語言模擬實現strstr函數的示例代碼_C 語言
- 2023-11-13 matplotlib圖例(legend)如何自由設置其位置、大小以及樣式
- 2022-06-14 python讀取查看npz/npy文件數據以及數據完全顯示方法實例_python
- 2022-11-27 C++常見的stl容器與相關操作?示例解析_C 語言
- 2022-12-15 Android入門之Toast的使用教程_Android
- 2022-03-29 深入了解Python并發編程_python
- 2022-10-11 ArrayList源碼中的MAX_ARRAY_SIZE
- 2022-12-09 python返回多個值與賦值多個值的示例代碼_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支