Python進階之Matplotlib入門(七)

  • 2019 年 11 月 23 日
  • 筆記

引言

Matplotlib是Python的畫圖領域使用最廣泛的繪圖庫,它能讓使用者很輕鬆地將數據圖形化以及利用它可以畫出許多高質量的圖像,是用Python畫圖的必備技能。對於這個教程,大家最好親自碼一遍代碼,這樣可以更有收穫。

概要

1、掌握Matplotlib中的等高線圖畫法;

2、掌握Matplotlib中的圖像顯示用法;

等高線圖

等高線圖是一種常見的圖的類型。

它指的是地形圖上高程相等的相鄰各點所連成的閉合曲線。把地面上海拔高度相同的點連成的閉合曲線,並垂直投影到一個水平面上,並按比例縮繪在圖紙上,就得到等高線。等高線也可以看作是不同海拔高度的水平面與實際地面的交線,所以等高線是閉合曲線。在等高線上標註的數字為該等高線的海拔。

今天我們要學習的圖例為:

實現上面等高線圖的代碼:

import numpy as npimport matplotlib.pyplot as plt  def f(x,y): return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)  n = 256x = np.linspace(-3,3,n)y = np.linspace(-3,3,n)X,Y = np.meshgrid(x,y)  plt.contourf(X, Y, f(X,Y), 8, alpha=.75, cmap='jet')C = plt.contour(X, Y, f(X,Y), 8, colors='black', linewidth=.5)plt.clabel(C, inline=True, fontsize=10)plt.xticks(())plt.yticks(())  plt.show()

我們先構造一個二維平面「網格」,這裡用到了NumPy中的linspace函數,橫縱坐標都分成256份。我們用NumPy中的meshgrid函數構造網格。有了網格之後,我們定義f(x,y)函數來作為高度函數。

接下來就是使用畫等高線圖的三個函數coutourf,contour以及clabel函數:

  • coutourf函數負責填充顏色,其中數字8為等高線的密集程度;alpha為透明度;cmap為顏色風格,它會根據f(x,y)的值不同而選擇不同的顏色。具體顏色範圍請看這裡:

https://matplotlib.org/examples/color/colormaps_reference.html

倒數第三個為我們選擇的顏色風格,大家可以嘗試別的顏色風格。

僅僅有contourf函數的結果如下:

  • contour函數負責劃線,顏色為黑色,效果如下圖:
  • clabel函數負責添加等高線對應的高度,inline控制是否將Label畫在線裏面。

圖像顯示

現在我們介紹一個叫做imshow的函數,它可以將一個二維數組的值變成顏色打印出來。比如

import matplotlib.pyplot as pltimport numpy as np  def f(x,y): return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)  n = 3x = np.linspace(-3,3,3*n)y = np.linspace(-3,3,3*n)X,Y = np.meshgrid(x,y)plt.imshow(f(X,Y),cmap='bone')plt.colorbar()plt.show()

運行結果:

這個例子中,我們先觀察一個9*9數組的結果。其中

  • imshow函數負責打印數組變成圖片,cmap我們選擇了bone的風格;
  • colorbar函數負責顯示右邊的顏色棒,上面會顯示不同數值對應的顏色,方便大家判斷。

最後,我們增大數組的大小,改變camp風格,看一下更加漂亮的結果:

import matplotlib.pyplot as pltimport numpy as np  def f(x,y): return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)  n = 256x = np.linspace(-3,3,3*n)y = np.linspace(-3,3,3*n)X,Y = np.meshgrid(x,y)plt.imshow(f(X,Y),cmap='jet')plt.colorbar()plt.show()

請大家對比imshow和contour畫出來的圖的異同。