用python 畫圖 -- matplotlib 簡單畫等高線圖 -- (二)

除了一些的 line plot 之外,在數據繪圖的時候也常常遇到要 plot 一些三維數據。而我最常遇到的需求是將一組三維的數據用等高線圖 ( contour )的形式畫出來。 matplotlib 提供了非常好用的 function 來滿足這項需求。

而目前我知道用來畫 contour 的 function 有下面這幾個:

contour()
contourf()
tricontour()
tricontourf()

contour() 和 contourf() 因為要求輸入的數據形式必須為格狀 (Grid),所以使用上較不直覺。而tricontour() 和 tricontourf() 則只需要將手上的數據分為 x list、y list、z list 餵進去就行。 

準備數據

因為手邊沒有現成的數據,所以只好假設一個情境來讓練習有點代入感。

先假設一個房間寬 5 公尺、長 12 公尺。準備一台掃地功能壞掉而且會亂跑的掃地機器人,這台機器人雖然無法掃地但是可以量測地板的骯髒程度,並用 0 ~ 10 的數值表示(0 為最乾淨,10為最髒)。放著讓這台機器人在房間裡跑一個晚上,並在隔天從機器人裡取出數據。而我們預計機器人會給出這個房間的骯髒程度分佈圖。

根據這個情境做假數據,假如機器人一個晚上進行了 100 次的隨機位置量測,所以產生假數據的程式碼可以簡單地這樣寫:
import numpy as np
x_list = []
y_list = []
z_list = []
for i in range(100):
    x_list.append(np.random.random() * 5)
    y_list.append(np.random.random() * 12)
    z_list.append(np.random.random() * 10)

從機器人裡面取得了 x_list,y_list,z_list 分別代表依照時間順序量到的 x 和 y 位置與對應的地板骯髒程度 z。

Plot


而使用 matplotlib 畫出等高線的程式碼:

import matplotlib.pyplot as plt
plt.tricontour(x_list, y_list, z_list)

所以整個程式碼其實很簡單:


而 tricontourf() 這個 function 則是用來畫著色圖...還是直接給圖比較清楚:



在畫等高線時,其實是可以指定要畫哪幾個 z 值就好。譬如說我們現在只想看骯髒程度 3 到 9 之間的地方,然後每隔程度 2 畫一層就好。那麼指令就可以這樣下

plt.contour(x_list,y_list,z_list, levels = [3,5,7,9] )

看下圖比較清楚:


結語

其實看到這邊,大概也不會產生進一步的動機去學 contour() 和 contourf() 怎麼用了。因為 tricontour() 和 tricontourf() 已經滿足大部份的需求了,而且用法又簡單。不過就三維的數據繪圖,其實還有一個是畫三維立體圖。那個看起來很炫,但是要求的數據形式就比較複雜,通常要寫些小程式來進行整理。這個就改天再寫了。

留言

熱門文章