Python的繪圖庫matplotlib快速入門_第1頁
Python的繪圖庫matplotlib快速入門_第2頁
Python的繪圖庫matplotlib快速入門_第3頁
Python的繪圖庫matplotlib快速入門_第4頁
Python的繪圖庫matplotlib快速入門_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Python的繪圖庫matplotlib快速入門1現(xiàn)在是1頁\一共有81頁\編輯于星期一2Matplotlib—繪制精美的圖表現(xiàn)在是2頁\一共有81頁\編輯于星期一matplotlib是python最著名的繪圖庫,它提供了一整套和matlab相似的命令A(yù)PI,十分適合交互式地進(jìn)行制圖。而且也可以方便地將它作為繪圖控件,嵌入GUI應(yīng)用程序中。它的文檔相當(dāng)完備,并且Gallery頁面中有上百幅縮略圖,打開之后都有源程序。因此如果你需要繪制某種類型的圖,只需要在這個(gè)頁面中瀏覽/復(fù)制/粘貼一下,基本上都能搞定。

展示頁面的地址:3現(xiàn)在是3頁\一共有81頁\編輯于星期一快速繪圖快速繪圖matplotlib的pyplot子庫提供了和matlab類似的繪圖API,方便用戶快速繪制2D圖表。(matplotlib_simple_plot.py)

pylab模塊matplotlib還提供了名為pylab的模塊,其中包括了許多numpy和pyplot中常用的函數(shù),方便用戶快速進(jìn)行計(jì)算和繪圖,可以用于IPython中的快速交互式使用。

4現(xiàn)在是4頁\一共有81頁\編輯于星期一快速繪圖matplotlib中的快速繪圖的函數(shù)庫可以通過如下語句載入:接下來調(diào)用figure創(chuàng)建一個(gè)繪圖對(duì)象,并且使它成為當(dāng)前的繪圖對(duì)象。通過figsize參數(shù)可以指定繪圖對(duì)象的寬度和高度,單位為英寸;dpi參數(shù)指定繪圖對(duì)象的分辨率,即每英寸多少個(gè)像素,缺省值為80。因此本例中所創(chuàng)建的圖表窗口的寬度為8*80=640像素。5importmatplotlib.pyplotaspltplt.figure(figsize=(8,4))現(xiàn)在是5頁\一共有81頁\編輯于星期一快速繪圖也可以不創(chuàng)建繪圖對(duì)象直接調(diào)用接下來的plot函數(shù)直接繪圖,matplotlib會(huì)自動(dòng)創(chuàng)建一個(gè)繪圖對(duì)象。

