本文主要翻譯自matplotlib官網
matplotlib.pyplot是一些命令行風格函數的集合,使matplotlib以類似於MATLAB的方式工作。每個pyplot函數對一幅圖片(figure)做一些改動:比如創建新圖片,在圖片創建一個新的作圖區域(plotting area),在一個作圖區域內畫直線,給圖添加標簽(label)等。matplotlib.pyplot是有狀態的,亦即它會保存當前圖片和作圖區域的狀態,新的作圖函數會作用在當前圖片的狀態基礎之上。
import matplotlib.pyplot as plt plt.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show()
上圖的X坐標是1-3,縱坐標是1-4,這是因為如果你只提供給plot()函數一個列表或數組,matplotlib會認為這是一串Y值(Y向量),並且自動生成X值(X向量)。而Python一般是從0開始計數的,所以X向量有和Y向量一樣的長度(此處是4),但是是從0開始,所以X軸的值為[0,1,2,3]。
如果要顯示的制定X軸的坐標,可以像如下一樣:
plt.plot([1,2,3,4],[1,4,9,16])
也可以給plt.plot()函數傳遞多個序列(元組或列表),每兩個序列是一個X,Y向量對,在圖中構成一條曲線,這樣就會在同一個圖里存在多條曲線。
為了區分同一個圖里的多條曲線,可以為每個X,Y向量對指定一個參數來標明該曲線的表現形式,默認的參數是'b-',亦即藍色的直線,如果想用紅色的圓點來表示這條曲線,可以:
import matplotlib.pyplot as plt plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.axis([0,6,0,20])
axis()函數接受形如[xmin,xmax,ymin,ymax]的參數,指定了X,Y軸坐標的范圍。
matplotlib不僅僅可以使用序列(列表和元組)作為參數,還可以使用numpy數組。實際上,所有的序列都被內在的轉化為numpy數組。
import numpy as np import matplotlib.pyplot as plt t=np,arange(0.,5.,0.2) plt.plot(t,t,'r--',t,t**2,'bs',t,t**3,'g^')
控制曲線的屬性
曲線有許多我們可以設置的性質:曲線的寬度,虛線的風格,抗鋸齒等等。有多種設置曲線屬性的方法:
1.使用關鍵詞參數:
plt.plot(x,y,linewidth=2.0)
2.使用Line2D實例的設置(Setter)方法。plot()返回的是曲線的列表,比如line1,line2=plot(x1,y1,x2,y2).我們取得plot()函數返回的曲線之后用Setter方法來設置曲線的屬性。
line,=plt.plot(x,y,'-') line.set)antialliased(False) #關閉抗鋸齒
3.使用setp()命令:
lines=plt.plot(x1,y1,x2,y2) plt.setp(lines,color='r',linewidth=2.0) plt.setp(lines,'color','r','linewidth','2.0')
處理多個圖和Axe
MATLAB和pyplot都有當前圖和當前axe的概念。所有的作圖命令都作用在當前axe。
函數gca()返回當前axe,gcf()返回當前圖。
import numpy as np import matplotlib.pyplot as plt def f(t): return np.exp(-t) * np.cos(2*np.pi*t) t1 = np.arange(0.0, 5.0, 0.1) t2 = np.arange(0.0, 5.0, 0.02) plt.figure(1) plt.subplot(211) plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k') plt.subplot(212) plt.plot(t2, np.cos(2*np.pi*t2), 'r--')
figure()命令是可選的,因為figure(1)會被默認創建,subplot(111)也會被默認創建。subplot()命令會指定numrows,numcols,fignum,其中fignum的取值范圍為從1到numrows*numcols。如果numrows*numcols小於10則subplot()命令中的逗號是可選的。所以subplot(2,1,1)與subplot(211)是完全一樣的。
如果你想手動放置axe,而不是放置在矩形方格內,則可以使用axes()命令,其中的參數為axes([left,bottom,width,height]),每個參數的取值范圍為(0,1)。
你可以使用多個figure()來創建多個圖,每個圖都可以有多個axe和subplot:
import matplotlib.pyplot as plt plt.figure(1) # the first figure plt.subplot(211) # the first subplot in the first figure plt.plot([1,2,3]) plt.subplot(212) # the second subplot in the first figure plt.plot([4,5,6]) plt.figure(2) # a second figure plt.plot([4,5,6]) # creates a subplot(111) by default plt.figure(1) # figure 1 current; subplot(212) still current plt.subplot(211) # make subplot(211) in figure1 current plt.title('Easy as 1,2,3') # subplot 211 title
你可以使用clf()和cla()命令來清空當前figure和當前axe。
如果你創建了許多圖,你需要顯示的使用close()命令來釋放該圖所占用的內存,僅僅關閉顯示在屏幕上的圖是不會釋放內存空間的。
處理文本
text()命令可以用來在任意位置上添加文本,xlabel(),ylabel(),title()可以用來在X軸,Y軸,標題處添加文本。
import numpy as np import matplotlib.pyplot as plt mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) # the histogram of the data n, bins, patches = plt.hist(x, 50, normed=1, facecolor='g', alpha=0.75) plt.xlabel('Smarts') plt.ylabel('Probability') plt.title('Histogram of IQ') plt.text(60, .025, r'$\mu=100,\ \sigma=15$') plt.axis([40, 160, 0, 0.03]) plt.grid(True)
每個text()命令都會返回一個matplotlib.text.Text實例,就像之前處理曲線一樣,你可以通過使用setp()函數來傳遞關鍵詞參數來定制文本的屬性。
t=plt.xlabel('my data',fontsize=14,color='red')
在文本中使用數學表達式
matplotlib在任何文本中都接受Text表達式。
Tex表達式是有兩個dollar符號環繞起來的,比如的Tex表達式如下
plt.title(r'$\sigma_i=15$')
參考文獻:
[1] Pyplot Tutorial