《Python Qt GUI與數據可視化編程》第14章 Matplotlib數據可視化

第14章 Matplotlib數據可視化

Matplotlib是Python中做數據繪圖最常用的一個包,它提供了二維和三維繪圖功能,能繪製曲線、直方圖、柱狀圖、餅圖、僞色圖、等高線圖、極座標圖、三維曲面、三維等高線等各種圖,具有豐富的繪圖定製功能,能在圖中使用LaTeX標記輸出數學符號和公式,生成具有出版品質的圖。

Matplotlib最初是仿照MATLAB的繪圖功能開發的,matplotlib.pyplot模塊提供了類似於MATLAB的指令式繪圖功能,一般介紹Matplotlib繪圖功能的書也以介紹這種指令式繪圖爲主。但是這種方式適合於腳本化的程序中進行數據可視化,不適合於在GUI應用程序中繪圖。實際上Matplotlib是完全採用面向對象的方式設計的,圖的各個組成元素都有相應的類,通過類的接口可以完全控制Matplotlib的繪圖功能,適合於在GUI應用程序中嵌入數據可視化功能。

本章主要介紹Matplotlib的面向對象的繪圖功能,介紹Matplotlib繪圖涉及的各個主要類的使用,特別是在GUI應用程序中的使用。

14.1 Matplotlib的基本用法

 

14.2 圖的主要元素的面向對象操作

要對一個圖(Figure)的各個組成元素進行編程操作,首先要搞清楚圖的組成元素的名稱及其對應的類,然後纔可以使用類的屬性和接口函數進行操作。

Matplotlib官方例子程序anatomy.py繪製的一個圖完整地演示了一個圖的各個組成元素,圖14-3是anatomy.py運行時顯示的圖,實例Demo14_1目錄下有這個文件,讀者也可以從Matplotlib官網下載此程序的最新版本運行,並解讀其中的代碼。

圖14-3 Matplotlib官方例子程序anatomy.py繪製的圖

本節通過實例程序Demo14_2演示和介紹Matplotlib繪圖的主要對象的操作方法。實例Demo14_2是基於模板mainWindowApp的項目,只有一個主窗口,程序運行時的界面如圖14-4所示。

圖14-4 示例Demo14_2運行時界面

14.3 交互操作

使用Matplotlib繪圖還可以進行一些交互操作,最簡單的就是使用與FigureCanvas類對象關聯的NavigationToolbar類工具欄對圖表進行交互操作。此外,還可以使用FigureCanvas類提供的事件處理功能對鼠標和鍵盤事件進行響應,從而實現一些交互操作。

圖14-9  示例Demo14_3運行時界面

實例Demo14_3演示Matplotlib繪圖的一些交互功能的實現,程序運行時界面如圖14-9所示。這個程序實現瞭如下的一些功能:

  • 對NavigationToolbar工具欄對象做了一些改造,使其顯示中文標題和提示信息,並且在工具欄上插入了幾個由自定義Actions創建的工具欄按鈕。
  • 當鼠標在子圖上移動時,在狀態欄裏顯示鼠標光標處的座標數值。
  • 當鼠標移動到一個子圖上時,設置顯示綠色背景顏色,鼠標離開子圖時背景顏色恢復爲白色,其功能類似於PyQt5中的hover()事件。
  • 鼠標在曲線序列或散點序列上點擊時,可以拾取序列上的數據點,並在狀態欄上顯示拾取的信息。
  • 使用鼠標滾輪可以對子圖進行縮放。NavigationToolbar工具欄提供的縮放功能只有矩形框選擇區域放大,或鼠標右鍵拖動縮放。

14.4 典型二維圖的繪製

在UI界面比較複雜時,希望在UI可視化設計時就放置一個類似於FigureCanvas的組件,而不是用代碼生成界面組件。爲此,我們設計了一個從QWidget繼承的繪圖組件類QmyFigureCanvas,在這個類裏創建一個FigureCanvas對象、一個Figure對象和一個NavigationToolbar工具欄,構成一個繪圖組件。在UI窗體可視化設計時,就可以放置一個QWidget組件然後提升爲QmyFigureCanvas類,這樣方便界面可視化設計。

基於自定義的類QmyFigureCanvas設計的示例Demo14_4,演示了幾種常見的二維圖的繪製。

圖14-16 “火柴桿圖”頁面

14.5 三維數據繪圖

Matplotlib可以繪製一些三維圖形,如三維曲面圖、三維線網圖、三維散點圖等。

本節通過實例Demo14_5簡單介紹Matplotlib中繪製三維曲面、三維線網圖和散點圖的方法。三維數據也可以用二維圖表現出來,例如一個三維曲面可以投影到X-Y平面上,用顏色表示一個點的Z軸的數值,這就是Axes類中的pcolormesh()、pcolor()等函數繪製的僞色圖。

圖14-18 示例Demo14_5運行時界面

 

<上一章>               <回主頁> 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章