如果需要同時(shí)繪制多幅圖表的話,可以是給figure傳遞一個(gè)整數(shù)參數(shù)指定圖標(biāo)的序號(hào),如果所指定序號(hào)的繪圖對(duì)象已經(jīng)存在的話,將不創(chuàng)建新的對(duì)象,而只是讓它成為當(dāng)前繪圖對(duì)象。下面的兩行程序通過調(diào)用plot函數(shù)在當(dāng)前的繪圖對(duì)象中進(jìn)行繪圖:6plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)plt.plot(x,z,"b--",label="$cos(x^2)$")現(xiàn)在是6頁\一共有81頁\編輯于星期一快速繪圖plot函數(shù)的調(diào)用方式很靈活,第一句將x,y數(shù)組傳遞給plot之后,用關(guān)鍵字參數(shù)指定各種屬性:?label:給所繪制的曲線一個(gè)名字,此名字在圖示(legend)中顯示。只要在字符串前后添加''$''符號(hào),matplotlib就會(huì)使用其內(nèi)嵌的latex引擎繪制的數(shù)學(xué)公式。?color:指定曲線的顏色?linewidth:指定曲線的寬度第三個(gè)參數(shù)‘’b--``指定曲線的顏色和線型7plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)plt.plot(x,z,"b--",label="$cos(x^2)$“)現(xiàn)在是7頁\一共有81頁\編輯于星期一快速繪圖接下來通過一系列函數(shù)設(shè)置繪圖對(duì)象的各個(gè)屬性:?xlabel/ylabel:設(shè)置X軸/Y軸的文字?title:設(shè)置圖表的標(biāo)題?ylim:設(shè)置Y軸的范圍?legend:顯示圖示最后調(diào)用plt.show()顯示出創(chuàng)建的所有繪圖對(duì)象。8plt.xlabel("Time(s)")plt.ylabel("Volt")plt.title("PyPlotFirstExample")plt.ylim(-1.2,1.2)plt.legend()現(xiàn)在是8頁\一共有81頁\編輯于星期一快速繪圖

9importnumpyasnpimportmatplotlib.pyplotasplt

x=np.linspace(0,10,1000)y=np.sin(x)z=np.cos(x**2)

plt.figure(figsize=(8,4))plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)plt.plot(x,z,"b--",label="$cos(x^2)$")plt.xlabel("Time(s)")plt.ylabel("Volt")plt.title("PyPlotFirstExample")plt.ylim(-1.2,1.2)plt.legend()plt.show()現(xiàn)在是9頁\一共有81頁\編輯于星期一快速繪圖10現(xiàn)在是10頁\一共有81頁\編輯于星期一快速繪圖還可以調(diào)用plt.savefig()將當(dāng)前的Figure對(duì)象保存成圖像文件,圖像格式由圖像文件的擴(kuò)展名決定。下面的程序?qū)?dāng)前的圖表保存為“test.png”,并且通過dpi參數(shù)指定圖像的分辨率為120,因此輸出圖像的寬度為“8X120=960”個(gè)像素。實(shí)際上不需要調(diào)用show()顯示圖表,可以直接用savefig()將圖表保存成圖像文件.使用這種方法可以很容易編寫出批量輸出圖表的程序.11runmatplotlib_simple_plot.pyplt.savefig("test.png",dpi=120)現(xiàn)在是11頁\一共有81頁\編輯于星期一快速繪圖繪制多軸圖一個(gè)繪圖對(duì)象(figure)可以包含多個(gè)軸(axis),在Matplotlib中用軸表示一個(gè)繪圖區(qū)域,可以將其理解為子圖。上面的第一個(gè)例子中,繪圖對(duì)象只包括一個(gè)軸,因此只顯示了一個(gè)軸(子圖(Axes))??梢允褂胹ubplot函數(shù)快速繪制有多個(gè)軸的圖表。subplot函數(shù)的調(diào)用形式如下:12subplot(numRows,numCols,plotNum)現(xiàn)在是12頁\一共有81頁\編輯于星期一快速繪圖subplot將整個(gè)繪圖區(qū)域等分為numRows行和numCols列個(gè)子區(qū)域,然后按照從左到右,從上到下的順序?qū)γ總€(gè)子區(qū)域進(jìn)行編號(hào),左上的子區(qū)域的編號(hào)為1。如果numRows,numCols和plotNum這三個(gè)數(shù)都小于10的話,可以把它們縮寫為一個(gè)整數(shù),例如subplot(323)和subplot(3,2,3)是相同的。subplot在plotNum指定的區(qū)域中創(chuàng)建一個(gè)軸對(duì)象。如果新創(chuàng)建的軸和之前創(chuàng)建的軸重疊的話,之前的軸將被刪除。13現(xiàn)在是13頁\一共有81頁\編輯于星期一快速繪圖下面的程序創(chuàng)建3行2列共6個(gè)軸,通過axisbg參數(shù)給每個(gè)軸設(shè)置不同的背景顏色。如果希望某個(gè)軸占據(jù)整個(gè)行或者列的話,可以如下調(diào)用subplot:14foridx,colorinenumerate("rgbyck"):plt.subplot(320+idx+1,axisbg=color)plt.show()plt.subplot(221)#第一行的左圖plt.subplot(222)#第一行的右圖plt.subplot(212)#第二整行plt.show()現(xiàn)在是14頁\一共有81頁\編輯于星期一快速繪圖當(dāng)繪圖對(duì)象中有多個(gè)軸的時(shí)候,可以通過工具欄中的ConfigureSubplots按鈕,交互式地調(diào)節(jié)軸之間的間距和軸與邊框之間的距離。如果希望在程序中調(diào)節(jié)的話,可以調(diào)用subplots_adjust函數(shù),它有l(wèi)eft,right,bottom,top,wspace,hspace等幾個(gè)關(guān)鍵字參數(shù),這些參數(shù)的值都是0到1之間的小數(shù),它們是以繪圖區(qū)域的寬高為1進(jìn)行正規(guī)化之后的坐標(biāo)或者長度。15現(xiàn)在是15頁\一共有81頁\編輯于星期一快速繪圖

subplot()返回它所創(chuàng)建的Axes對(duì)象,可以將它用變量保存起來,然后用sca()交替讓它們成為當(dāng)前Axes對(duì)象,并調(diào)用plot()在其中繪圖。如果需要同時(shí)繪制多幅圖表,可以給figure()傳遞一個(gè)整數(shù)參數(shù)指定Figure對(duì)象的序號(hào),如果序號(hào)所指定的figure對(duì)象已經(jīng)存在,將不創(chuàng)建新的對(duì)象,而只是讓它成為當(dāng)前的Figure對(duì)象。下面的程序演示了如何依次在不同圖表的不同子圖中繪制曲線。(matplotlib_multi_figure.py)16現(xiàn)在是16頁\一共有81頁\編輯于星期一快速繪圖首先通過figure()創(chuàng)建了兩個(gè)圖表,它們的序號(hào)分別為1和2。然后在圖表2中創(chuàng)建了上下并排的兩個(gè)子圖,并用變量ax1和ax2保存。17importnumpyasnpimportmatplotlib.pyplotaspltplt.figure(1)#創(chuàng)建圖表1plt.figure(2)#創(chuàng)建圖表2ax1=plt.subplot(211)#在圖表2中創(chuàng)建子圖1ax2=plt.subplot(212)#在圖表2中創(chuàng)建子圖2x=np.linspace(0,3,100)現(xiàn)在是17頁\一共有81頁\編輯于星期一快速繪圖在循環(huán)中,先調(diào)用figure(1)讓圖表1成為當(dāng)前圖表,并在其中繪圖。然后調(diào)用sca(ax1)和sca(ax2)分別讓子圖ax1和ax2成為當(dāng)前子圖,并在其中繪圖。當(dāng)它們成為當(dāng)前子圖時(shí),包含它們的圖表2也自動(dòng)成為當(dāng)前圖表,因此不需要調(diào)用figure(2)依次在圖表1和圖表2的兩個(gè)子圖之間切換,逐步在其中添加新的曲線

