前言
matplotlib 是Python最著名的繪圖庫,它提供了一整套和matlab相似的命令API,十分適合交互式地進行制圖。本文將以例子的形式分析matplot中支持的,分析中常用的幾種圖。其中包括填充圖、散點圖(scatter plots)、. 條形圖(bar plots)、等高線圖(contour plots)、 點陣圖和3D圖,下面來一起看看詳細的介紹:
一、填充圖
參考代碼
from matplotlib.pyplot import *x=linspace(-3,3,100)y1=np.sin(x)y2=np.cos(x)fill_between(x,y1,y2,where=(y1>=y2),color='red',alpha=0.25)fill_between(x,y1,y2,where=(y<>y2),color='green',alpha=0.25)plot(x,y1)plot(x,y2)show()
簡要分析
這里主要是用到了fill_between函數(shù)。這個函數(shù)很好理解,就是傳入x軸的數(shù)組和需要填充的兩個y軸數(shù)組;然后傳入填充的范圍,用where=來確定填充的區(qū)域;最后可以加上填充顏色啦,透明度之類修飾的參數(shù)。
當然fill_between函數(shù)還有更加高級的用法,詳見fill_between用法或者help文檔。
效果圖

二、散點圖(scatter plots)
參考代碼
from matplotlib.pyplot import *n = 1024X = np.random.normal(0,1,n)Y = np.random.normal(0,1,n)T = np.arctan2(Y,X)scatter(X,Y, s=75, c=T, alpha=.5)xlim(-1.5,1.5)ylim(-1.5,1.5)show()
簡要分析
首先介紹一下numpy 的normal函數(shù),很明顯,這是生成正態(tài)分布的函數(shù)。這個函數(shù)接受三個參數(shù),分別表示正態(tài)分布的平均值,標準差,還有就是生成數(shù)組的長度。很好記。
然后是arctan2函數(shù),這個函數(shù)接受兩個參數(shù),分別表示y數(shù)組和x數(shù)組,然后返回對應的arctan(y/x)的值,結(jié)果是弧度制。
接下來用到了繪制散點圖的scatter方法,首先當然是傳入x和y數(shù)組,接著s參數(shù)表示scale,即散點的大小;c參數(shù)表示color,我給他傳的是根據(jù)角度劃分的一個數(shù)組,對應的就是每一個點的顏色(雖然不知道是怎么對應的,不過好像是一個根據(jù)數(shù)組內(nèi)其他元素進行的相對的轉(zhuǎn)換,這里不重要了,反正相同的顏色賦一樣的值就好了);最后是alpha參數(shù),表示點的透明度。
至于scatter函數(shù)的高級用法可以參見官方文檔scatter函數(shù)或者help文檔。
最后設(shè)置下坐標范圍就好了。
效果圖

三、條形圖(bar plots)
參考代碼
from matplotlib.pyplot import *n = 12X = np.arange(n)Y1 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)Y2 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)bar(X, +Y1, facecolor='#9999ff', edgecolor='white')bar(X, -Y2, facecolor='#ff9999', edgecolor='white')for x,y in zip(X,Y1): text(x+0.4, y+0.05, '%.2f' % y, ha='center', va= 'bottom')for x,y in zip(X,Y2): text(x+0.4, -y-0.05, '%.2f' % y, ha='center', va= 'top')xlim(-.5,n)xticks([])ylim(-1.25,+1.25)yticks([])show()
簡要分析
注意要手動導入pylab包,否則會找不到bar。。。
首先用numpy的arange函數(shù)生成一個[0,1,2,…,n]的數(shù)組。(用linspace也可以)
其次用numpy的uniform函數(shù)生成一個均勻分布的數(shù)組,傳入三個參數(shù)分別表示下界、上界和數(shù)組長度。并用這個數(shù)組生成需要顯示的數(shù)據(jù)。
然后就是bar函數(shù)的使用了,基本用法也和之前的plot、scatter類似,傳入橫縱坐標和一些修飾性參數(shù)。
接著我們需要用for循環(huán)來為柱狀圖顯示數(shù)字:用python的zip函數(shù)將X和Y1兩兩配對并循環(huán)遍歷,得到每一個數(shù)據(jù)的位置,然后用text函數(shù)在該位置上顯示一個字符串(注意位置上的細節(jié)調(diào)整)。text傳入橫縱坐標,要顯示的字符串,ha參數(shù)制定橫向?qū)R,va參數(shù)制定縱向?qū)R。
最后調(diào)整下坐標范圍,并且取消橫縱坐標上的刻度以保持美觀即可。
至于bar函數(shù)的具體用法可以參照bar函數(shù)用法或者help文檔。
效果圖

