matplotlib绘制位置-时序甘特图

文章目录

  • 1 前言
  • 2 知识点
    • 2.1 matplotlib.pyplot.barh
    • 2.2 matplotlib.legend的handles参数
  • 3 代码实现
  • 4 绘制效果
  • 5 总结
  • 参考

1 前言

这篇文章的目的是,总结记录一次使用matplotlib绘制时序甘特图的经历。之所以要绘制这个时序甘特图,是因为22年数模研赛C题需要用到,用于更好地呈现求解的车身缓冲区调序优化结果。
首先,我们觉得在这篇博客中出现的下面这张图展示效果很好,于是也想绘制一张。

这张图中,横坐标是递增变化的时间,纵坐标是PBS中的区域编号,其中不同的颜色代表不同的车身,如果某个时间段车身达到了某个区域,那么图中所对应的矩形区块将填充为该车身对应的颜色。
在知道上述信息后,我们开始在网上查找甘特图的绘制方法,因为我个人习惯用python的matplotlib库绘制图表,于是根据关键词搜索到了如下的文章: Python实现生产过程可视化(甘特图)。看着比较像我们想要的那种效果,于是琢磨了一下代码怎么写的。

2 知识点

拜读完代码后,我总结了使用matplotlib绘制甘特图的一些知识点。

2.1 matplotlib.pyplot.barh

该函数的作用是绘制横向的柱状图。
官方文档函数定义如下:
matplotlib.pyplot.barh(y, width, height=0.8, left=None, *, align='center', data=None, **kwargs)
使用到的参数详解:

参数名称解释
y可传入float类型,决定柱状图的y轴坐标
width可传入float类型,决定柱状图的宽带(可以理解为横跨x轴的长度)
height可传入float类型,默认0.8,决定柱状图的高度(可以理解为横跨y轴的长度)
left可传入float类型,默认0,决定柱状图最左侧与y轴的距离
align可选’center’或’edge’, 默认 ‘center’,柱状图与y坐标的对齐方式,默认居中
color柱状图的颜色
edgecolor柱状图边缘的颜色
linewidth柱状图边缘的宽度,如果为0则不绘制边缘
zorderfloat类型,控制artist对象的绘制顺序,zorder越小越先绘制(有点图层的意思)

2.2 matplotlib.legend的handles参数

我也是第一次见往plt.legend函数中传入handles参数的(没有系统学过matplotlib库😭),这里也不详细解释了,直接说怎么用吧。当我们想要自定义图例时,使用下面代码:

patches = [mpatches.Patch(color = m_colors[i], label = m_labels[i]) for i in range(m)]
plt.legend(handles = patches)

其中,color参数是图例(matplotlib.patches对象)对应的颜色,label为图例对应的标签。

3 代码实现

绘制代码如下:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatchesplt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号def gantt_chart(wt, x_labels, y_labels, m_labels):"""wt: 工作矩阵,大小为mxnx2,m为车身数,n为区域编号数,第三维中第1个元素为车身进入区域的时间,第2个元素为停留时间。color_list:代表各车身的颜色矩阵,大小为nx4。"""m, n = wt.shape[0], wt.shape[1]m_colors = plt.colormaps['terrain'](np.linspace(0, 0.95, m))for i in range(n):for j in range(m):if wt[j, i, 1] != 0:plt.barh(y = i, width = wt[j, i, 1], left = wt[j, i, 0], height = 1, edgecolor = (0, 0, 0),color = m_colors[j], zorder = 10)# 图例绘制patches = [mpatches.Patch(color = m_colors[i], label = m_labels[i]) for i in range(m)]plt.legend(handles = patches, bbox_to_anchor = (1.005, 0), loc = 3, borderaxespad = 0)plt.xticks(x_labels, fontsize = 7)plt.yticks(list(range(n)), y_labels)plt.xlabel("时间/s")plt.ylabel("区域编号")plt.title('车身位置-时序甘特图')plt.grid(axis = 'x', zorder = 0)# plt.savefig('result21_车身位置-时序甘特图.jpg', dpi = 200)plt.show()def custom_gantt_chart(path = 'result21.csv', car_num = 25, T = 180):data = np.loadtxt(open(path, "rb"), delimiter = ",", encoding = 'utf-8-sig', dtype = object)[1:car_num + 1, 1:T + 1]car_label = [f'car{i}' for i in range(1, 26)]region_code = ['1', '410', '49', '48', '47', '46', '45', '44', '43', '42', '41','310', '39', '38', '37', '36', '35', '34', '33', '32', '31','210', '29', '28', '27', '26', '25', '24', '23', '22', '21', '2']car_num, T_num, region_num = data.shape[0], data.shape[1], len(region_code)T_range = [t for t in range(0, T_num + 1, 3)]Wt = np.zeros((car_num, region_num, 2))Wt[:, :, 0] = -1for i in range(car_num):for j in range(T_num):if data[i, j] == '' or data[i, j] == '3':continueidx = region_code.index(data[i, j])if Wt[i, idx, 0] == -1:Wt[i, idx, 0] = jWt[i, idx, 1] += 1gantt_chart(Wt, T_range, region_code, car_label)if __name__ == '__main__':custom_gantt_chart('result21.csv', car_num = 25, T = 200)