18foriinxrange(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()現(xiàn)在是18頁\一共有81頁\編輯于星期一快速繪圖

19現(xiàn)在是19頁\一共有81頁\編輯于星期一快速繪圖坐標(biāo)軸設(shè)定

Axis容器包括坐標(biāo)軸的刻度線、刻度標(biāo)簽、坐標(biāo)網(wǎng)格以及坐標(biāo)軸標(biāo)題等內(nèi)容??潭劝ㄖ骺潭群透笨潭?,分別通過get_major_ticks()和get_minor_ticks()方法獲得。每個(gè)刻度線都是一個(gè)XTick或YTick對(duì)象,它包括實(shí)際的刻度線和刻度標(biāo)簽。為了方便訪問刻度線和文本,Axis對(duì)象提供了get_ticklabels()和get_ticklines()方法,可以直接獲得刻度標(biāo)簽和刻度線。下面例子進(jìn)行繪圖并得到當(dāng)前子圖的X軸對(duì)象axis:20>>>plt.plot([1,2,3],[4,5,6])>>>plt.show()>>>axis=plt.gca().xaxis現(xiàn)在是20頁\一共有81頁\編輯于星期一快速繪圖獲得axis對(duì)象的刻度位置列表:下面獲得axis對(duì)象的刻度標(biāo)簽以及標(biāo)簽中的文字:21>>>axis.get_ticklocs()array([1.,1.5,2.,2.5,3.])>>>axis.get_ticklabels()#獲得刻度標(biāo)簽列表<alistof5Textmajorticklabelobjects>>>>[x.get_text()forxinaxis.get_ticklabels()]#獲得刻度的文本字符串[u'1.0',u'1.5',u'2.0',u'2.5',u'3.0‘]

現(xiàn)在是21頁\一共有81頁\編輯于星期一快速繪圖22現(xiàn)在是22頁\一共有81頁\編輯于星期一快速繪圖下面獲得X軸上表示主刻度線的列表,可看到X軸上共有10條刻度線由于沒有副刻度線,因此副刻度線列表的長度為0:使用pyplot模塊中的xticks()能夠完成X軸上刻度標(biāo)簽的配置:

23>>>

axis.get_ticklines()<alistof10Line2Dticklinesobjects>>>>axis.get_ticklines(minor=True)#獲得副刻度線列表<alistof0Line2Dticklinesobjects>>>>plt.xticks(fontsize=16,color="red",rotation=45)現(xiàn)在是23頁\一共有81頁\編輯于星期一快速繪圖上面的例子中副刻度線列表為空,這是因?yàn)橛糜谟?jì)算副刻度位置的對(duì)象默認(rèn)為NullLocator,它不產(chǎn)生任何刻度線。而計(jì)算主刻度位置的對(duì)象為AutoLocator,它會(huì)根據(jù)當(dāng)前的縮放等配置自動(dòng)計(jì)算刻度的位置.

matplotlib提供了多種配置刻度線位置的Locator類,以及控制刻度標(biāo)簽顯示的Formatter類。下面的程序設(shè)置X軸的主刻度為π/4,副刻度為π/20,并且主刻度上的標(biāo)簽用數(shù)學(xué)符號(hào)顯示π。(matplotlib_axis_text.py自定義坐標(biāo)軸的刻度和文字)24現(xiàn)在是24頁\一共有81頁\編輯于星期一快速繪圖與刻度定位和文本格式化相關(guān)的類都在matplotlib.ticker模塊中定義,程序從中載入了兩個(gè)類:MultipleLocaton,FuncFormatter.

25frommatplotlib.tickerimportMultipleLocator,FuncFormatterimportmatplotlib.pyplotasplfrommatplotlib.tickerimportMultipleLocator,FuncFormatterimportnumpyasnpx=np.arange(0,4*np.pi,0.01)y=np.sin(x)pl.figure(figsize=(8,4))pl.plot(x,y)ax=pl.gca()現(xiàn)在是25頁\一共有81頁\編輯于星期一快速繪圖程序中通過pi_formatter()計(jì)算出刻度值對(duì)應(yīng)的刻度文本.(很繁瑣)26defpi_formatter(x,pos): m=np.round(x/(np.pi/4)) n=4 whilem!=0andm%2==0:m,n=m//2,n//2 ifm==0: return"0" ifm==1andn==1: return"$\pi$" ifn==1: returnr"$%d\pi$"%m ifm==1: returnr"$\frac{\pi}{%d}$"%n returnr"$\frac{%d\pi}{%d}$"%(m,n)現(xiàn)在是26頁\一共有81頁\編輯于星期一快速繪圖

27>>>X=np.linspace(0,4*np.pi,17,endpoint=True)>>>Xarray([0.,0.78539816,1.57079633,2.35619449,3.14159265,3.92699082,4.71238898,5.49778714,6.28318531,7.06858347,7.85398163,8.6393798,9.42477796,10.21017612,10.99557429,11.78097245,12.56637061])>>>plt.xticks([0.,0.78539816,1.57079633,2.35619449,3.14159265,3.92699082,4.71238898,5.49778714,6.28318531,7.06858347,7.85398163,8.6393798,9.42477796,10.21017612,10.99557429,11.78097245,12.56637061],[r'$0$',r'$\pi/4$',r'$\pi/2$',r'$3\pi/4$',r'$\pi$',r'$5\pi/4$',r'$3\pi/2$',r'$7\pi/4$',r'$2\pi$',r'$9\pi/4$',r'$5\pi/2$',r'$11\pi/4$',r'$3\pi$',r'$13\pi/4$',r'$7\pi/2$',r'$15\pi/4$',r'$4\pi$'])#r'$\frac{2\pi}{3}$',現(xiàn)在是27頁\一共有81頁\編輯于星期一快速繪圖以指定值的整數(shù)倍為刻度放置主、副刻度線。

使用指定的函數(shù)計(jì)算刻度文本,它會(huì)將刻度值和刻度的序號(hào)作為參數(shù)傳遞給計(jì)算刻度文本的函數(shù).28#設(shè)置兩個(gè)坐標(biāo)軸的范圍pl.ylim(-1.5,1.5)pl.xlim(0,np.max(x))

現(xiàn)在是28頁\一共有81頁\編輯于星期一快速繪圖

29pl.subplots_adjust(bottom=0.15)#設(shè)置圖的底邊距

pl.grid()#開啟網(wǎng)格

#主刻度為pi/4#主刻度文本用pi_formatter函數(shù)計(jì)算#副刻度為pi/20#設(shè)置刻度文本的大小pl.show()現(xiàn)在是29頁\一共有81頁\編輯于星期一快速繪圖

30現(xiàn)在是30頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介對(duì)數(shù)坐標(biāo)圖前面介紹過如何使用plot()繪制曲線圖,所繪制圖表的X-Y軸坐標(biāo)都是算術(shù)坐標(biāo)。下面看看如何在對(duì)數(shù)坐標(biāo)系中繪圖。繪制對(duì)數(shù)坐標(biāo)圖的函數(shù)有三個(gè):semilogx()、semilogy()和loglog(),它們分別繪制X軸為對(duì)數(shù)坐標(biāo)、Y軸為對(duì)數(shù)坐標(biāo)以及兩個(gè)軸都為對(duì)數(shù)坐標(biāo)時(shí)的圖表。

31現(xiàn)在是31頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介下面的程序使用4種不同的坐標(biāo)系繪制低通濾波器的頻率響應(yīng)曲線。其中,左上圖為plot()繪制的算術(shù)坐標(biāo)系,右上圖為semilogx()繪制的X軸對(duì)數(shù)坐標(biāo)系,左下圖為semilogy()繪制的Y軸對(duì)數(shù)坐標(biāo)系,右下圖為loglog()繪制的雙對(duì)數(shù)坐標(biāo)系。使用雙對(duì)數(shù)坐標(biāo)系表示的頻率響應(yīng)曲線通常被稱為波特圖。(matplotlib_log.py)

32importnumpyasnpimportmatplotlib.pyplotaspltw=np.linspace(0.1,1000,1000)p=np.abs(1/(1+0.1j*w))#計(jì)算低通濾波器的頻率響應(yīng)現(xiàn)在是32頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介33plt.subplot(221)plt.plot(w,p,linewidth=2)plt.ylim(0,1.5)

plt.subplot(222)plt.semilogx(w,p,linewidth=2)plt.ylim(0,1.5)

plt.subplot(223)plt.semilogy(w,p,linewidth=2)plt.ylim(0,1.5)

plt.subplot(224)plt.loglog(w,p,linewidth=2)plt.ylim(0,1.5)

plt.show()現(xiàn)在是33頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介

34現(xiàn)在是34頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介極坐標(biāo)圖

極坐標(biāo)系是和笛卡爾(X-Y)坐標(biāo)系完全不同的坐標(biāo)系,極坐標(biāo)系中的點(diǎn)由一個(gè)夾角和一段相對(duì)中心點(diǎn)的距離來表示。下面的程序繪制極坐標(biāo)圖,(matplotlib_polar.py)。

35importnumpyasnpimportmatplotlib.pyplotasplt

theta=np.arange(0,2*np.pi,0.02)現(xiàn)在是35頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介程序中調(diào)用subplot()創(chuàng)建子圖時(shí)通過設(shè)

polar參數(shù)為True,創(chuàng)建一個(gè)極坐標(biāo)子圖。然后調(diào)用plot()在極坐標(biāo)子圖中繪圖。也可以使用polar()直接創(chuàng)建極坐標(biāo)子圖并在其中繪制曲線。

36plt.subplot(121,polar=True)plt.plot(3*theta,theta/3,"--",linewidth=2)現(xiàn)在是36頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介rgrids()設(shè)置同心圓柵格的半徑大小和文字標(biāo)注的角度。因此右圖中的虛線圓圈有三個(gè),半徑分別為0.5、1.0和1.5,這些文字沿著45°線排列。Thetagrids()設(shè)置放射線柵格的角度,因此右圖中只有兩條放射線,角度分別為0°和45°。

37plt.subplot(122,polar=True)plt.rgrids(np.arange(0.5,2,0.5),angle=45)plt.thetagrids([0,45])plt.show()現(xiàn)在是37頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介

38現(xiàn)在是38頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介柱狀圖柱狀圖用其每根柱子的長度表示值的大小,它們通常用來比較兩組或多組值。下面的程序從文件中讀入中國人口的年齡分布數(shù)據(jù),并使用柱狀圖比較男性和女性的年齡分布。(matplotlib_bar.py繪制比較男女人口的年齡分布圖

)39importnumpyasnpimportmatplotlib.pyplotasplt

現(xiàn)在是39頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介

讀入的數(shù)據(jù)中,第0列為年齡,它將作為柱狀圖的橫坐標(biāo)。首先計(jì)算柱狀圖中每根柱子的寬度,因?yàn)橐诿總€(gè)年齡段上繪制兩根柱子,因此柱子的寬度應(yīng)該小于年齡段的二分之一。這里以年齡段的0.4倍作為柱子的寬度。40data=np.loadtxt("china_population.txt")width=(data[1,0]-data[0,0])*0.4現(xiàn)在是40頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介調(diào)用bar()繪制男性人口分布的柱狀圖。它的第一個(gè)參數(shù)為每根柱子左邊緣的橫坐標(biāo),為了讓男性和女性的柱子以年齡刻度為中心,這里讓每根柱子左側(cè)的橫坐標(biāo)為“年齡減去柱子的寬度”。Bar()的第二個(gè)參數(shù)為每根柱子的高度,第三個(gè)參數(shù)指定所有柱子的寬度。當(dāng)?shù)谌齻€(gè)參數(shù)為序列時(shí),可以為每根柱子指定寬度。41plt.figure(figsize=(8,5))plt.bar(data[:,0]-width,data[:,1]/1e7,width,color="b",label=u"男")現(xiàn)在是41頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介

