Matplotlib 繪圖教程(2D入門)


一、實驗介紹

1.1 實驗內容

Matplotlib 是支持 Python 語言的開源繪圖庫,因爲其支持豐富的繪圖類型、簡單的繪圖方式以及完善的接口文檔,深受 Python 工程師、科研學者、數據工程師等各類人士的喜歡。這是 Matplotlib 繪圖課程的第一章節,將帶你瞭解如何使用 Matplotlib 繪製 2D 圖像。

1.2 實驗知識點

  • Matplotlib 繪製 2D 圖像

1.3 實驗環境

  • python2.7
  • Xfce 終端
  • ipython 終端

1.4 適合人羣

本課程難度爲一般,屬於初級級別課程,適合具有 Python 基礎,並對使用 Matplotlib 繪圖感興趣的用戶。

1.5 官方文檔

學習本課程之前,你需要先下載官方文檔,推薦保存到你的本地電腦上。Matplotlib 的內容量非常大(官方文檔都有 3000 多頁),課程側重進行介紹並演示。部分補充內容,文中會給出官方文檔的頁碼,方便課後自行查閱。

https://matplotlib.org/2.0.2/Matplotlib.pdf

二、Matplotlib 初探

在日常的工作和學習過程中,我們都會遇到需要針對數據進行繪圖的時候。談起數據繪圖,你應該最先想到的是 Excel。Excel 操作起來相對簡單,提供的圖形樣式也可以滿足大部分人日常繪圖的需要。但是,如果你處於工程、數據科學相關專業領域,使用 Excel 繪圖就顯得捉襟見肘了。首先,Excel 默認 提供的圖形樣式有限,其次是自定義程度不高。

很多時候,我們會使用到 Matlab 提供的繪圖模塊,又或者使用 Origin 進行繪圖。這些軟件固然都很不錯,但均爲商業軟件,使用時需要獲得授權。

今天介紹的 Matplotlib 就是一個可以媲美商業軟件效果的開源繪圖工具,你只需要掌握一點 Python 語言,就可以繪製出任何需要的圖形。Matplotlib 擁有着十分活躍的社區以及穩定的版本迭代。選擇 Matplotlib 無疑是和數據打交道時最明智的選擇之一。

2.1 Matplotlib 安裝

實驗樓的在線環境,默認已經安裝了 Matplotlib 1.3.1 版本。目前,Matplotlib 的最新穩定版本爲 2.0.2。本課程內容基於實驗樓在線環境版本,在本地測試時,某一些模塊可能會有一些變化。

如果你想在本地安裝 Matplotlib,可以這樣做:

Linux:

Debian / Ubuntu : sudo apt-get install python-matplotlib
Fedora / Redhat : sudo yum install python-matplotlib

Windows & macOS:

python -m pip install -U pip setuptools
python -m pip install matplotlib

2.2 繪製簡單的折線圖需要幾步?

我們都說了,Matplotlib 是一個非常簡單而又完善的開源繪圖庫。那麼它到底有多簡單呢?

下面,我們通過 3 行代碼繪製一張簡單的折線圖。你可以通過在線環境左下角的應用程序菜單 > 附件,打開 ipython 交互式終端(本課程默認),並鍵入下面的代碼。

from matplotlib import pyplot as plt

plt.plot([1,2,3,2,1,2,3,4,5,6,5,4,3,2,1])
plt.show()

此處輸入圖片的描述

我們可以看到,一張和山峯樣式相似的折線圖就繪製出來了。接下來,我們來解析一下這三行代碼的含義。

from matplotlib import pyplot as plt

第一行代碼是從 Matplotlib 中導入了 pyplot 繪圖模塊,並將其簡稱爲 plt。pyplot 模塊是 Matplotlib 最核心的模塊,幾乎所有樣式的 2D 圖形都是經過該模塊繪製出來的。這裏簡稱其爲 plt 是約定俗成的,希望你也這樣書寫代碼,以便擁有更好的可讀性。

plt.plot([1,2,3,2,1,2,3,4,5,6,5,4,3,2,1])

plt.plot() 是 pyplot 模塊下面的直線繪製(折線圖)方法類。示例中包含了一個[1,2,3,2,1,2,3,4,5,6,5,4,3,2,1]列表,這裏默認代表將該列表作爲 y值,而 x 值會從 0 到 n-1

plt.show()

