日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python中的Matplotlib模塊入門教程

系統(tǒng) 1761 0

1 關(guān)于 Matplotlib 模塊

Matplotlib 是一個(gè)由 John Hunter 等開發(fā)的,用以繪制二維圖形的 Python 模塊。它利用了 Python 下的數(shù)值計(jì)算模塊 Numeric 及 Numarray,克隆了許多 Matlab 中的函數(shù), 用以幫助用戶輕松地獲得高質(zhì)量的二維圖形。Matplotlib 可以繪制多種形式的圖形包括普通的線圖,直方圖,餅圖,散點(diǎn)圖以及誤差線圖等;可以比較方便的定制圖形的各種屬性比如圖線的類型,顏色,粗細(xì),字體的大小等;它能夠很好地支持一部分 TeX 排版命令,可以比較美觀地顯示圖形中的數(shù)學(xué)公式。Matplotlib 掌握起來(lái)也很容易,由于 Matplotlib 使用的大部分函數(shù)都與 Matlab 中對(duì)應(yīng)的函數(shù)同名,且各種參數(shù)的含義,使用方法也一致,這就使得熟悉 Matlab 的用戶使用起來(lái)感到得心應(yīng)手。對(duì)那些不熟悉的 Matlab 的用戶而言,這些函數(shù)的意義往往也是一目了然的,因此只要花很少的時(shí)間就可以掌握。

Matplotlib 目前包含了37個(gè)不同的模塊, 如 matlab, mathtext, finance, dates

等等,其中與繪圖關(guān)系最直接的是 matlab 模塊。可以用下面的命令裝載并查看它提供的函數(shù)

            
>>> import matplotlib.matlab
>>> dir(matplotlib.matlab)


          

如果要了解模塊中某個(gè)函數(shù)的使用方法,可以使用 help 命令。如下面的命令

            
>>> help(legend)
>>> help(plot)


          

會(huì)返回 legend 和 plot 這兩個(gè)函數(shù)的信息。

本文擬通過(guò)一些實(shí)例來(lái)說(shuō)明 matplotlib 的這些主要特點(diǎn)。相信通過(guò)閱讀這些例子,您能對(duì) Matplotlib 的使用有一個(gè)基本的了解。

2 繪制一組冪函數(shù)

先從一個(gè)簡(jiǎn)單的例子開始討論。假設(shè)要在一個(gè)圖形中顯示一組冪函數(shù)。這組冪函數(shù)的基不同,分別為10,自然對(duì)數(shù) e 和2。可以用如下 Python 腳本去描繪這組曲線,生成的圖形如圖1所示。

            
  from matplotlib.matlab import * 
 
 x = linspace(-4, 4, 200) 
 f1 = power(10, x) 
 f2 = power(e, x) 
 f3 = power(2, x) 
 
 plot(x, f1, 'r', x, f2, 'b', x, f3, 'g', linewidth=2) 
 axis([-4, 4, -0.5, 8])
 text(1, 7.5, r'$10^x$', fontsize=16)
 text(2.2, 7.5, r'$e^x$', fontsize=16)
 text(3.2, 7.5, r'$2^x$', fonsize=16)
 title('A simple example', fontsize=16)
 
 savefig('power.png', dpi=75)
 show()


          

圖1: 一組冪函數(shù)

Python中的Matplotlib模塊入門教程_第1張圖片

程序的第一行裝載了 matlab 模塊。接下來(lái)的幾行語(yǔ)句(至 savefig 之前)好像是在運(yùn)行 Matlab 程序,因?yàn)?linspace, power, plot,axis, text, title 這些函數(shù)在 Matlab 中也存在。這個(gè)例子展示了 Matplotlib 中幾個(gè)比較常用的繪圖函數(shù),如 plot,axis,title 等的用法。其中 plot 是一個(gè)功能十分強(qiáng)大的函數(shù), 通過(guò)改變它的參數(shù)選項(xiàng),可以靈活地修改圖形的各種屬性,比如選用的線型,顏色,寬度等。

顯示圖形中的數(shù)學(xué)公式

Matplotlib 可以支持一部分 TeX 的排版指令,因此用戶在繪制含有數(shù)學(xué)公式的圖形時(shí)會(huì)感到很方便并且可以得到比較滿意的顯示效果,所需要的僅僅是一些 TeX 的排版知識(shí)。下面的這個(gè)例子顯示了如何在圖形的不同位置上, 如坐標(biāo)軸標(biāo)簽,圖形的標(biāo)題以及圖形中適當(dāng)?shù)奈恢锰帲@示數(shù)學(xué)公式。相應(yīng)的 Python 程序如下, 生成的圖形見圖2。

from matplotlib.matlab import *
def? f(x, c):
??? m1 = sin(2*pi*x)
??? m2 = exp(-c*x)
return multiply(m1, m2)
x = linspace(0, 4, 100)
sigma = 0.5
plot(x, f(x, sigma), 'r', linewidth=2)
xlabel(r'$\rm{time}? \? t$', fontsize=16)
ylabel(r'$\rm{Amplitude} \ f(x)$', fontsize=16)
title(r'$f(x) \ \rm{is \ damping? \ with} \ x$', fontsize=16)
text(2.0, 0.5, r'$f(x) = \rm{sin}(2 \pi? x^2) e^{\sigma x}$', fontsize=20)
savefig('latex.png', dpi=75)
show()