繪制女性人口分布的柱狀圖,這里以年齡為柱子的左邊緣橫坐標(biāo),因此女性和男性的人口分布圖以年齡刻度為中心。由于bar()不自動(dòng)修改顏色,因此程序中通過color參數(shù)設(shè)置兩個(gè)柱狀圖的顏色。

42plt.bar(data[:,0],data[:,2]/1e7,width,color="r",label=u"女")plt.xlim(-width,100)plt.xlabel(u"年齡")plt.ylabel(u"人口(千萬)")plt.legend()

plt.show()現(xiàn)在是42頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介

43現(xiàn)在是43頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介散列圖

使用plot()繪圖時(shí),如果指定樣式參數(shù)為僅繪制數(shù)據(jù)點(diǎn),那么所繪制的就是一幅散列圖。例如:但是這種方法所繪制的點(diǎn)無法單獨(dú)指定顏色和大小。而scatter()所繪制的散列圖卻可以指定每個(gè)點(diǎn)的顏色和大小。下面的程序演示scatter()的用法(matplotlib_scatter.py).44現(xiàn)在是44頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介scatter()的前兩個(gè)參數(shù)是數(shù)組,分別指定每個(gè)點(diǎn)的X軸和Y軸的坐標(biāo)。s參數(shù)指定點(diǎn)的大小,值和點(diǎn)的面積成正比。它可以是一個(gè)數(shù),45importnumpyasnpimportmatplotlib.pyplotasplt