最後一行代碼表示將圖顯示出來。

2.3 除了折線圖,怎樣繪製其他圖?

上面演示瞭如何通過 3 行代碼繪製一張折線圖。那麼,除了折線圖,我們平常還要繪製柱狀圖、散點圖、餅狀圖等等。這些圖應該怎樣繪製呢?

上文中,我們提到了 pyplot 模塊,其中 pyplot.plot 方法是用來繪製折線圖的。你應該會很容易聯想到,更改後面的方法類名就可以更改圖形的樣式,會是這樣的嗎?

的確,在 Matplotlib 中,大部分圖形樣式的繪製方法都存在於 pyplot 模塊中。例如:

方法 含義
matplotlib.pyplot.angle_spectrum 繪製電子波譜圖
matplotlib.pyplot.bar 繪製柱狀圖
matplotlib.pyplot.barh 繪製直方圖
matplotlib.pyplot.broken_barh 繪製水平直方圖
matplotlib.pyplot.contour 繪製等高線圖
matplotlib.pyplot.errorbar 繪製誤差線
matplotlib.pyplot.hexbin 繪製六邊形圖案
matplotlib.pyplot.hist 繪製柱形圖
matplotlib.pyplot.hist2d 繪製水平柱狀圖
matplotlib.pyplot.imshow 以圖像顯示
matplotlib.pyplot.pie 繪製餅狀圖
matplotlib.pyplot.quiver 繪製量場圖
matplotlib.pyplot.scatter 散點圖
matplotlib.pyplot.specgram 繪製光譜圖
matplotlib.pyplot.subplot 繪製子圖

除此之外,對圖像樣式的微調,包括標註、填充、自定義座標軸等也同樣包含在 pyplot 模塊中。例如:

方法 含義
matplotlib.pyplot.annotate 繪製圖形標註
matplotlib.pyplot.axhspan 繪製垂直或水平色塊
matplotlib.pyplot.clabel 標註輪廓線
matplotlib.pyplot.fill 填充區域

matplotlib.pyplot 模塊下一共包含了 160 餘個不同的方法(官方文檔 p1387),這些方法涉及到圖像繪製的方方面面,這裏就不再一一羅列。在後面的實驗中,我們會慢慢接觸到其中最常用的方法,這些方法足以滿足大部分繪圖需求。

三、2D 圖像繪製

下面,我們就來一些常見類型的圖像繪製及參數使用。

3.1 線型圖

方法:matplotlib.pyplot.plot(*args, **kwargs)

上面我們見到使用該方法來繪製折線圖。其實,matplotlib.pyplot.plot(*args, **kwargs)方法嚴格來講可以繪製線型圖或者樣本標記。其中,*args允許輸入單個 y 值或 x,y 值。

例如,我們這裏繪製一張自定義 x,y 的曲線圖。繪製點什麼好呢?那就正弦曲線吧。

from matplotlib import pyplot as plt #載入 pyplot 繪圖模塊
import numpy as np # 載入數值計算模塊

# 在 -2PI 和 2PI 之間等間距生成 1000 個值,也就是 X 座標
X = np.linspace(-2*np.pi, 2*np.pi, 1000)
# 計算 y 座標
y = np.sin(X)

# 向方法中 `*args` 輸入 X,y 座標
plt.plot(X, y)
plt.show()

此處輸入圖片的描述

此處輸入圖片的描述

這樣,1 條正弦曲線就繪製出來了。但值得注意的是,pyplot.plot 在這裏繪製的正弦曲線,實際上不是嚴格意義上的曲線圖,而在兩點之間依舊是直線。這裏看起來像曲線是因爲樣本點相互捱得很近。

3.2 柱形圖

方法:matplotlib.pyplot.bar(*args, **kwargs)

柱形圖大家應該都非常瞭解了。這裏,我們直接用上面的線性圖的代碼,僅把 plt.plot(X, y) 改成 plt.bar(X, y) 試一下。

此處輸入圖片的描述

此處輸入圖片的描述

效果好像不太好,問題當然是出在這裏:X = np.linspace(-2*np.pi, 2*np.pi, 1000)。橫座標是等間距生成的 1000 個值,效果當然會堆積在一起了。嘗試把 1000 改成 10再試一次。

from matplotlib import pyplot as plt #載入 pyplot 繪圖模塊
import numpy as np # 載入數值計算模塊

