惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
T
The Blog of Author Tim Ferriss
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
Engineering at Meta
Engineering at Meta
量子位
I
InfoQ
Jina AI
Jina AI
Microsoft Security Blog
Microsoft Security Blog
H
Help Net Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
G
Google Developers Blog
J
Java Code Geeks
Recent Announcements
Recent Announcements
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
V
V2EX
腾讯CDC
P
Proofpoint News Feed
A
About on SuperTechFans
爱范儿
爱范儿
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI

竹林里有冰的博客

Nuxt SSG 博客的尾斜杠到底怎么加? | 竹林里有冰的博客 小米 Xiaomi Book Pro 14 (Ultra X7) Linux 兼容性实测 | 竹林里有冰的博客 国内(大陆)版小米 FCM 熄屏断连:Rootless 环境下的尝试与可能的解决方案 | 竹林里有冰的博客 我没法访问 dl.google.com —— 记一次 TUN 下的网络 debug | 竹林里有冰的博客 Vercel 的缓存控制,你注意过吗? | 竹林里有冰的博客 小记 —— Caddy 在 Layer 4 上的流量代理实践 | 竹林里有冰的博客 你的域名后缀拖慢你的网站速度了嘛?——再谈 DNS 冷启动 | 竹林里有冰的博客 DNS 冷启动:小型站点的“西西弗斯之石” | 竹林里有冰的博客 HTTP/2 Server Push 已事实性“死亡”,我很怀念它 | 竹林里有冰的博客 Nuxt Content v3 中数组字段的筛选困境与性能优化 | 竹林里有冰的博客 后 OCSP 时代,浏览器如何应对证书吊销新挑战 | 竹林里有冰的博客 初试 Github Action Self-hosted Runner,想说爱你不容易 | 竹林里有冰的博客 DNS 解析延迟毁了我的图床优化 | 竹林里有冰的博客 Vue Markdown 渲染优化实战(下):告别 DOM 操作,拥抱 AST 与函数式渲染 | 竹林里有冰的博客 Vue Markdown 渲染优化实战(上):从暴力刷新、分块更新到 Morphdom 的华丽变身 | 竹林里有冰的博客 node-sass 迁移至 dart-sass 踩坑实录 | 竹林里有冰的博客 前端中的量子力学——一打开 F12 就消失的 Bug | 竹林里有冰的博客 2025 年,如何为 web 页面上展示的视频选择合适的压缩算法? | 竹林里有冰的博客 el-image 和 el-table 怎么就打架了?Stacking Context 是什么? | 竹林里有冰的博客 2025年,前端如何使用 JS 将文本复制到剪切板? | 竹林里有冰的博客 ssh 拯救世界——通过 ssh 隧道在内网服务器执行 APT 更新 | 竹林里有冰的博客 Cudy TR3000 吃鹅(daed)记 | 竹林里有冰的博客 使用 Cloudflare Workers 监控 Fedora Copr 构建状态 | 竹林里有冰的博客 基于 Cloudflare Workers 实现的在线服务状态检测告警系统 | 竹林里有冰的博客 构建部署在 Cloudflare Workers 上的 TG Bot | 竹林里有冰的博客 2024年,Firefox 是唯一还在坚持执行在线的 SSL 证书吊销状态检查的主流浏览器 | 竹林里有冰的博客 小爱课程表适配不完全指北——以 ZJUT 本科正方教务系统为例 | 竹林里有冰的博客 将博客从 waline v2 更新到 waline v3 | 竹林里有冰的博客 给家里云装上 Fedora 41 KDE 后,我是如何配置的 | 竹林里有冰的博客 为 Hexo 添加 follow 认证 | 竹林里有冰的博客
使用 Python 生成甘特图(Gantt Chart) | 竹林里有冰的博客
竹林里有冰 · 2024-04-24 · via 竹林里有冰的博客

在写操作系统的作业的时候有几道题给出了几个进程的相关信息,要求我们画出几种简单调度的甘特图。操作系统的作业一直是电子版,上传 pdf 即可的。我觉得手画甘特图拍照嵌入 pdf 中不太优雅,过于掉价,因此就想直接生成甘特图嵌入。

在谷歌搜寻了一番,我发现现在的甘特图生成网站都太现代化了,根本不是操作系统课上教的样子了。

现代化的甘特图现代化的甘特图

所幸我找到了 gao-keyong/matplotlib-gantt,虽然只有两个 star(没事,加上我就 3 stars 了),但确实能用,README 中的样例也是我期望的样子。

项目中自带了一个 jupyter 的示例,算得上是非常简单易上手的了,依赖方面只要装好 matplotlib 就可以使用,不存在依赖地狱。尽管是三年前的项目,在我本机的 Python 3.11 上仍然能够正常运行。

tuple 中的第一个数字表示从当前时间开始,第二个数字表示持续时间。每一个表示 category 的 list 中可以存在多个 tuple。

给一些咱生成的例子。


from gantt import *
category_names = ['P1', 'P2', 'P3', 'P4', 'P5']

results = {
    'FCFS': [[(0,2)], [(2,1)], [(3,8)], [(11,4)], [(15,5)]],
    'SJF': [[(1,2)], [(0,1)], [(12,8)], [(3,4)], [(7,5)]],
    'non-compreemptive priority': [[(13,2)],[(19,1)],[(0,8)],[(15,4)],[(8,5)]],
    'RR (quantum=2)': [[(0,2)], [(2,1)],[(3,2),(9,2),(15,2),(18,2)], [(5,2),(11,2)], [(7,2),(13,2),(17,1)]]
}

arrival_t = [0, 0, 0, 0]

gantt(category_names, results, arrival_t).show()


from gantt import *
category_names = ['P1', 'P2', 'P3', 'P4', 'P5', 'P6']

results = {
    '': [[(0,20)], [(25,10),(45,10),(75,5)], [(35,10),(55,5),(80,10)], [(60,15)], [(100,5),(115,5)],[(105,10)]],
}

arrival_t = [0]

gantt(category_names, results, arrival_t).show()