plt.figure(figsize=(8,4))plt.scatter(x,y,s=x*1000,c=y,marker=(5,1),alpha=0.8,lw=2,facecolors="none")plt.xlim(0,1)plt.ylim(0,1)

plt.show()現(xiàn)在是45頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介指定所有點(diǎn)的大?。灰部梢允菙?shù)組,分別對(duì)每個(gè)點(diǎn)指定大小。

c參數(shù)指定每個(gè)點(diǎn)的顏色,可以是數(shù)值或數(shù)組。這里使用一維數(shù)組為每個(gè)點(diǎn)指定了一個(gè)數(shù)值。通過顏色映射表,每個(gè)數(shù)值都會(huì)與一個(gè)顏色相對(duì)應(yīng)。默認(rèn)的顏色映射表中藍(lán)色與最小值對(duì)應(yīng),紅色與最大值對(duì)應(yīng)。當(dāng)c參數(shù)是形狀為(N,3)或(N,4)的二維數(shù)組時(shí),則直接表示每個(gè)點(diǎn)的RGB顏色。marker參數(shù)設(shè)置點(diǎn)的形狀,可以是個(gè)表示形狀的字符串,也可以是表示多邊形的兩個(gè)元素的元組,第一個(gè)元素表示多邊形的邊數(shù),46現(xiàn)在是46頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介第二個(gè)元素表示多邊形的樣式,取值范圍為0、1、2、3。0表示多邊形,1表示星形,2表示放射形,3表示忽略邊數(shù)而顯示為圓形。最后,通過alpha參數(shù)設(shè)置點(diǎn)的透明度,通過lw參數(shù)設(shè)置線寬,lw是linewidth的縮寫。facecolors參數(shù)為“none”時(shí),表示散列點(diǎn)沒有填充色。47現(xiàn)在是47頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介48現(xiàn)在是48頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介圖像imread()和imshow()提供了簡(jiǎn)單的圖像載入和顯示功能.imread()可以從圖像文件讀入數(shù)據(jù),得到一個(gè)表示圖像的NumPy數(shù)組。它的第一個(gè)參數(shù)是文件名或文件對(duì)象,format參數(shù)指定圖像類型,如果省略,就由文件的擴(kuò)展名決定圖像類型。對(duì)于灰度圖像,它返回一個(gè)形狀為(M,N)的數(shù)組;對(duì)于彩色圖像,返冋形狀為(M,N,C)的數(shù)組。其中,M為圖像的高度,N為圖像的寬度,C為3或4,表示圖像的通道數(shù)。49>>>img=plt.imread(“l(fā)ena.jpg“)現(xiàn)在是49頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介下面的程序從“l(fā)ena.jpg”中讀入圖像數(shù)據(jù),得到的數(shù)組img是一個(gè)形狀為(393,512,3)的單字節(jié)無符號(hào)整數(shù)數(shù)組。這是因?yàn)橥ǔJ褂玫膱D像都是采用單字節(jié)分別保存每個(gè)像素的紅、綠、藍(lán)三個(gè)通道的分量:

