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

举报
王小王-123 发表于 2022/04/14 03:02:26 2022/04/14
【摘要】 定义一个绘制甘特图的类 # -*- coding: utf-8 -*- from datetime import datetimeimport sysimport numpy as npimport matplotlib.pyplot as pltimport matplotlib.font_manager as font_manag...

定义一个绘制甘特图的类


  
  1. # -*- coding: utf-8 -*-
  2. from datetime import datetime
  3. import sys
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. import matplotlib.font_manager as font_manager
  7. import matplotlib.dates as mdates
  8. import logging
  9. from pylab import *
  10. mpl.rcParams['font.sans-serif'] = ['SimHei']
  11. class Gantt(object):
  12. #颜色色标:参考http://colorbrewer2.org/
  13. RdYlGr = ['#d73027', '#f46d43', '#fdae61','#fee08b', '#ffffbf', '#d9ef8b','#a6d96a', '#66bd63', '#1a9850']
  14. POS_START = 1.0
  15. POS_STEP = 0.5
  16. def __init__(self, tasks):
  17. self._fig = plt.figure(figsize=(15,10))
  18. self._ax = self._fig.add_axes([0.1, 0.1, .75, .5])
  19. self.tasks = tasks[::-1] # 倒序
  20. def _format_date(self, date_string):
  21. try:
  22. date = datetime.datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S') # 将日期字符串转换成datetime类型
  23. except ValueError as err:
  24. logging.error("String '{0}' can not be converted to datetime object: {1}"
  25. .format(date_string, err))
  26. sys.exit(-1)
  27. mpl_date = mdates.date2num(date) # 得到日期类型的时间戳
  28. return mpl_date
  29. def _plot_bars(self):
  30. i = 0
  31. for task in self.tasks:
  32. start = self._format_date(task['start']) # 获取任务开始时间的时间戳
  33. end = self._format_date(task['end']) # 获取任务结束时间的时间戳
  34. bottom = (i * Gantt.POS_STEP) + Gantt.POS_START
  35. width = end - start # 柱子的宽度
  36. self._ax.barh(bottom, width, left=start, height=0.3,align='center', label=task['label'],color = Gantt.RdYlGr[i%len(Gantt.RdYlGr)])
  37. i += 1
  38. def _configure_yaxis(self):
  39. task_labels = [t['label'] for t in self.tasks] # 所有的刻度文本标签
  40. pos = self._positions(len(task_labels)) # 素有的刻度值
  41. ylocs = self._ax.set_yticks(pos) # 设置y轴刻度线
  42. ylabels = self._ax.set_yticklabels(task_labels) # 设置y轴刻度标签
  43. plt.setp(ylabels, size='medium') # 设置y轴刻度标签属性(中号字)
  44. def _configure_xaxis(self):
  45. self._ax.xaxis_date() # 使用时间轴
  46. rule = mdates.rrulewrapper(mdates.WEEKLY, interval=1) # 生成时间生成器(每周1个值,从周日开始)
  47. loc = mdates.RRuleLocator(rule) # 生成时间刻度
  48. formatter = mdates.DateFormatter("%m/%d") # 生成时间格式
  49. self._ax.xaxis.set_major_locator(loc) # 设置主刻度
  50. self._ax.xaxis.set_major_formatter(formatter) # 设置主刻度标签格式
  51. xlabels = self._ax.get_xticklabels() # 获取刻度标签对象
  52. plt.setp(xlabels, rotation=70, fontsize=10) # 设置刻度标签对象的属性(30度旋转,字体大小10)
  53. def _configure_figure(self):
  54. self._configure_xaxis()
  55. self._configure_yaxis()
  56. self._ax.grid(True, axis='x',color='gray')
  57. self._set_legend()
  58. self._fig.autofmt_xdate()
  59. def _set_legend(self):
  60. font = font_manager.FontProperties(size='small')
  61. self._ax.legend(loc='upper right', prop=font)
  62. def _positions(self, count):
  63. end = count * Gantt.POS_STEP + Gantt.POS_START
  64. pos = np.arange(Gantt.POS_START, end, Gantt.POS_STEP)
  65. return pos
  66. def show(self):
  67. self._plot_bars()
  68. self._configure_figure()
  69. plt.show()

调用及数据格式


  
  1. if __name__ == '__main__':
  2. TEST_DATA = (
  3. { 'label': '项目调研', 'start':'2019-02-01 12:00:00', 'end': '2019-03-15 18:00:00'},
  4. { 'label': '项目准备', 'start':'2019-02-15 09:00:00', 'end': '2019-04-09 12:00:00'},
  5. { 'label': '制定方案', 'start':'2019-04-10 12:00:00', 'end': '2019-05-30 18:00:00'},
  6. { 'label': '项目实施', 'start':'2019-05-01 09:00:00', 'end': '2019-08-31 13:00:00'},
  7. { 'label': '项目培训', 'start':'2019-07-01 09:00:00', 'end': '2019-09-21 13:00:00'},
  8. { 'label': '项目验收', 'start':'2019-09-22 09:00:00', 'end': '2019-10-22 13:00:00'},
  9. { 'label': '项目竣工', 'start':'2019-10-23 09:00:00', 'end': '2019-11-23 13:00:00'},
  10. )
  11. gantt = Gantt(TEST_DATA)
  12. plt.xlabel('项目日期')
  13. plt.ylabel('项目进度')
  14. plt.title('项目进度甘特图')
  15. plt.figure(figsize=(10,10),dpi=150)
  16. gantt.show()

类似于展示的图形

 每文一语

挂掉了服务器

文章来源: wxw-123.blog.csdn.net,作者:王小王-123,版权归原作者所有,如需转载,请联系作者。

原文链接:wxw-123.blog.csdn.net/article/details/124063816

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。