圖2: 圖形中數(shù)學(xué)公式的顯示

Python中的Matplotlib模塊入門教程_第2張圖片

從程序中可以看出,在 Matplotlib 中進(jìn)行有關(guān)數(shù)學(xué)公式的排版是很簡(jiǎn)單的。與 TeX 排版時(shí)的約定一樣,要插入的公式部分由一對(duì)美元符號(hào) $ 來(lái)進(jìn)行標(biāo)識(shí),而具體的排版命令與 TeX 一樣。在任何可以顯示文本的地方(如軸的標(biāo)簽,標(biāo)題處等)都可以插入需要的公式。需要注意的是,數(shù)學(xué)公式所在的字符串開始之處有一個(gè)標(biāo)記 r,表示該字符串是一個(gè) raw string。這是因?yàn)榕虐婀綍r(shí),字符串所包含的內(nèi)容必須按照 TeX 的規(guī)范,而不是其他的規(guī)范,來(lái)進(jìn)行解析。所以使用 raw string 可以避免其它規(guī)則解釋字符串中某些特殊字符所帶來(lái)的歧義。從生成的圖形可以看到,公式顯示的效果是比較美觀的。

3 繪制其他格式的圖形

除了常用的線圖,Matplotlib 還可以繪制其他種類的圖形,如直方圖,餅圖,誤差線圖等等。下面是一個(gè)處理實(shí)驗(yàn)數(shù)據(jù)的例子。它用直方圖的形式比較了實(shí)際測(cè)量電流和理論計(jì)算電流,同時(shí)還顯示了測(cè)量的誤差分布情況。程序首先讀取實(shí)驗(yàn)數(shù)據(jù) current.dat,獲得數(shù)據(jù)后利用函數(shù) bar 進(jìn)行繪圖。

            
from matplotlib.matlab import * 
filename = "d:\\wei\\exp\\current.dat"
X = load(filename)
dp = X[:, 0]
i_mea = X[:, 1]
i_mea_err = X[:, 2]
i_cal = X[:, 3]
i_cal_err = X[:, 4]
width = 3
h1 = bar(dp, i_mea, width, color='r', yerr=i_mea_err)
h2 = bar(dp+width, i_cal, width, color='b', yerr=i_cal_err)
xlabel('Particle diameter (nm)', fontsize=16)
xticks(dp+width, dp)
ylabel('Signal current (nA)', fontsize=16)
title('Measured current vs. calculated current')
legend((h1[0], h2[0]), ('measured current', 'calculated current'), loc=2)
savefig('current.png', dpi=75)
show()


          

圖3 :測(cè)量電流 vs. 計(jì)算電流

Python中的Matplotlib模塊入門教程_第3張圖片

從程序中可以看出,函數(shù) load 極大地方便了數(shù)據(jù)文件的讀取工作(不需要自己寫代碼來(lái)處理數(shù)據(jù)文件了),它的輸出直接被傳遞至函數(shù) bar 中,進(jìn)而完成直方圖和誤差線圖的繪制。

4 GLP 集合計(jì)算結(jié)果的可視化

Python 是一種比較適合用來(lái)進(jìn)行科學(xué)計(jì)算的腳本語(yǔ)言,如果利用了 Numeric 及 Numarray 模塊,它的計(jì)算能力還能得到進(jìn)一步的增強(qiáng)。 Matplotlib 也充分利用了這兩個(gè)模塊,可以高質(zhì)量地完成計(jì)算結(jié)果可視化的工作。下面是一個(gè)計(jì)算和顯示兩維好格子點(diǎn) GLP (Good Lattice Point Set)集合的例子。 GLP 集合是一種用算法產(chǎn)生的偽隨機(jī)數(shù)的集合,它在一些優(yōu)化計(jì)算中很有用,詳細(xì)的介紹可以在參考文獻(xiàn)里找到。下面的 Python 程序先定義了一個(gè)函數(shù) glp(n1, n2) 用以產(chǎn)生需要的 GLP 集合, 接著利用 Matplotlib 來(lái)顯示它的分布情況(應(yīng)該是均勻分布的)。

            
# A two dimensional GLP set 
# with n1=377, n2=610
from matplotlib.matlab import *
def glp(n1, n2):
 q = zeros((2, n2), Float)
 h1 = 1; h2 = n1
 for i in arange(n2-1):
 q[0][ i] = (fmod(h1*(i+1), n2)-0.5)/n2
 q[1][ i] = (fmod(h2*(i+1), n2)-0.5)/n2
 q[0][n2-1] = (n2-0.5)/n2
 q[1][n2-1] = (n2-0.5)/n2
 return q