50>>>img=plt.imread("lena.jpg")>>>img.shape(393L,512L,3L)>>>img.dtypedtype('uint8')

現(xiàn)在是50頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介imshow()可以用來顯示imread()返回的數(shù)組。如果數(shù)組是表示多通道圖像的三維數(shù)組,那么每個(gè)像素的顏色由各個(gè)通道的值決定:

請(qǐng)注意,從JPG圖像中讀入的數(shù)據(jù)是上下顛倒的,為了正常顯示圖像,可以將數(shù)組的第0軸反轉(zhuǎn),或者設(shè)置imshow()的origin參數(shù)為“l(fā)ower”,從而讓所顯示圖表的原點(diǎn)在左下角:51>>>plt.imshow(img)#注意圖像是上下顛倒的>>>plt.imshow(img[::-1])#反轉(zhuǎn)圖像數(shù)組的第0軸#or>>>plt.imshow(img,origin="lower")#讓圖表的原點(diǎn)在左下角現(xiàn)在是51頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介如果三維數(shù)組的元素類型為浮點(diǎn)數(shù),那么元素的取值范圍為0.0到1.0,與顏色值0到255對(duì)應(yīng)。超出這個(gè)范圍可能會(huì)出現(xiàn)顏色異常的像素。下面的例子將數(shù)組img轉(zhuǎn)換為浮點(diǎn)數(shù)組并用imshow()進(jìn)行顯示:52>>>img=img[::-1]>>>plt.imshow(img*1.0)#取值范圍為0.0到255.0的浮點(diǎn)數(shù)組,不能正確顯示顏色>>>plt.imshow(img/255.0)#取值范圍為0.0到1.0的浮點(diǎn)數(shù)組,能正確顯示顏色>>>plt.imshow(np.clip(img/200.0,0,1))#使用clip()限制取值范圍,整個(gè)圖像變亮現(xiàn)在是52頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介如果imshow()的參數(shù)是二維數(shù)組,就使用顏色映射表決定每個(gè)像素的顏色。下面顯示圖像中的紅色通道:顯示效果比較嚇人,因?yàn)槟J(rèn)的圖像映射將最小值映射為藍(lán)色、將最大值映射為紅色.可以使用colorbar()將顏色映射表在圖表中顯示出來:

