当前位置:网站首页>#yyds幹貨盤點#利用Matplotlib庫畫圖(一)

#yyds幹貨盤點#利用Matplotlib庫畫圖(一)

2021-11-25 17:46:11 來西瓜

      一圖勝千言,利用Python中的Matplotlib庫可以在短短幾行代碼中創建一幅高質量的圖。不管是用在論文還是匯報ppt中,這些圖都將讓人眼前一亮,迅速了解問題的核心。

      然而,Matplotlib庫相當龐大,要創建一個看起來恰到好處的圖通常需要反複試驗。雖然代碼一行流能够很簡單的生成一些基礎圖,但是如何巧妙的使用庫中剩下的98%功能是一件不簡單的事。

      本文將介紹Matplotlib庫的使用,水平從入門到中階,其中理論知識和實驗穿插在一起,使讀者更容易理解Matplotlib庫的原理與運作方式。

本文假設讀者們已經了解一點numpy的知識,使用numpy.random主要是為了生產示例數據,便於從不同的統計分布中抽取樣本。

1、令人頭疼的Matplotlib庫

      有時學習Matplotlib庫是一個令人頭疼的過程,問題不在於資料太少,事實上與之相關的資料多如牛毛。以下幾個原因造成了人們學習的困境:

      1)庫本身很大,包括了超過70000行代碼;

      2)Matplotlib 擁有多種不同的界面(構建圖形的方式),並且能够與少數不同的後端進行交互。 (後端處理圖錶實際呈現的過程,而不僅僅是內部結構化)

      3)雖然它很全面,但 Matplotlib 自己的一些公共文檔已經嚴重過時了。 該庫仍在不斷發展,許多在網上流傳的舊示例在其現代版本中可能會减少 70% 的代碼行。

      因此,在進入任何華麗的示例之前,掌握 Matplotlib 設計的核心概念很有用。

2、Pylab:它是什麼,我應該使用它嗎?

      讓我們從一段曆史開始:神經生物學家 John D. Hunter 於 2003 年左右開始開發 Matplotlib,最初的靈感是模擬 Mathworks 的 MATLAB 軟件中的命令。John 於 2012 年不幸去世,享年 44 歲,Matplotlib 現在是一個成熟的社區項目,由許多其他人開發和維護。

MATLAB 的一項相關特性是其全局樣式。 導入的 Python 概念在 MATLAB 中並沒有大量使用,並且 MATLAB 的大部分功能在頂級用戶都可以輕松使用。

      知道 Matplotlib 起源於 MATLAB 有助於解釋為什麼 pylab 存在。 pylab 是 Matplotlib 庫中的一個模塊,旨在模仿 MATLAB 的全局風格。它的存在只是為了將 NumPy 和 matplotlib 中的許多函數和類帶入命名空間,使不習慣需要導入語句的前 MATLAB 用戶輕松過渡。

習慣於使用MATLAB的用戶會喜歡這個功能,因為使用 from pylab import *,他們可以像在 MATLAB 中一樣直接調用 plot() 或 array() 。

這裏的問題對於一些 Python 用戶來說可能很明顯:在會話或脚本中使用 from pylab import * 通常是不好的做法。 Matplotlib 現在在其自己的教程中直接建議不要這樣做:

“[pylab] still exists for historical reasons, but it is highly advised not to use. It pollutes namespaces with functions that will shadow Python built-ins and can lead to hard-to-track bugs. To get IPython integration without imports the use of the %matplotlib magic is preferred.” 

      在內部,在簡短的 pylab 源中隱藏了大量潜在的沖突導入。 事實上,使用 ipython --pylab(來自終端/命令行)或 %pylab(來自 IPython/Jupyter 工具)只需在後臺調用 from pylab import * 即可。

底線是 matplotlib 已經放弃了這個方便的模塊,現在明確建議不要使用 pylab,使事情更符合 Python 的一個關鍵概念:顯式優於隱式。

不需要 pylab,我們通常可以只使用一個規範導入:

import matplotlib.pyplot as plt

      在此過程中,我們還導入 NumPy,稍後我們將使用它來生成數據,並調用 np.random.seed() 使示例具有(偽)隨機數據可重現:

import numpy as np

np.random.seed(444)

3、Matplotlib 對象層次結構

      matplotlib 的一個重要概念是它的對象層次結構。如果你學習過任何介紹性的 matplotlib 教程,你可能已經調用過類似 plt.plot([1, 2, 3]) 的東西。 這個單行隱藏了一個事實,即繪圖實際上是嵌套 Python 對象的層次結構。 這裏的“層次結構”意味著每個圖下面都有一個 matplotlib 對象的樹狀結構。

      Figure 對象是 matplotlib 圖形的最外層容器,它可以包含多個 Axes 對象。 混淆的一個來源是名稱:Axes 實際上轉化為我們認為的單個繪圖或圖形(而不是我們所期望的“軸”的複數形式)。

      您可以將 Figure 對象視為一個盒狀容器,其中包含一個或多個 Axes(實際繪圖)。層次結構中軸下方是較小的對象,例如刻度線、單行、圖例和文本框。圖錶的幾乎每個“元素”都是它自己的可操作 Python 對象,一直到刻度和標簽: 

#yyds幹貨盤點#利用Matplotlib庫畫圖(一)_數據

      這是此層次結構的示例圖。 如果您不完全熟悉這種錶示法,請不要擔心,我們將在稍後介紹:

fig, _ = plt.subplots()

type(fig)

<class ‘matplotlib.figure.Figure'>

      上面,我們用 plt.subplots() 創建了兩個變量。 第一個是頂級 Figure 對象。 第二個是我們還不需要的“一次性”變量,用下劃線錶示。 使用屬性錶示法,很容易向下遍曆圖形層次結構並查看第一個 Axes 對象的 y 軸的第一個刻度:

one_tick = fig.axes[0].yaxis.get_major_ticks()[0]

type(one_tick)

<class ‘matplotlib.axis.YTick'>

      上面, fig (一個 Figure 類實例)有多個 Axes (一個列錶,我們取第一個元素)。 每個 Axes 都有一個 yaxis 和 xaxis,每個都有一個“主要刻度”的集合,我們抓住第一個。

      Matplotlib 將其呈現為人體解剖結構,而不是明確的層次結構:

 #yyds幹貨盤點#利用Matplotlib庫畫圖(一)_層次結構_02












版权声明
本文为[來西瓜]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/11/20211125174441113U.html

随机推荐