4 绘制效果

在这里插入图片描述

5 总结

可以从绘制效果中看到,有些柱状图的颜色两两之间不仔细看根本分不出来。对于这个问题,主要是这条代码m_colors = plt.colormaps['terrain'](np.linspace(0, 0.95, m))在色条上均匀取色时,因为色条颜色数量太少(即使是渐变色条,随着取色数量增多也不容易分辨)造成的。terrain颜色条包含的颜色如下图:

关于更多的颜色条种类及使用方法参见:https://matplotlib.org/stable/tutorials/colors/colormaps.html

参考

[1] https://zhuanlan.zhihu.com/p/106787569
[2] https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.barh.html
[3] https://matplotlib.org/stable/api/legend_api.html
[4] https://matplotlib.org/stable/tutorials/colors/colormaps.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【IDEA问题】下载不了源代码

引出问题 最近不知道怎么打开 IDEA,本想查看源代码,然后点击下载源码,总是报找不到此对象的源代码。百度找了半天,GPT问了半天还是解决不了,直到遇到了这篇:idea中无法下载源码问题解决,终于得…

取证--实操

2022年美亚杯个人赛 运用软件DB Browser for SQLite (一款用于查看SQLlite数据库文件的浏览器工具) 火眼,盘古石手机取证系统等 案件详情 于2022年10月,有市民因接获伪冒快递公司的电邮,不慎地于匪徒架设的假网站提…

网络安全 Day31-运维安全项目-容器架构下

容器架构下 6. Dockerfile6.1 Docker自动化DIY镜像之Dockerfile1) 环境准备2) 书写Dockerfile内容3) 运行Dockerfile生成镜像4) 运行容器5) 小结 6.2 案例14:Dockerfile-RUN指令1) 书写Dockerfile2) 构建镜像3) 启动容器4) 测试结果 6.3 Dockerfile指令 …

AI 绘画Stable Diffusion 研究(七) 一文读懂 Stable Diffusion 工作原理

大家好,我是风雨无阻。 本文适合人群: 想要了解AI绘图基本原理的朋友。 对Stable Diffusion AI绘图感兴趣的朋友。 本期内容: Stable Diffusion 能做什么 什么是扩散模型 扩散模型实现原理 Stable Diffusion 潜扩散模型 Stable Diffu…

【量化课程】02_4.数理统计的基本概念

2.4_数理统计的基本概念 数理统计思维导图 更多详细内容见notebook 1.基本概念 总体:研究对象的全体,它是一个随机变量,用 X X X表示。 个体:组成总体的每个基本元素。 简单随机样本:来自总体 X X X的 n n n个相互…

【leetcode】【图解】617. 合并二叉树

题目 难度:简单 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xf…

Python web实战之Django的AJAX支持详解

关键词:Web开发、Django、AJAX、前端交互、动态网页 今天和大家分享Django的AJAX支持。AJAX可实现在网页上动态加载内容、无刷新更新数据的需求。 1. AJAX简介 AJAX(Asynchronous JavaScript and XML)是一种在网页上实现异步通信的技术。通过…