53>>>plt.imshow(img[:,:,0])>>>plt.colorbar()現(xiàn)在是53頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介通過imshow()的cmap參數(shù)可以修改顯示圖像時(shí)所采用的顏色映射表。顏色映射表是一個(gè)ColorMap對(duì)象,matplotlib中已經(jīng)預(yù)先定義好了很多顏色映射表,可通過下面的語句找到這些顏色映射表的名字:(matplotlib_imshow.py)下面使用名為copper的顏色映射表顯示圖像的紅色通道,很有老照片的味道:

54>>>importmatplotlib.cmascm>>>cm._cmapnames[‘Spectral’,’copper’,‘RdYlGn',‘Set2’,’sumner’,’spring’,’gist_ncar’,…]>>>plt.imshow(img[:,:,0],cmap=cm.copper)現(xiàn)在是54頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介

55importnumpyasnpimportmatplotlib.pyplotaspltimportmatplotlib.cmascmplt.subplots_adjust(0,0,1,1,0.05,0.05)plt.subplot(331)img=plt.imread("lena.jpg")plt.imshow(img)

plt.subplot(332)plt.imshow(img[::-1])

plt.subplot(333)plt.imshow(img,origin="lower")img=img[::-1]plt.subplot(334)plt.imshow(img*1.0)現(xiàn)在是55頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介

56plt.subplot(335)plt.imshow(img/255.0)

plt.subplot(336)plt.imshow(np.clip(img/200.0,0,1))

plt.subplot(325)plt.imshow(img[:,:,0])plt.colorbar()

plt.subplot(326)plt.imshow(img[:,:,0],cmap=cm.copper)plt.colorbar()

foraxinplt.gcf().axes: ax.set_axis_off() ax.set_axis_off()

plt.show()現(xiàn)在是56頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介57現(xiàn)在是57頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介還可以使用imshow()顯示任意的二維數(shù)據(jù),例如下面的程序使用圖像直觀地顯示了二元函數(shù).(matplotlib_2dfunc.py使用imshow()可視化二元函數(shù))

58importnumpyasnpimportmatplotlib.pyplotaspltimportmatplotlib.cmascm

y,x=np.ogrid[-2:2:200j,-2:2:200j]z=x*np.exp(-x**2-y**2)

extent=[np.min(x),np.max(x),np.min(y),np.max(y)]現(xiàn)在是58頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介首先通過數(shù)組的廣播功能計(jì)算出表示函數(shù)值的二維數(shù)組Z,注意它的第0軸表示Y軸、第1軸表示X軸。然后將X、Y軸的取值范圍保存到extent列表中。59plt.figure(figsize=(10,3))plt.subplot(121)plt.imshow(z,extent=extent,origin="lower")plt.colorbar()plt.subplot(122)plt.imshow(z,extent=extent,cmap=cm.gray,origin="lower")plt.colorbar()plt.show()現(xiàn)在是59頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介將extent列表傳遞給imshow()的extent參數(shù),這樣一來,圖表的X、Y軸的刻度標(biāo)簽將使用extent列表所指定的范圍.60現(xiàn)在是60頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介等值線圖還可以使用等值線圖表示二元函數(shù)。所謂等值線,是指由函數(shù)值相等的各點(diǎn)連成的平滑曲線。等值線可以直觀地表示二元函數(shù)值的變化趨勢(shì),例如等值線密集的地方表示函數(shù)值在此處的變化較大。matplotlib中可以使用contour()和contourf()描繪等值線,它們的區(qū)別是:contourf()所得到的是帶填充效果的等值線。(matplotlib_contour.py用contour和contourf描繪等值線圖)

61現(xiàn)在是61頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介

62importnumpyasnpimportmatplotlib.pyplotasplt

y,x=np.ogrid[-2:2:200j,-3:3:300j]z=x*np.exp(-x**2-y**2)

extent=[np.min(x),np.max(x),np.min(y),np.max(y)]

plt.figure(figsize=(10,4))plt.subplot(121)cs=plt.contour(z,10,extent=extent)plt.clabel(cs)plt.subplot(122)plt.contourf(x.reshape(-1),y.reshape(-1),z,20)plt.show()現(xiàn)在是62頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介為了更淸楚地區(qū)分X軸和Y軸,這里讓它們的取值范圍和等分次數(shù)均不相同.這樣得到的數(shù)組z的形狀為(200,300),它的第0軸對(duì)應(yīng)Y軸、第1軸對(duì)應(yīng)X軸。調(diào)用contour()繪制數(shù)組z的等值線圖,第二個(gè)參數(shù)為10,表示將整個(gè)函數(shù)的取值范圍等分為10個(gè)區(qū)間,即顯示的等值線圖中將有9條等值線。和imshow()一樣,可以使用extent參數(shù)指定等值線圖的X軸和Y軸的數(shù)據(jù)范圍。contour()所返回的是一個(gè)QuadContourSet對(duì)象,將它傳遞給clabel(),為其中的等值線標(biāo)上對(duì)應(yīng)的值。63現(xiàn)在是63頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介調(diào)用contourf(),繪制將取值范圍等分為20份、帶填充效果的等值線圖。這里演示了另外一種設(shè)置X、Y軸取值范圍的方法。它的前兩個(gè)參數(shù)分別是計(jì)算數(shù)組z時(shí)所使用的X軸和Y軸上的取樣點(diǎn),這兩個(gè)數(shù)組必須是一維的。64現(xiàn)在是64頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介還可以使用等值線繪制隱函數(shù)曲線.顯然,無法像繪制一般函數(shù)那樣,先創(chuàng)建一個(gè)等差數(shù)組表示變量的取值點(diǎn),然后計(jì)算出數(shù)組中每個(gè)x所對(duì)應(yīng)的y值??梢允褂玫戎稻€解決這個(gè)問題,顯然隱函數(shù)的曲線就是值等于0的那條等值線。下面的程序繪制函數(shù)在f(x,y)=0和f(x,y)-0.1=0時(shí)的曲線.(matplotlib_implicit_func.py)65importnumpyasnpimportmatplotlib.pyplotasplty,x=np.ogrid[-1.5:1.5:200j,-1.5:1.5:200j]f=(x**2+y**2)**4-(x**2-y**2)**2現(xiàn)在是65頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介

66plt.figure(figsize=(9,4))plt.subplot(121)extent=[np.min(x),np.max(x),np.min(y),np.max(y)]cs=plt.contour(f,extent=extent,levels=[0,0.1],colors=["b","r"],linestyles=["solid","dashed"],linewidths=[2,2])plt.subplot(122)forcincs.collections:data=c.get_paths()[0].verticesplt.plot(data[:,0],data[:,1],color=c.get_color()[0],linewidth=c.get_linewidth()[0])

plt.show()現(xiàn)在是66頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介67現(xiàn)在是67頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介在調(diào)用contour()繪制等值線時(shí),可以通過levels參數(shù)指定所繪制等值線對(duì)應(yīng)的函數(shù)值,這里設(shè)置levels參數(shù)為[0,0.1],因此最終將繪制兩條等值線。觀察圖會(huì)發(fā)現(xiàn),表示隱函數(shù)f(x)=0藍(lán)色實(shí)線并不是完全連續(xù)的,在圖的中間部分它由許多孤立的小段構(gòu)成。因?yàn)榈戎稻€在原點(diǎn)附近無限靠近,因此無論對(duì)函數(shù)f的取值空間如何進(jìn)行細(xì)分,總是會(huì)有無法分開的地方,最終造成了圖中的那些孤立的細(xì)小區(qū)域。而表示隱函數(shù)f(x,y)-0.1=0的紅色虛線則是閉合且連續(xù)的。

