利用matplotlib+numpy繪制多種繪圖的方法實(shí)例
前言
matplotlib 是Python最著名的繪圖庫,它提供了一整套和matlab相似的命令A(yù)PI,十分適合交互式地進(jìn)行制圖。本文將以例子的形式分析matplot中支持的,分析中常用的幾種圖。其中包括填充圖、散點(diǎn)圖(scatter plots)、. 條形圖(bar plots)、等高線圖(contour plots)、 點(diǎn)陣圖和3D圖,下面來一起看看詳細(xì)的介紹:
一、填充圖
參考代碼
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ù)。這個(gè)函數(shù)很好理解,就是傳入x軸的數(shù)組和需要填充的兩個(gè)y軸數(shù)組;然后傳入填充的范圍,用where=
來確定填充的區(qū)域;最后可以加上填充顏色啦,透明度之類修飾的參數(shù)。
當(dāng)然fill_between
函數(shù)還有更加高級(jí)的用法,詳見fill_between用法或者h(yuǎn)elp文檔。
效果圖
二、散點(diǎn)圖(scatter plots)
參考代碼
from matplotlib.pyplot import * n = 1024 X = 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ù)。這個(gè)函數(shù)接受三個(gè)參數(shù),分別表示正態(tài)分布的平均值,標(biāo)準(zhǔn)差,還有就是生成數(shù)組的長度。很好記。
然后是arctan2
函數(shù),這個(gè)函數(shù)接受兩個(gè)參數(shù),分別表示y數(shù)組和x數(shù)組,然后返回對(duì)應(yīng)的arctan(y/x)
的值,結(jié)果是弧度制。
接下來用到了繪制散點(diǎn)圖的scatter
方法,首先當(dāng)然是傳入x和y數(shù)組,接著s參數(shù)表示scale,即散點(diǎn)的大??;c參數(shù)表示color,我給他傳的是根據(jù)角度劃分的一個(gè)數(shù)組,對(duì)應(yīng)的就是每一個(gè)點(diǎn)的顏色(雖然不知道是怎么對(duì)應(yīng)的,不過好像是一個(gè)根據(jù)數(shù)組內(nèi)其他元素進(jìn)行的相對(duì)的轉(zhuǎn)換,這里不重要了,反正相同的顏色賦一樣的值就好了);最后是alpha
參數(shù),表示點(diǎn)的透明度。
至于scatter
函數(shù)的高級(jí)用法可以參見官方文檔scatter函數(shù)或者h(yuǎn)elp文檔。
最后設(shè)置下坐標(biāo)范圍就好了。
效果圖
三、條形圖(bar plots)
參考代碼
from matplotlib.pyplot import * n = 12 X = 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()
簡要分析
注意要手動(dòng)導(dǎo)入pylab包,否則會(huì)找不到bar。。。
首先用numpy的arange
函數(shù)生成一個(gè)[0,1,2,…,n]的數(shù)組。(用linspace也可以)
其次用numpy的uniform
函數(shù)生成一個(gè)均勻分布的數(shù)組,傳入三個(gè)參數(shù)分別表示下界、上界和數(shù)組長度。并用這個(gè)數(shù)組生成需要顯示的數(shù)據(jù)。
然后就是bar函數(shù)的使用了,基本用法也和之前的plot、scatter類似,傳入橫縱坐標(biāo)和一些修飾性參數(shù)。
接著我們需要用for
循環(huán)來為柱狀圖顯示數(shù)字:用python的zip
函數(shù)將X和Y1兩兩配對(duì)并循環(huán)遍歷,得到每一個(gè)數(shù)據(jù)的位置,然后用text
函數(shù)在該位置上顯示一個(gè)字符串(注意位置上的細(xì)節(jié)調(diào)整)。text傳入橫縱坐標(biāo),要顯示的字符串,ha
參數(shù)制定橫向?qū)R,va參數(shù)制定縱向?qū)R。
最后調(diào)整下坐標(biāo)范圍,并且取消橫縱坐標(biāo)上的刻度以保持美觀即可。
至于bar
函數(shù)的具體用法可以參照bar函數(shù)用法或者h(yuǎn)elp文檔。
效果圖
四、等高線圖(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 = 256 x = 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()
簡要分析
首先要明確等高線圖是一個(gè)三維立體圖,所以我們要建立一個(gè)二元函數(shù)f,值由兩個(gè)參數(shù)控制,(注意,這兩個(gè)參數(shù)都應(yīng)該是矩陣)。
然后我們需要用numpy的meshgrid
函數(shù)生成一個(gè)三維網(wǎng)格,即,x軸由第一個(gè)參數(shù)指定,y軸由第二個(gè)參數(shù)指定。并返回兩個(gè)增維后的矩陣,今后就用這兩個(gè)矩陣來生成圖像。
接著就用到coutourf
函數(shù)了,所謂contourf,大概就是contour fill的意思吧,只填充,不描邊;這個(gè)函數(shù)主要是接受三個(gè)參數(shù),分別是之前生成的x、y矩陣和函數(shù)值;接著是一個(gè)整數(shù),大概就是表示等高線的密度了,有默認(rèn)值;然后就是透明度和配色問題了,cmap的配色方案這里不多研究。
隨后就是contour
函數(shù)了,很明顯,這個(gè)函數(shù)是用來描線的。用法可以類似的推出來,不解釋了,需要注意的是他返回一個(gè)對(duì)象,這個(gè)對(duì)象一般要保留下來個(gè)供后續(xù)的加工細(xì)化。
最后就是用clabel函數(shù)來在等高線圖上表示高度了,傳入之前的那個(gè)contour
對(duì)象;然后是inline
屬性,這個(gè)表示是否清除數(shù)字下面的那條線,為了美觀當(dāng)然是清除了,而且默認(rèn)的也是1;再就是指定線的寬度了,不解釋,。
效果圖
五、點(diǎn)陣圖
參考代碼
from matplotlib.pyplot import * def f(x,y): return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2) n = 10 x = 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()
簡要分析
這段代碼的目的就是將一個(gè)矩陣直接轉(zhuǎn)換為一張像照片一樣的圖,完整的進(jìn)行顯示。
前面的代碼就是生成一個(gè)矩陣Z,不作解釋。
接著用到了imshow
函數(shù),傳人Z就可以顯示出一個(gè)二維的圖像了,圖像的顏色是根據(jù)元素的值進(jìn)行的自適應(yīng)調(diào)整,后面接了一些修飾性的參數(shù),比如配色方案(cmap),零點(diǎn)位置(origin)。
最后用colorbar
顯示一個(gè)色條,可以不傳參數(shù),這里傳進(jìn)去shrink
參數(shù)用來調(diào)節(jié)他的長度。
效果圖
六、3D圖
參考代碼
import numpy as np from pylab import * from mpl_toolkits.mplot3d import Axes3D fig = 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()
簡要分析
有點(diǎn)麻煩,需要用到的時(shí)候再說吧,不過原理也很簡單,跟等高線圖類似,先畫圖再描線,最后設(shè)置高度,都是一回事。
效果圖
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用python能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
刪除目錄下相同文件的python代碼(逐級(jí)優(yōu)化)
讓我們來分析一下這個(gè)問題:首先,文件個(gè)數(shù)非常多,手工查找是不現(xiàn)實(shí)的,再說,單憑我們?nèi)庋?,在幾千張圖片里面找到完全相同的難度也是很大的2012-05-05淺談python中np.array的shape( ,)與( ,1)的區(qū)別
今天小編就為大家分享一篇python中np.array的shape ( ,)與( ,1)的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06解決使用export_graphviz可視化樹報(bào)錯(cuò)的問題
今天小編就為大家分享一篇解決使用export_graphviz可視化樹報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08基于Python實(shí)現(xiàn)地標(biāo)景點(diǎn)識(shí)別功能
地標(biāo)景點(diǎn)識(shí)別是一種基于計(jì)算機(jī)視覺技術(shù)的應(yīng)用,旨在通過對(duì)圖像進(jìn)行分析和處理,自動(dòng)識(shí)別出圖片中的地標(biāo)景點(diǎn),本文將介紹地標(biāo)景點(diǎn)識(shí)別的背景和原理,并使用Python編程語言來實(shí)現(xiàn)一個(gè)簡單的地標(biāo)景點(diǎn)識(shí)別系統(tǒng),感興趣的朋友可以參考下2024-01-01