目錄
-
Matplotlib介紹
Matplotlib是一個Python的2D繪圖庫,它以各種硬拷貝格式和跨平台的交互式環境生成出版質量級別的圖形。通過Matplotlib,開發者可以僅需要幾行代碼,便可以生成繪圖。一般可繪制折線圖、散點圖、柱狀圖、餅圖、直方圖、子圖等等。Matplot使用Numpy進行數組運算,並調用一系列其他的Python庫來實現硬件交互。
Pylab是matplotlib面向對象繪圖庫的一個接口,它的語法和matlab十分相似。也就是說,它主要的繪圖命令和matlab對應的命令有相似的參數。
-
初級繪制
-
繪圖簡介
使用matplotlib庫繪圖,原理很簡單,如下5步:
-
創建一個圖紙(figure)
-
在圖紙上創建一個或多個繪圖(plotting)區域(坐標系/軸,axes)
-
在plotting區域上描繪點、線等
-
為plotting添加修飾標簽(繪圖線上的或坐標軸上的)
-
其他各種DIY
-
-
在上面的過程中,主要就是下面三個元素:
-
變量
-
函數
-
圖紙(figure)和坐標軸(axes)
其中,變量和函數通過改變figure和axes中的元素(例如:title,label,點和線等等)一起描述figure和axes,也就是在畫布上繪圖。圖片結構如下所示:
如上圖所示,一張圖紙(figure)中有坐標軸(axes),title為圖像標題,axis為坐標軸,label為坐標軸標注,tick為刻度線,tick label為刻度注釋。
-
-
-
2D各種圖形繪制
-
簡單案例剖析
我們說Matplotlib是一個非常簡單而又完善的開源繪圖庫,那么它到底有多簡單呢?
下面我們用三行代碼繪制一張簡單的的折線圖。
-
|
我們可以看到,一張和山峰相似的折線圖就繪制出來了,接下來,我們來解析一下這三行代碼的含義:
這行代碼是從Matplotlib中導入了pyplot繪圖模塊,並將其簡稱為plt。pyplot模塊是Matplotlib最核心的模塊,幾乎所有樣式的2D圖形都是經過該模塊繪制出來的。這里簡稱其為plt是約定俗成的,希望你也這樣寫代碼,以便擁有更好的可讀性。
plt.plot()函數是pyplot模塊下面的直線繪制(折線圖)方法類。示例中包含了一個[1,3,5,2,6,3]列表,這里默認將該列表作為y值,而x值會從0到n-1.
最后一行代碼表示將圖顯示出來。
-
除了折線圖,怎樣繪制其他圖?
除了折線圖,我們平常還要繪制柱狀圖、散點圖、餅狀圖等等。這些圖應該怎樣繪制呢?
上文中,我們提到了pyplot模塊,其中pyplot.plot()方法是用來繪制折線圖的。你應該會很容易聯想到,更改后面的方法類名,就可以更改圖形的樣式。的確,在matplotlib中,大部分圖形樣式的繪制方法都存在於pyplot模塊中。例如:
|
除此之外,對圖像樣式的微調,包括標注、填充、自定義坐標軸等也同樣包含在pyplot模塊中。例如:
matplotlib.pyplot 模塊下一共包含了160余個不同的方法(官方文檔P1387),這些方法涉及到圖像繪制的方方面面。
-
2D圖像繪制
下面,我們就來學習一些常見類型的圖像繪制及參數使用。
-
線型圖
方法:matplotlib.pyplot.plot(*args,**kwargs)
上面我們建東使用該方法來繪制折線圖。其實,matplotlib.pyplot.plot(*args,**kwargs)方法嚴格來講可以繪制線型圖或者樣本標記。其中*args允許輸入單個y值或x,y值。
例如我們繪制正弦曲線:
|
這樣,一條正弦曲線就繪制出來了。但值得注意的是,pyplot.plot()在這里繪制的正弦曲線,實際上不是嚴格意義上的曲線圖,而是在兩點之間仍然是直線。因為取得點比較多,離得比較近,這里看起來像曲線 |
np.linspace()使用詳解 np.linspace() 生成(start,stop)區間指定元素個數num的list,均勻分布 np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) start :序列的起點 stop :序列的結束 num :int型數值,可選項,用來指定元素的個數,默認是50 endpoint:是否包含右邊界點,True表示包含,默認為True,不包含為False retstep:bool,optional可選,為Ture返回步長(stop-start)/num的值 |
np.logspace()使用詳解 np.logspace()方法與np.linspace()方法類似。只不過生成的不是均勻分布數據,而是log分布數據 |
np.array()使用詳解 numpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0) object:一個數組 dtype:數組中數據的類型,如果沒有給出,取最小類型 其余參數都是可選的 |
-
柱形圖
方法: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再試一次。 |
|
這時我們得到的圖形仍然為有正弦的痕跡,因為我們的y=sin(x),當我們對y取一下絕對值后np.abs(np.sin(x)),得到的柱形圖如下 |
|
-
散點圖
方法:matplotlib.pyplot.scatter(*args, **kwargs)
散點圖就是呈現在二維平面的一些點,這種圖像的需求也是非常罕見的。比如,我們通過GPS采集的數據點,它會包含經度和緯度兩個值,這樣的情況就可以繪制稱散點圖。下面,我們畫一個試一試:
|
其中:高斯分布 numpy.random.normal(loc=0.0, scale=1.0, size=None) loc : float此概率分布的均值(對應着整個分布的中心centre) scale : float,此概率分布的標准差(對應與分布的寬度,scale越大,分布波形越矮胖;scale越小,分布波形越瘦高) size : int or tuple of ints,輸出的shape,默認為None,只輸出一個值 |
正態分布: numpy.random.randn(size) 即所謂的標准正態分布 對應於numpy.random.normal(loc=0, scale=1, size=None)。 |
-
餅狀圖
方法:matplotlib.pyplot.pie(*args, **kwargs)
餅狀圖在有限列表以百分比呈現時特別有用,你可以很清晰的看出來各類別之間的大小關系,以及各類別占總體的比例。
|
這里的Z值反映了各類別之間的大小關系,而且無論輸入多少個值,最終都是在一張餅(100%)瓜分 |
-
量場圖
方法:matplotlib.pyplot.quiver(*args, **kwargs)
量場圖就是由向量組成的圖像,在氣象學等方面被廣泛應用。從圖像的角度來看,量場圖就是帶方向的箭頭符號。
|
-
等高線圖
方法:matplotlib.pyplot.contourf(*args, **kwargs)
中學學習地理的時候,我們就知道等高線了。等高線圖是工程領域經常接觸的一類圖,那么如何用 Matplotlib 畫出來呢?
|
值得注意的是,當我們向 contourf(X,Y,Z) 傳入數據時,一定要注意相互之間的維度關系,不然很容易報錯。其中,當 X,Y,Z 都是 2 維數組時,它們的形狀必須相同。如果都是 1 維數組時,len(X)是 Z 的列數,而 len(Y) 是 Z 中的行數。 |
2 維數組示例: |
1 維數組示例: |
-
2D繪圖進階(樣式,顏色等等)
-
線型圖樣式
我們已經知道了,線型圖通過 matplotlib.pyplot.plot(*args, **kwargs)方法繪出。其中,args代表數據輸入,而 kwargs的部分就是用於設置樣式參數了。
二維線型圖包含的參數超過 40 余項(文檔 P1390)。其中常用的也有 10 余項,選取一些比較有代表性的參數列舉如下:
-
|
|
|
其實,大部分都是所顏色所對應的英文名稱首字母。當然,你也可以通過color = '#008000'的方式來設置任何你想要的顏色。 |
||
線型的樣式 linestyle = 預設的參數值(文檔 P1250)有: |
|
|
樣本點標記樣式 marker = 預設的參數值(文檔 P1527)就更多了: 下圖展示了所有標記對應的參數值和樣式 |
下面我們來重新畫一遍正弦函數的圖像。添加幾個參數,希望它不再那么單調。
|
-
散點圖樣式
了線型圖以外,散點圖也是常用圖形之一。例如,我們在使用機器學習算法聚類的時候,往往就會通過散點圖將樣本數據展示出來。
Matplotlib 中,繪制散點圖的方法我們已經知道了,那就是 matplotlib.pyplot.scatter()。接下來,我們就看一看它包含有哪些參數。
|
其中,散點的大小通過設置數值大小控制。散點的顏色可以是一種,參數值和線型的顏色設置類似。散點的顏色也可以是多種,可以使用一個列表對每一個點的顏色單獨設置。 |
|
-
餅狀圖樣式
餅狀圖通過 matplotlib.pyplot.pie() 繪出。我們也可以進一步設置它的顏色、標簽、陰影等各類樣式。下面就繪出一個示例。
|
-
組合圖
上面演示了三種常見圖像的繪制。實際上,我們往往會遇到將幾種類型的一樣的圖放在一張圖內顯示,也就是組合圖的繪制。
其實很簡單,你只需要將需要或者的組合圖樣式放在一起就好了,比如柱形圖和折線圖。
|
-
子圖繪制
上面提到了組合圖繪制,但有一些圖是無法組合直接放在一起的,這時就需要子圖了。子圖,就是將幾張獨立的圖放在一張大圖中呈現。在一些需要對比的情形下,子圖非常有效。
Matplotlib 中,繪制子圖的方法為matplotlib.pyplot.subplot(),我們通過該方法來控制各子圖的顯示順序。其中:
|
下面列舉了三種常見子圖的位置關系示意圖 |
|
接下來,我們繪制了一個由 4 個子圖(2 行 x 2 列)組成的大圖。 |
|
除了這類平行或垂直排列的子圖,我們還可以通過 matplotlib.pyplot.subplot()繪制出更復雜的樣式。比如,大圖套小圖。 |
|
-
繪制圖例
一般情況下,當繪制好圖案后,還需要繪制圖例。Matplotlib 中,圖例可以通過 matplotlib.pyplot.legend()方法繪制。我們又拿上面的正弦和余弦曲線舉例。
|
在這里,我們需要修改兩個地方,也就是通過 label= 為每一條曲線添加標簽。然后,增加一條 plt.legend(loc='upper left')就可以了。其中,loc='upper left'是指明圖例的位置,例如這里是左上方。你還可以通過 down和 right組合實現位置的變換。 |
-
圖像標注
當我們繪制一些較為復雜的圖像時,閱讀對象往往很難全面理解圖像的含義。而此時,圖像標注往往會起到畫龍點睛的效果。圖像標注,就是在畫面上添加文字注釋、指示箭頭、圖框等各類標注元素。
Matplotlib 中,文字標注的方法由 matplotlib.pyplot.text()實現。最基本的樣式為 matplotlib.pyplot.text(x, y, s),其中 x, y 用於標注位置定位,s 代表標注的字符串。除此之外,你還可以通過 fontsize= , horizontalalignment= 等參數調整標注字體的大小,對齊樣式等。
下面,我們舉一個對柱形圖進行文字標注的示例。
|
除了文字標注之外,還可以通過 matplotlib.pyplot.annotate() 方法向圖像中添加箭頭等樣式標注。接下來,我們向上面的例子中增添一行增加箭頭標記的代碼。 |
-
動態圖繪制
動態圖是繪圖中不可缺少的一部分,雖然演示環境要求高且使用頻率低,但是一些特定的場景下,動態圖傳達的信息量遠大於靜態圖片。
舉個例子來講,數值計算中,我們往往會使用到梯度下降法。如果用語言和公式描述梯度下降的過程會非常枯燥。要是通過繪制一張演示梯度下降過程的動圖,就算第一次接觸該方法,也會很快的理解。
Matplotlib很早開始就支持動態圖了,下面就通過簡單的小例子來演示一下動態圖的繪制。
動態圖主要是通過animation模塊實現。具體就是matplotlib.animation.FuncAnimation(fig,func)。其中fig代表所繪制的圖像,而func可以看作是更新函數,它刷新每一幀的值。
-
Matplotlib三維繪圖(3D)
-
mplot3d繪圖模塊介紹
前面,我們已經了解了如果使用 Matplotlib 中的 pyplot 模塊繪制簡單的 2D 圖像。其實,Matplotlib 也可以繪制 3D 圖像,與二維圖像不同的是,繪制三維圖像主要通過 mplot3d 模塊實現。但是,使用 Matplotlib 繪制三維圖像實際上是在二維畫布上展示,所以一般繪制三維圖像時,同樣需要載入 pyplot模塊。
mplot3d模塊下主要包含 4 個大類,分別是:
-
-
mpl_toolkits.mplot3d.axes3d()
-
mpl_toolkits.mplot3d.axis3d()
-
mpl_toolkits.mplot3d.art3d()
-
mpl_toolkits.mplot3d.proj3d()
其中,axes3d()下面主要包含了各種實現繪圖的類和方法。axis3d()主要是包含了和坐標軸相關的類和方法。art3d() 包含了一些可將 2D 圖像轉換並用於 3D 繪制的類和方法。proj3d()中包含一些零碎的類和方法,例如計算三維向量長度等。
一般情況下,我們用到最多的就是 mpl_toolkits.mplot3d.axes3d()下面的 mpl_toolkits.mplot3d.axes3d.Axes3D()類,而 Axes3D()下面又存在繪制不同類型 3D 圖的方法。你可以通過下面的方式導入 Axes3D()。
-
三維散點圖
接下來,通過一個簡單的例子,來看一看繪制三維圖像具體需要幾個步驟。
-
首先,我們導入 numpy 隨機生成一組數據。
-
接下來,開始繪圖。第一步是載入 2D, 3D 繪圖模塊。
-
第二步,使用 Axes3D() 創建 3D 圖形對象。
-
最后,調用散點圖繪制方法繪圖並顯示出來。
-
除開生成數據和模塊導入,實際上只用了 4 行短小的代碼就繪制出了一幅三維散點圖像。
-
-
三維線型圖
線形圖和散點圖相似,需要傳入 x, y, z 三個坐標的數值。詳細的代碼如下。
-
三維柱狀圖
繪制完線型圖,我們繼續嘗試繪制三維柱狀圖,其實它的繪制步驟和上面同樣非常相似。
-
三維去面圖
接下來需要繪制的三維曲面圖要麻煩一些,我們需要對數據進行矩陣處理。其實和畫二維等高線圖很相似,只是多增加了一個維度。
-
混合圖繪制
混合圖就是將兩種不同類型的圖繪制在一張圖里。繪制混合圖一般有前提條件,那就是兩種不同類型圖的范圍大致相同,否則將會出現嚴重的比例不協調,而使得混合圖失去意義。
-
子圖繪制
-
三維圖繪制總結
本次實驗主要是學會如果使用 Matplotlib 完成簡單的 3D 繪圖。你會發現,三維繪圖其實就是在二維繪圖上的演變。二者的區別重點在兩個方面,首先需要建一個了三維畫布,其次需要多輸入一個維度值,即 z 值。
-
參考繪圖網址
-
Matplotlib 繪圖教程(2D入門)
-
Matplotlib 繪圖教程(2D進階)
-
Matplotlib 繪圖教程(3D)
-
官方文檔
-