四、等高線圖(contour plots)
參考代碼
from matplotlib.pyplot import *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)contourf(X, Y, f(X,Y), 8, alpha=.75, cmap=cm.hot)C = contour(X, Y, f(X,Y), 8, colors='black', linewidth=.5)clabel(C, inline=1, fontsize=10)show()
簡要分析
首先要明確等高線圖是一個三維立體圖,所以我們要建立一個二元函數(shù)f,值由兩個參數(shù)控制,(注意,這兩個參數(shù)都應該是矩陣)。
然后我們需要用numpy的meshgrid函數(shù)生成一個三維網(wǎng)格,即,x軸由第一個參數(shù)指定,y軸由第二個參數(shù)指定。并返回兩個增維后的矩陣,今后就用這兩個矩陣來生成圖像。
接著就用到coutourf函數(shù)了,所謂contourf,大概就是contour fill的意思吧,只填充,不描邊;這個函數(shù)主要是接受三個參數(shù),分別是之前生成的x、y矩陣和函數(shù)值;接著是一個整數(shù),大概就是表示等高線的密度了,有默認值;然后就是透明度和配色問題了,cmap的配色方案這里不多研究。
隨后就是contour函數(shù)了,很明顯,這個函數(shù)是用來描線的。用法可以類似的推出來,不解釋了,需要注意的是他返回一個對象,這個對象一般要保留下來個供后續(xù)的加工細化。
最后就是用clabel函數(shù)來在等高線圖上表示高度了,傳入之前的那個contour對象;然后是inline屬性,這個表示是否清除數(shù)字下面的那條線,為了美觀當然是清除了,而且默認的也是1;再就是指定線的寬度了,不解釋,。
效果圖

五、點陣圖
參考代碼
from matplotlib.pyplot import *def f(x,y): return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)n = 10x = np.linspace(-3,3,3.5*n)y = np.linspace(-3,3,3.0*n)X,Y = np.meshgrid(x,y)Z = f(X,Y)imshow(Z,interpolation='nearest', cmap='bone', origin='lower')colorbar(shrink=.92)show()
簡要分析
這段代碼的目的就是將一個矩陣直接轉(zhuǎn)換為一張像照片一樣的圖,完整的進行顯示。
前面的代碼就是生成一個矩陣Z,不作解釋。
接著用到了imshow函數(shù),傳人Z就可以顯示出一個二維的圖像了,圖像的顏色是根據(jù)元素的值進行的自適應調(diào)整,后面接了一些修飾性的參數(shù),比如配色方案(cmap),零點位置(origin)。
最后用colorbar顯示一個色條,可以不傳參數(shù),這里傳進去shrink參數(shù)用來調(diào)節(jié)他的長度。
效果圖

六、3D圖
參考代碼
import numpy as npfrom pylab import *from mpl_toolkits.mplot3d import Axes3Dfig = figure()ax = Axes3D(fig)X = np.arange(-4, 4, 0.25)Y = np.arange(-4, 4, 0.25)X, Y = np.meshgrid(X, Y)R = np.sqrt(X**2 + Y**2)Z = np.sin(R)ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.cm.hot)ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.cm.hot)ax.set_zlim(-2,2)show()
簡要分析
有點麻煩,需要用到的時候再說吧,不過原理也很簡單,跟等高線圖類似,先畫圖再描線,最后設(shè)置高度,都是一回事。
效果圖

總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家學習或者使用python能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網(wǎng)的支持。
新聞熱點
疑難解答
圖片精選