# 在 -2PI 和 2PI 之間等間距生成 10 個值,也就是 X 座標
X = np.linspace(-2*np.pi, 2*np.pi, 10)
# 計算 y 座標
y = np.sin(X)

# 向方法中 `*args` 輸入 X,y 座標
plt.bar(X, abs(y))  # y 值取絕對值
plt.show()

此處輸入圖片的描述

柱形圖的樣式終於出來了。

3.3 散點圖

方法:matplotlib.pyplot.scatter(*args, **kwargs)

散點圖就是呈現在二維平面的一些點,這種圖像的需求也是非常常見的。比如,我們通過 GPS 採集的數據點,它會包含經度以及緯度兩個值,這樣的情況就可以繪製成散點圖。下面,我們畫一個試試。

from matplotlib import pyplot as plt #載入 pyplot 繪圖模塊
import numpy as np # 載入數值計算模塊

# X,y 的座標均有 numpy 在 0 到 1 中隨機生成 1000 個值
X = np.random.normal(0,1,1000)
y = np.random.normal(0,1,1000)

# 向方法中 `*args` 輸入 X,y 座標
plt.scatter(X, y)
plt.show()

此處輸入圖片的描述

此處輸入圖片的描述

3.4 餅狀圖

方法:matplotlib.pyplot.pie(*args, **kwargs)

餅狀圖在有限列表以百分比呈現時特別有用,你可以很清晰地看出來各類別之間的大小關係,以及各類別佔總體的比例。

from matplotlib import pyplot as plt #載入 pyplot 繪圖模塊

Z = [1, 2, 3, 4, 5]
# 繪圖
plt.pie(Z)
plt.show()

這裏的 Z 值反映了互相之間的大小關係,而無論輸入多少個值,最終都是在一張餅(100%)裏瓜分。

此處輸入圖片的描述

3.5 量場圖

方法:matplotlib.pyplot.quiver(*args, **kwargs)

量場圖就是由向量組成的圖像,在氣象學等方面被廣泛應用。從圖像的角度來看,量場圖就是帶方向的箭頭符號。

from matplotlib import pyplot as plt #載入 pyplot 繪圖模塊
import numpy as np # 載入數值計算模塊

# 生成數據矩陣
X, y = np.mgrid[0:10, 0:10]
# 繪圖
plt.quiver(X, y)
plt.show()

此處輸入圖片的描述

此處輸入圖片的描述

3.6 等高線圖

方法:matplotlib.pyplot.contourf(*args, **kwargs)

中學學習地理的時候,我們就知道等高線了。等高線圖是工程領域經常接觸的一類圖,那麼如何用 Matplotlib 畫出來呢?

from matplotlib import pyplot as plt #載入 pyplot 繪圖模塊
import numpy as np # 載入數值計算模塊

# 生成數據
x = np.linspace(-5, 5, 500)
y = np.linspace(-5, 5, 500)
X, Y = np.meshgrid(x, y)
Z = (1 - X / 2 + X ** 3 + Y ** 4) * np.exp(-X ** 2 - Y ** 2)

# 繪圖
plt.contourf(X, Y, Z)
plt.show()

此處輸入圖片的描述

此處輸入圖片的描述

值得注意的是,當我們向 contourf(X,Y,Z) 傳入數據時,一定要注意相互之間的維度關係,不然很容易報錯。其中,當 X,Y,Z 都是 2 維數組時,它們的形狀必須相同。如果都是 1 維數組時,len(X)是 Z 的列數,而 len(Y) 是 Z 中的行數。

2 維數組示例:

X = [[1, 2], [3, 4]]
Y = [[1, 2], [3, 4]]
Z = [[1, 2], [3, 4]]

1 維數組示例:

X = [1, 2]
Y = [-1, -2, -3]
Z = [[1, 2], [3, 4], [5, 6]]

四、實驗總結

本次實驗對 pyplot 裏包含的繪圖方法進行了初步熟悉,並學會使用這些方法的默認參數繪製簡單的圖形樣式。接下來的進階實驗將學習方法中提供的參數,繪製更爲複雜漂亮的 2D 圖像。

五、課後習題

1.自行閱讀官方文檔從 1387 頁開始對 [matplotlib.pyplot] 模塊的介紹內容。對本章節介紹過的方法加深印象。若有餘力,學習並掌握剩餘沒有介紹的方法。

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