68現(xiàn)在是68頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介可以通過contour()返回的對(duì)象獲得等值線上每點(diǎn)的數(shù)據(jù),下面在IPython中觀察變量cs,它是一個(gè)QuadContourSet對(duì)象:

cs對(duì)象的collections屬性是一個(gè)等值線列表,每條等值線用一個(gè)LineCollection對(duì)象表示:

69>>>cs.collections

<alistof2mcoll.LineCollectionobjects>>>>runmatplotlib_implicit_func.py>>>cs

現(xiàn)在是69頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介每個(gè)LineCollection對(duì)象都有它自己的顏色、線型、線寬等屬性,注意這些屬性所獲得的結(jié)果外面還有一層封裝,要獲得其第0個(gè)元素才是真正的配置:由類名可知,LineCollection對(duì)象是一組曲線的集合,因此它可以表示像藍(lán)色實(shí)線那樣由多條線構(gòu)成的等值線。它的get_paths()方法獲得構(gòu)成等值線的所有路徑,本例中藍(lán)色實(shí)線70>>>c.get_color()[0]array([1.,0.,0.,1.])>>>c.get_linewidth()[0]2現(xiàn)在是70頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介所表示的等值線由42條路徑構(gòu)成:路徑是一個(gè)Path對(duì)象,通過它的vertices屬性可以獲得路徑上所有點(diǎn)的坐標(biāo):71>>>len(cs.collections[0].get_paths())42>>>path=cs.collections[0].get_paths()[0]>>>type(path)>>>path.verticesarray([[-0.08291457,-0.98938936],[-0.09039269,-0.98743719],…,[-0.08291457,-0.98938936]])現(xiàn)在是71頁\一共有81頁\編輯于星期一繪圖函數(shù)簡(jiǎn)介下面的程序從等值線集合cs中找到表示等值線的路徑,并使用plot()將其繪制出來.72plt.subplot(122)forcincs.collections:data=c.get_paths()[0].verticesplt.plot(data[:,0],data[:,1],color=c.get_color()[0],linewidth=c.ge

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論