n1 = 377; n2 = 610
q = glp(n1, n2)
x = q[0, :]
y = q[1, :]
plot(x, y, 'r.', linewidth=2)
axis([0, 1, 0, 1])
title(r'$\rm{GLP \ set \ with} \ n_1 = 377, \ n_2 = 610$')
savefig('glp.png', dpi = 75)
show()


          

圖4: GLP 集合的分布

Python中的Matplotlib模塊入門教程_第4張圖片

最初我們是用 Matlab 來(lái)完成這個(gè)工作的,現(xiàn)在用 Python 來(lái)實(shí)現(xiàn)一樣很簡(jiǎn)潔。程序中函數(shù) glp 的實(shí)現(xiàn)主要是利用了模快 Numeric,計(jì)算得到的結(jié)果用 plot 函數(shù)直接加以顯示,十分方便。這個(gè)例子(包括上一個(gè)例子)顯示了,在利用 Python 進(jìn)行某些科學(xué)及工程計(jì)算時(shí),Matplotlib 往往能簡(jiǎn)潔高效地完成計(jì)算結(jié)果可視化的工作。

5 工作模式及圖形的輸出方式

最后簡(jiǎn)單的介紹一下 Matplotlib 的工作模式以及輸出圖形的方式。Matplotlib 有兩種工作模式:交互模式 (interactive mode) 以及批處理模式 (batch mode)。很容易理解這兩種模式的差別。第一種模式就是在某個(gè) Python Shell 的提示符下逐個(gè)運(yùn)行繪圖的命令。

第二種模式是先把繪圖命令寫成一個(gè)腳本文件然后在適當(dāng)?shù)沫h(huán)境中執(zhí)行這個(gè)文件。 最終圖形的輸出也有兩種方式,即 GUI 輸出方式和非 GUI 輸出方式。簡(jiǎn)單地說(shuō),GUI 方式的輸出是把產(chǎn)生的圖形直接顯示在屏幕上;而非 GUI 方式的輸出則是把圖形保存為某種格式的文件,比如ps,png格式的文件。不論哪一種方式都與系統(tǒng)使用的 backend 有關(guān) (backend 可以理解為后端的繪圖引擎)。與 GUI方式輸出有關(guān)的 backend 包括 WxPython, TkAgg, Tkinter 等。而與非 GUI 方式有關(guān)的 backend 包括 GD, PS,Paint 等。下圖總結(jié)了目前 Matplotlib 支持的主要backend。
圖5: Matplotlib 支持的主要 backend

Python中的Matplotlib模塊入門教程_第5張圖片

用戶可以根據(jù)自己的實(shí)際需要選用其中的某種輸出方式,當(dāng)然也可以兩種同時(shí)使用。以上的幾個(gè)例子都是同時(shí)使用了這兩種方式。以上幾個(gè) Python 腳本的最后一行命令 show 負(fù)責(zé)把圖形在屏幕上顯示出來(lái),而命令 savefig 會(huì)把圖形保存為相應(yīng)格式的文件,目前缺省的輸出格式是 png 格式。

6 總結(jié)

作為一個(gè)仍在進(jìn)行中的項(xiàng)目,Matplotlib 充分利用了 Python 下的 Numeric(Numarray) 模塊,提供了一種利用 Python 進(jìn)行數(shù)據(jù)可視化的解決方案,進(jìn)一步加強(qiáng)了 Python 用來(lái)進(jìn)行科學(xué)計(jì)算的能力。Matplotlib 簡(jiǎn)單易學(xué),它克隆了眾多 Matlab 中的函數(shù),這會(huì)讓了解 Matlab 的用戶受益不少。其他的特點(diǎn)還包括能夠繪制多種類型的圖形,可以簡(jiǎn)單靈活對(duì)圖形的各種屬性進(jìn)行修改,能比較美觀地顯示圖形中的數(shù)學(xué)公式。與其他的一些繪圖程序相比,如 Gnuplot,Matplotlib 的一個(gè)吸引人之處就是輸出圖形的質(zhì)量較高。不足之處是 Matplotlib 的功能目前還不是很完善, 比如目前還不能支持三維繪圖,對(duì) TeX 排版的支持還不充分等等。不過(guò)考慮到它是一個(gè)還在進(jìn)行中的項(xiàng)目,這些就不應(yīng)求全責(zé)備了。總的說(shuō)來(lái),如果您需要一種可視化的工具,并且希望它能有高質(zhì)量的輸出效果,那么 Python 的 Matplotlib 模塊應(yīng)該是一個(gè)值得考慮的選擇。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 峨边| 潼关县| 临泽县| 鄢陵县| 曲阜市| 新干县| 江安县| 黄陵县| 合山市| 哈巴河县| 察雅县| 东乡县| 延川县| 莱西市| 日喀则市| 洞口县| 新源县| 安龙县| 怀安县| 尤溪县| 江口县| 嘉峪关市| 海盐县| 招远市| 象山县| 柏乡县| 屏东市| 五大连池市| 临沂市| 三明市| 忻州市| 报价| 离岛区| 华宁县| 呈贡县| 三明市| 谢通门县| 平潭县| 留坝县| 巴彦淖尔市| 新泰市|