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.pswp.cn/news/36850.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36850.shtml
英文地址,請注明出處:http://en.pswp.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指令 …

騰訊面試題算法還原【游戲安全】

本題的參考鏈接:https://share.weiyun.com/5Xg2b7v 其實拿到這個題我就感覺在哪里看過,后來想想是在旺仔那里看到的,以下是旺仔寫的分析過程可以參考一下https://bbs.kanxue.com/thread-276536.htm 但是這個題要比旺仔拿到的那個要增加些許…

Flowable 6.8.0中主要數據表及其字段

在Flowable 6.8.0中,以下是每個表的作用并列出每張表的所有字段及其含義: act_evt_log (用于記錄流程引擎事件的日志) log_nr:日志編號type:事件類型proc_def_id:流程定義IDproc_inst_id:流程實例IDexecuti…

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個相互…

資料分析(二)—— 速算技巧 - 高照

常用方法 A * 1.5 A A的一半 120*1.5 120 60 A * 1.1 A 錯位相加 123*1.1 12312.3 A * 0.9 A 錯位相減 123*0.9 123-12.3 A/5 A * 2 ,小數點左移一位 24/5 4.8 A/25 A * 4 ,小數點左移兩位 24/25 0.96 A/125 A * 8 ,小數點左移…

mtl文件解釋

.mtl文件是一種文本文件,通常用于與三維模型文件(如.obj文件)一起描述三維模型的材質(Material)屬性和外觀。這些屬性包括顏色、紋理、光照等信息,以便在渲染或展示三維模型時能夠正確地呈現出模型的外觀效…

【leetcode】【圖解】617. 合并二叉樹

題目 難度:簡單 給你兩棵二叉樹: root1 和 root2 。 想象一下,當你將其中一棵覆蓋到另一棵之上時,兩棵樹上的一些節點將會重疊(而另一些不會)。你需要將這兩棵樹合并成一棵新二叉樹。合并的規則是&#xf…

Python web實戰之Django的AJAX支持詳解

關鍵詞:Web開發、Django、AJAX、前端交互、動態網頁 今天和大家分享Django的AJAX支持。AJAX可實現在網頁上動態加載內容、無刷新更新數據的需求。 1. AJAX簡介 AJAX(Asynchronous JavaScript and XML)是一種在網頁上實現異步通信的技術。通過…

electron 使用node C++插件 node-gyp

node C插件使用,在我們常規使用中,需要使用node-gyp指定對飲的node版本即可 在electron的使用中,我們需要指定的是electron版本要不然會報錯使用的v8內核版本不一致導致C擴展無法正常引入 electron官方文檔-node原生模塊 package.json {&quo…

標準的rust后端項目的結構是怎樣的呢?

一個標準的Rust后端項目通常遵循一種常見的項目結構,以下是一個示例: . ├── Cargo.toml ├── src │ ├── main.rs │ ├── lib.rs │ ├── handlers │ │ ├── mod.rs │ │ └── user_handler.rs │ ├── models │…

一百五十四、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) ? 在計算機領域,多線程編程是一項重要的技術,可以使程序同時執…

InnoDB文件物理結構解析6 - FIL_PAGE_INDEX

本文討論Secondary Key Page的解析,也就是表非主鍵索引的記錄存儲。與Clustered Key Page有相同的基本記錄結構,也細分為Leaf Page和Non-Leaf Page,我們先看結構: ### Contents (Secondary Key - Leaf Page) ### ---------------…

從小白到大神之路之學習運維第79天-------Kubernetes網絡組件詳解

第四階段 時 間:2023年8月14日 參加人:全班人員 內 容: Kubernetes網絡組件詳解 目錄 一、Kubernetes網絡組件 (一)Flannel網絡組件 (二)Calico 網絡插件 (1)…

設計模式——建造者(Builder)模式

建造者模式(Builder Pattern),又叫生成器模式,是一種對象構建模式 它可以將復雜對象的建造過程抽象出來,使這個抽象過程的不同實現方法可以構造出不同表現的對象。建造者模式是一步一步創建一個復雜的對象,…

(14)嵌套列表,Xpath路徑表達式,XML增刪查改,Implicit,Operator,Xml序列化,淺拷貝與深拷貝

一、作業問題 1、問:listbox1.items[i]返回的object是指的字符串嗎? 答:items是真正的對象集合,在Add時加的是Person對象p,則里面的item就是Person對象p。 但是,在listbox1顯…