Python圖表繪製:matplotlib繪圖庫入門
matplotlib 是python最著名的繪圖庫,它提供了一整套和matlab相似的命令API,十分適合互動式地行製圖。而且也可以方便地將它作為繪圖控制項,嵌入GUI應用程式中。
它的文檔相當完備,並且Gallery頁面中有上百幅縮圖,開啟之後都有來源程式。因此如果你需要繪製某種類型的圖,只需要在這個頁面中瀏覽/複製/粘貼一下,基本上都能搞定。
在Linux下比較著名的資料圖工具還有gnuplot,這個是免費的,Python有一個包可以調用gnuplot,但是文法比較不習慣,而且畫圖品質不高。
而 Matplotlib則比較強:Matlab的文法、python語言、latex的畫圖品質(還可以使用內嵌的latex引擎繪製的數學公式)。
Matplotlib.pyplot快速繪圖
快速繪圖 和 物件導向方式繪圖
matplotlib實際上是一套物件導向的繪圖庫,它所繪製的圖表中的每個繪圖元素,例如線條Line2D、文字Text、刻度等在記憶體中都有一個對象與之對應。
為了方便快速繪圖matplotlib通過pyplot模組提供了一套和MATLAB類似的繪圖API,將眾多繪圖對象所構成的複雜結構隱藏在這套API內部。我們只需要調用pyplot模組所提供的函數就可以實現快速繪圖以及設定圖表的各種細節。pyplot模組雖然用法簡單,但不適合在較大的應用程式中使用。
為了將物件導向的繪圖庫封裝成只使用函數的調用介面,pyplot模組的內部儲存了當前圖表以及當前子圖等資訊。當前的圖表和子圖可以使用plt.gcf()和plt.gca()獲得,分別表示"Get Current Figure"和"Get Current Axes"。在pyplot模組中,許多函數都是對當前的Figure或Axes對象進行處理,比如說:
plt.plot()實際上會通過plt.gca()獲得當前的Axes對象ax,然後再調用ax.plot()方法實現真正的繪圖。
可以在Ipython中輸入類似"plt.plot??"的命令查看pyplot模組的函數是如何對各種繪圖對象進行封裝的。
配置屬性
matplotlib所繪製的圖表的每個組成部分都和一個對象對應,我們可以通過調用這些對象的屬性設定方法set_*()或者pyplot模組的屬性設定函數setp()設定它們的屬性值。
因為matplotlib實際上是一套物件導向的繪圖庫,因此也可以直接擷取對象的屬性
設定檔
繪製一幅圖需要對許多個物件的屬性進行配置,例如顏色、字型、線型等等。我們在繪圖時,並沒有逐一對這些屬性進行配置,許多都直接採用了matplotlib的預設配置。
matplotlib將這些預設配置儲存在一個名為“matplotlibrc”的設定檔中,通過修改設定檔,我們可以修改圖表的預設樣式。設定檔的讀入可以使用rc_params(),它返回一個配置字典;在matplotlib模組載入時會調用rc_params(),並把得到的配置字典儲存到rcParams變數中;matplotlib將使用rcParams字典中的配置進行繪圖;使用者可以直接修改此字典中的配置,所做的改變會反映到此後建立的繪圖元素。
繪製多子圖(快速繪圖)
Matplotlib 裡的常用類的內含項目關聯性為 Figure -> Axes -> (Line2D, Text, etc.)一個Figure對象可以包含多個子圖(Axes),在matplotlib中用Axes對象表示一個繪圖區域,可以理解為子圖。
可以使用subplot()快速繪製包含多個子圖的圖表,它的調用形式如下:
subplot(numRows, numCols, plotNum)
subplot將整個繪圖區域等分為numRows行* numCols列個子領域,然後按照從左至右,從上到下的順序對每個子領域進行編號,左上的子領域的編號為1。如果numRows,numCols和plotNum這三個數都小於10的話,可以把它們縮寫為一個整數,例如subplot(323)和subplot(3,2,3)是相同的。subplot在plotNum指定的地區中建立一個軸對象。如果新建立的軸和之前建立的軸重疊的話,之前的軸將被刪除。
subplot()返回它所建立的Axes對象,我們可以將它用變數儲存起來,然後用sca()交替讓它們成為當前Axes對象,並調用plot()在其中繪圖。
繪製多圖表(快速繪圖)
如果需要同時繪製多幅圖表,可以給figure()傳遞一個整數參數指定Figure對象的序號,如果序號所指定的Figure對象已經存在,將不建立新的對象,而只是讓它成為當前的Figure對象。
import numpy as np
import matplotlib.pyplot as plt
plt.figure(1) # 建立圖表1
plt.figure(2) # 建立圖表2
ax1 = plt.subplot(211) # 在圖表2中建立子圖1
ax2 = plt.subplot(212) # 在圖表2中建立子圖2
x = np.linspace(0, 3, 100)
for i in xrange(5):
plt.figure(1) #❶ # 選擇圖表1
plt.plot(x, np.exp(i*x/3))
plt.sca(ax1) #❷ # 選擇圖表2的子圖1
plt.plot(x, np.sin(i*x))
plt.sca(ax2) # 選擇圖表2的子圖2
plt.plot(x, np.cos(i*x))
plt.show()
在圖表中顯示中文
matplotlib的預設設定檔中所使用的字型無法正確顯示中文。為了讓圖表能正確顯示中文,可以有幾種解決方案。 在程式中直接指定字型。 在程式開頭修改配置字典rcParams。 修改設定檔。
物件導向畫圖
matplotlib API包含有三層,Artist層處理所有的高層結構,例如處理圖表、文字和曲線等的繪製和布局。通常我們只和Artist打交道,而不需要關心底層的繪製細節。
直接使用Artists建立圖表的標準流程如下: 建立Figure對象 用Figure對象建立一個或者多個Axes或者Subplot對象 調用Axies等對象的方法建立各種簡單類型的Artists
import matplotlib.pyplot as plt
X1 = range(0, 50)
Y1 = [num**2 for num in X1] # y = x^2
X2 = [0, 1]
Y2 = [0, 1] # y = x
Fig = plt.figure(figsize=(8,4)) # Create a `figure' instance
Ax = Fig.add_subplot(111) # Create a `axes' instance in the figure
Ax.plot(X1, Y1, X2, Y2) # Create a Line2D instance in the axes
Fig.show()
Fig.savefig("test.pdf")
參考:
《Python科學計算》(Numpy視頻) matplotlib-繪製精美的圖表(快速繪圖)(物件導向繪圖)(深入淺出適合系統學習)
什麼是 Matplotlib (主要講物件導向繪圖,對於新手可能有點亂)
Matplotlib.pylab快速繪圖
matplotlib還提供了一個名為pylab的模組,其中包括了許多NumPy和pyplot模組中常用的函數,方便使用者快速進行計算和繪圖,十分適合在IPython互動式環境中使用。這裡使用下面的方式載入pylab模組:
>>> import pylab as pl
1 安裝numpy和matplotlib
>>> import numpy
>>> numpy.__version__
>>> import matplotlib
>>> matplotlib.__version__
2 兩種常用圖類型:Line and scatter plots(使用plot()命令), histogram(使用hist()命令)
2.1 折線圖&散佈圖 Line and scatter plots
2.1.1 折線圖 Line plots(關聯一組x和y值的直線)
import numpy as np
import pylab as pl
x = [1, 2, 3, 4, 5]# Make an array of x values
y = [1, 4, 9, 16, 25]# Make an array of y values for each x value
pl.plot(x, y)# use pylab to plot x and y
pl.show()# show the plot on the screen
2.1.2 散佈圖 Scatter plots
把pl.plot(x, y)改成pl.plot(x, y, 'o')即可,下圖的藍色版本
2.2 美化 Making things look pretty
2.2.1 線條顏色 Changing the line color
紅色:把pl.plot(x, y, 'o')改成pl.plot(x, y, ’or’)
2.2.2 線條樣式 Changing the line style
虛線:plot(x,y, '--')
2.2.3 marker樣式 Changing the marker style
藍色星型markers:plot(x,y, ’b*’)
2.2.4 圖和軸標題以及軸座標限度 Plot and axis titles and limits
import numpy as np
import pylab as pl
x = [1, 2, 3, 4, 5]# Make an array of x values
y = [1, 4, 9, 16, 25]# Make an array of y values for each x value
pl.plot(x, y)# use pylab to plot x and y
pl.title(’Plot of y vs. x’)# give plot a title
pl.xlabel(’x axis’)# make axis labels
pl.ylabel(’y axis’)
pl.xlim(0.0, 7.0)# set axis limits
pl.ylim(0.0, 30.)
pl.show()# show the plot on the screen
2.2.5 在一個座標繫上繪製多個圖 Plotting more than one plot on the same set of axes
做法是很直接的,依次作圖即可:
import numpy as np
import pylab as pl
x1 = [1, 2, 3, 4, 5]# Make x, y arrays for each graph
y1 = [1, 4, 9, 16, 25]
x2 = [1, 2, 4, 6, 8]
y2 = [2, 4, 8, 12, 16]
pl.plot(x1, y1, ’r’)# use pylab to plot x and y
pl.plot(x2, y2, ’g’)
pl.title(’Plot of y vs. x’)# give plot a title
pl.xlabel(’x axis’)# make axis labels
pl.ylabel(’y axis’)
pl.xlim(0.0, 9.0)# set axis limits
pl.ylim(0.0, 30.)
pl.show()# show the plot on the screen
2.2.6 圖例 Figure legends
pl.legend((plot1, plot2), (’label1, label2’), 'best’, numpoints=1)
其中第三個參數表示圖例放置的位置:'best’‘upper right’, ‘upper left’, ‘center’, ‘lower left’, ‘lower right’.
如果在當前figure裡plot的時候已經指定了label,如plt.plot(x,z,label="$cos(x^2)$"),直接調用plt.legend()就可以了哦。
import numpy as np
import pylab as pl
x1 = [1, 2, 3, 4, 5]# Make x, y arrays for each graph
y1 = [1, 4, 9, 16, 25]
x2 = [1, 2, 4, 6, 8]
y2 = [2, 4, 8, 12, 16]