一百五十四、Kettle——Linux上安装Kettle9.3(踩坑,亲测有效,附截图)

一、目的 由于kettle8.2在Linux上安装后,共享资源库创建遇到一系列问题,所以就换成kettle9.3 二、kettle版本以及安装包网盘链接 kettle9.3.0安装包网盘链接 链接:https://pan.baidu.com/s/1MS8QBhv9ukpqlVQKEMMHQA?pwddqm0 提取码&…

解决电脑声音正常但就是某些游戏没声音问题

电脑声音正常,玩普遍游戏也正常,就有游戏不出声音 详细介绍经过,不喜欢的请直接跳 第三部分。 一、先说下起因现象。 1 大富翁11 没声音。 前段时间无聊怀旧就买了个大富翁11玩玩,近二十年前的老台式机正常无问题。后来想在性能…

Java多线程编程:实现并发处理的高效利器

Java多线程编程:实现并发处理的高效利器 作者:Stevedash 发表于:2023年8月13日 20点45分 来源:Java 多线程编程 | 菜鸟教程 (runoob.com) ​ 在计算机领域,多线程编程是一项重要的技术,可以使程序同时执…

从小白到大神之路之学习运维第79天-------Kubernetes网络组件详解

第四阶段 时 间:2023年8月14日 参加人:全班人员 内 容: Kubernetes网络组件详解 目录 一、Kubernetes网络组件 (一)Flannel网络组件 (二)Calico 网络插件 (1)…

设计模式——建造者(Builder)模式

建造者模式(Builder Pattern),又叫生成器模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。建造者模式是一步一步创建一个复杂的对象,…

在单元测试中使用Jest模拟VS Code extension API

对VS Code extension进行单元测试时通常会遇到一个问题,代码中所使用的VS Code编辑器的功能都依赖于vscode库,但是我们在单元测试中并没有添加对vscode库的依赖,所以导致运行单元测试时出错。由于vscode库是作为第三方依赖被引入到我们的VS C…

[oneAPI] BERT

[oneAPI] BERT BERT训练过程Masked Language Model(MLM)Next Sentence Prediction(NSP)微调 总结基于oneAPI代码 比赛:https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517 Intel DevCloud for oneAPI&…

React源码解析18(4)------ completeWork的工作流程【mount】

摘要 经过上一章,我们得到的FilberNode已经具有了child和return属性。一颗Filber树的结构已经展现出来了。 那我们最终是想在页面渲染真实的DOM。所以我们现在要在completeWork里,构建出一颗离屏的DOM树。 之前在说FilberNode的属性时,我们…

zabbix案例--zabbix监控Tomcat

目录 一、 部署tomcat 二、配置zabbix-java-gateway 三、配置zabbix-server 四、配置zabbix-web界面 一、 部署tomcat tar xf apache-tomcat-8.5.16.tar.gz -C /usr/local/ ln -sv /usr/local/apache-tomcat-8.5.16/ /usr/local/tomcat cd /usr/local/tomcat/bin开启JMX…

Vscode 常用操作教程

一、语言换成中文 这是我们可以直接点击左边栏第四个图标搜索插件 chinese ,也可以直接ctrlshiftp快捷键也会出来如图所示图标,出来chinese 插件之后选择安装install,安装完成之后重新ctrlshiftp会出现如图所示页面 找到我的鼠标在的地方对应的中文,此时…

win10下如何安装ffmpeg

安装ffmpeg之前先安装win10 绿色软件管理软件:scoop. Scoop的基本介绍 Scoop是一款适用于Windows平台的命令行软件(包)管理工具,这里是Github介绍页。简单来说,就是可以通过命令行工具(PowerShell、CMD等…

VVIC-商品详情

一、接口参数说明: item_get-根据ID取商品详情,点击更多API调试,请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/vvic/item_get 名称类型必须描述keyString是调用key(点击获取测试k…

【MongoDB】索引

目录 一、概述 二、索引的类型 1、单字段索引 2、复合索引 3、其他索引 三、索引的管理 1、索引的创建 2、索引的查看 3、索引的删除 四、索引的使用 1、执行计划 2、涵盖的查询 一、概述 索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须…