[譯]學習IPython進行交互式計算和數據可視化(五)

第四章:交互式繪圖接口

本章咱們將展現Python的繪圖功能以及如何在IPython中交互式地使用它們。html

NumPy爲處理大量的多維數組結構的數據提供了高效的方法。可是看行行列列的數字總不如直接看曲線圖、散點圖、折線圖、圖片等圖像來的直觀。Matplotlib是一個使用NumPy數據生成高質量圖像的Python包,其包含的內容很是豐富。它提供了和世界上工程與科學領域很是流行的商業軟件atlab很是類似的簡單而高級的繪圖接口。Matplotlib和IPython結合的至關好。python

咱們也會介紹一些圖形用戶接口(GUI)編程方面的內容。全面覆蓋這個豐富的主題遠遠超出了本書的範圍。因此咱們在本章中將只是看一些簡單的示例。下面是本章包含的內容:git

  • 使用Matplotlib繪圖
  • 圖像處理技術
  • 地理地圖
  • GUI簡介
  • 和IPython的事件循環集成進行GUIs的設計和debug

Matplotlib的圖形功能

有大量的Python包能夠用來進行去先繪製,可是截止目前應用最爲普遍的一個是Matplotlib。它是功能最爲完整與強大的一個繪圖庫。它既能夠用於交互式可視化,也能用來生成科學出版的高質量圖像。除此以外,他的高級接口使得它使用起來很是容易。github

在這一節中,咱們將展現Matplotlib提供的一些功能以及怎樣方便地在IPython使用它。算法

開始使用IPython進行交互式可視化

IPython實現了一循環集成系統,這個系統容許從展現命令行接口啓動圖形窗口的同時不阻斷控制檯的使用。這一特色在使用Maplotlib或建立圖形用戶接口的時候很是有用。編程

Matplotlib的使用api

使用事件循環集成機制使得在IPython中能夠交互式地展示圖形。這些圖形能夠經過命令行接口動態地更新。%pylab魔法命令(或在IPython啓動的時候開啓--pylab選項)將會自動地激活這個集成功能。也能夠爲Matplotlib和IPython選擇後臺渲染器,例如,使用--pylab qt,固然這個須要安裝PyQt或PySide。數組

咱們將假設在這一章中%pylab模式一直處於激活狀態。當在一個腳本而不是IPython交互環境時,咱們能夠在腳本的頭部添加上from pylab import *這個命令來實現該模式的激活。在一個Python模塊中,使用import matplotlib.pyplot as plt也許是個更好的主意,由於這樣就可讓Matplotlib對象處於Matplotlib所定義的命名空間內。多線程

有一點值得主意,採用腳本方式生成圖像的方式與在IPython中有稍微的不一樣。在一個腳本中,圖像只在調用show()函數的時候纔會被顯示,通常狀況下咱們都會將這個函數的調用放在腳本的最末端;然而在IPython的命令行接口中,圖像是隨着每個繪圖函數隨時更新的。ide

交互式導航

當使用Matplotlib展現一個圖像的時候,窗口包含一些用於改變圖形選項的帶有圖形式樣的交互式導航(放大、縮小等)。也能夠經過窗口將圖像保存爲位圖或矢量格式。

IPython notebook中的Matplotlib

Matplotlib也能夠在notebook中使用。當咱們以ipython notebook --pylab inline命令啓動notebook時,繪製的圖像會以圖片的形式出如今輸出框內,且能夠以base64字符串的形式保存在IPYNB文件中。如若沒有開啓inline選項,圖像會像使用IPython時同樣在一個單獨分離出來的窗口顯示。也能夠在ipython notebok中使用%pylab inline命令激活這個選項。

標準繪圖

在這一節中,咱們將看到一些標準繪圖的樣例,如直線、曲線、散點圖和條形圖。在下一節,咱們將看到圖片和地圖。可是Matplotlib提供的功能遠比咱們在這裏提到的要多的多,如它還提供了3D繪圖、幾何形狀、向量域等功能。

曲線圖

使用Matplotlib繪製曲線圖實際上就是繪製一些連續的線段,當線段的數量足夠多時,這些線段組合起來就足夠平滑讓咱們的肉眼開起來就像曲線同樣。繪製某一個數學函數在一給定區間內的圖像就像NumPy根據給定的數值顯示數組同樣。

例如,一個時間序列信號就能夠以表示爲一個必定時間段內樣例值組成的一維向量(例如,每毫秒1KHz的取樣頻率),這樣信號每一秒就是1000個數據單元組成的向量。plot函數能夠用來在屏幕上繪製出這個信號圖像。以下:
【圖】

這裏咱們使用獨立隨機值生成了一個向量。生成的信號就是所謂的白噪音信號(具備平坦功率譜密度的隨機信號)。當在開啓--pylab inline選項的notebook中繪製這個圖像的時候,Matplotlib將生成一個這個曲線圖的圖片並自動地將其插入到輸出框內。

plot函數接收一個單向量做爲參數的時候,它將認爲這個向量包含了y軸的值,x軸將自動的生成爲0到len(y)之間的整數值。咱們可使用`plot(x,y)命令來專門指定x軸的座標。

散點圖

散點圖使用但像素或其餘的標識展示二位空間點的集合。讓咱們繼續進行咱們的cities實例。假設咱們在正確的目錄中(citiesdata alias),咱們能夠加載數據並繪製出全部城市的地理座標:

In [1]: import pandas as pd
In [2]: cd citiesdata
In [3]: filename = 'worldcitiespop.txt'
In [4]: data = pd.read_csv(filename)
In [5]: plot(data.Longitude, data.Latitude, ',')

【圖】

在這個示例中,咱們繪製了全部城市的經度(x軸)和緯度(y軸)。plot函數的第三個參數(',')用來指定標識類型。在這裏默認使用單像素來表示每個城市。雖然有些扭曲,咱們依然能夠從中識別出各大洲的形狀。扭曲的緣由是咱們是在一個笛卡爾座標系中繪製的地理座標點,相對來講,更適合繪製地理座標的方式是採用地圖投影法。咱們將會在本章後續部分回來再談這個問題。

條形圖

條形圖一班用來繪製表現不一樣間隔內的數值分佈的直方圖。Maplotlib的hist函數接受一個數值向量來繪製直方圖。bins關鍵字用來指定劃割塊的數目或劃割塊列表。

例如,讓咱們來繪製Facebook圖示例中結點度的直方圖:

In [1]: cd fbdata
In [2]: import networkx as nx
In [3]: g = nx.read_edgelist('0.edges')
In [4]: hist(g.degree().values(), bins=20)

【圖】
在這裏,g.degree是包含每個節點的度的字典(也就是與其相連的結點的數目)。values方法返回全部度的列表。

Matplotlib中還有比咱們在這裏展現的多得多的圖形類型,且繪製功能彷佛無窮無盡。能夠在其官網的Matplotlib Gallery和 Nicolas Rougier的教程中找到大量的圖形繪製示例:①(http://matplotlib.org/
gallery.html) ② (http://www.loria.fr/~rougier/
teaching/matplotlib/).

圖繪定製

Matplotlib提供了大量的定製選項。在這裏,咱們將展現怎樣改變一個圖形的樣式和顏色;怎樣配置座標軸和圖例;怎樣在贊成個窗口顯示多付圖像。

樣式和顏色

默認狀況下,曲線是連續的且使用統一的一種顏色。在plot函數中能夠很方便地指定曲線的樣式和顏色。

plot函數的第三個參數採用一種簡潔的語法來制定曲線的樣式和顏色。例如,-r表示"連續的線條且顏色爲紅色",--g表示「虛線且顏色爲綠色」。有十幾種樣式可使用::表示點線,-.表示虛線點線交替,.表示點線,,表示單像素,o表示圓圈標識等等。

同時,有八個單字符表示八中顏色,他們是:r,g,b(主原色:紅綠藍),c,m,y(副原色:青、品紅、黃),k,w(黑、白)。任何顏色均可以使用十六進制、RGB或RGBA元組進行指定(值介於0到1之間)等等。

使用一個字符串來指定樣式和顏色來定製樣式顏色只是更通用地使用專門的參數進行樣式和顏色定製的縮寫。這些參數包括:linestyle( 或ls),linewidth(或 lw),marker,markerfacecolor(或 mfc),markersize(或 ms)等。完整的選項列表能夠參閱Maplotlib的官方文檔。

還有就是,當在一個窗口展現多個圖像的時候,每個圖像的顏色能夠循環使用一個預先定義好的顏色集合,如藍、綠、紅等等。這個循環使用的列表是能夠被定製的:

In [1]: rcParams['axes.color_cycle'] = ['r', 'k', 'c']

定製Matplotlib:rcParams是Matplotlib中一個帶有可定製參數的全局字典樣式的變量。幾乎Maplotlib的每一方面均可以在這裏進行配置。並且,能夠經過將配置保存爲名爲matplotlibrc的ASCII文本文件中指定永久配置,這個文件能夠保存在當前目錄(針對本地選項)或`~/.matplotlib(針對全局選項)。在這個文件中,每一行包含一個定製的參數,例如,axes.color_cycle:['r','k','c']。

網格,座標軸和圖例

一個圖像若是沒有圖例和座標軸是不能傳達數據的全部有用信息的。默認狀態下,Matplotlib會自動顯示座標軸和ticks。ticks的確切位置可使用xticksyticks進行設定,可使用grid函數能夠用來添加玩個。x座標和y座標的區間可使用xlimylim進行指定。可使用xlabelylabel設定座標軸的標籤。並且,也可使用legend關鍵字指定圖例。最後,title命令用來顯示圖像的名字。下面的示例描述了怎樣使用這些選項:
【圖】

圖形疊加:在Maplotlib中能夠實現調用不一樣的繪圖函數來跟新同一圖像。這也是實現多個圖形顯示在衣服圖像中的方法。要在一個新的窗口中建立一個新的圖像,咱們須要調用figture()函數。最後,就像咱們將在後續小節中看到的,可使用subplot來實如今同一窗口展現多個獨立的圖像。

IPython的交互式功能

經過使用事件循環集成機制來在IPython控制檯建立Matplotlib圖像容許在控制檯經過變成和圖像進行交互。從而能夠實時建立一個新的圖像或更新一個圖形。示例以下:

In [1]: plot(randn(1000, 2))
Out[1]: [<matplotlib.lines.Line2D at 0x4cf4310>,
<matplotlib.lines.Line2D at 0x4cf4450>]

咱們首先使用兩個白噪音信號來建立一個圖像(plot函數會把每一列看成一個獨立的曲線顯示出來)。當帶有圖像的窗口打開後,咱們沒必要關閉窗口就能夠返回IPython控制檯。輸出Out[1]包含一個line2D對象列表。事實上,Matplotlib使用的是圖像的面向對象式的描述。讓咱們像下面這樣獲取第一個對象(也就是第一個曲線):

In [2]: line = _[0]

line變量的Tab不全將會顯示咱們能夠用來更新圖像的方法列表。例如,要把線條從藍色改成紅色,咱們可使用下面的命令:

In [3]: line.set_color('r')

圖像接着會所以更新。有時可能須要進行強制刷新圖像,例如放大和縮小操做。

最後,讓咱們提一下用來提供更新一些圖像屬性的的GUI窗口中的這個編輯(Edit)按鈕。

繪製多幅圖像
多個獨立的圖形能夠展現在同一個圖像上。咱們可使用表示行和列的任意數字來定義一個網格,再在每個方框內繪製圖像。方框能夠被擴展至多行多列(使用subplot2grid)。例如,下面的示例逐步展現了怎樣在不一樣的座標系統內繪製兩幅圖像:

x = linspace(0, 2 * pi, 1000)
y = 1 + 2 * cos(5 * x)
subplot(1,2,1)
plot(x, y)
subplot(1,2,2, polar=True)
polar(x, y)

【圖】

subplot函數同時指定了分割爲多少列(第一個參數)多少行(第二個參數)以及將會被渲染的圖像雖在盒子的索引(第三個參數,從1開始索引,從左到右,從上到下)。·polar=True關鍵字參數制訂了第二個子圖是一個極座標圖像。polar函數與plot函數是類似的,只不過極座標系包含的是表示角度的theta和半徑的r這兩個屬性。

高級繪圖

在這一節中咱們將展現Matplotlib提供的與圖片和地圖相關的高級繪圖功能。並且咱們也會瀏覽一些其它的繪圖庫。

圖片處理

一個N X M的彩色圖片能夠表示爲一個 N X M X 3的NumPy數組,也就是三個表明紅綠藍通道的 NXM矩陣。圖片處理算法有NumPy和SciPy高效實現,圖片顯示能夠有Matplotlib實現。

加載圖片

Matplotlib的imread函數能夠從硬盤打開一個PNG格式的圖片並返回一個 N X M X 3 的NumPy數組(若是有一個alpha透明通道的劃就是 N X M X 3)。PIL包也提供了讀取任意格式圖片的open函數(BMP,GIF,JPEG,TIFF等)。

在下面的示例,咱們將從遠程URL下載一個PNG圖片並使用imread加載它:

In [1]: import urllib2
In [2]: png = urllib2.urlopen
('http://ipython.rossant.net/squirrel.png')
In [3]: im = imread(png)
In [4]: im.shape
Out[4]: (300, 300, 3)

imread函數接受一個圖片文件名活一個Python中相似文件的對象(就像在這個示例中咱們使用的是urlopen返回的緩衝區)。imread函數返回的對象是一個三維的NumPy數組。

咱們也可使用PIL讀取圖片。咱們可使用Image.open直接讀取圖片或使用Image.fromarray函數將一個NumPy數組轉換成一個PIL圖片:

In [5]: from PIL import Image
In [6]: img = Image.fromarray((im * 255).astype('uint8'))

fromarray函數接受一個0到250直接的無符號8位整數組成的數組。這就是爲何咱們須要將NumPy數組從浮點數轉換成所需數據格式的緣由。反過來,咱們可使用array函數——im = array(img)將一個PIL圖片轉換成一個NumPy數組。

圖片展現

Matplotlib的imshow函數能夠用來顯示一個源自NumPy數組的圖片。就像下面的示例這樣:

In [7]: imshow(im)

【圖】

imshow函數也接受二位NumPy數組(灰度圖)。能夠經過顏色映射指定0-1間數值和實際像素顏色之間的映射關係。顏色映射是一個定義0-1之間任意值的顏色的線性梯度。Matplotlib中有不少預約義的顏色映射,完整的列表能夠從這裏得到: http://www.scipy.org/
Cookbook/Matplotlib/Show_colormaps

咱們可使用cmap=get_cmap(name)關鍵字參數在imshow中指定顏色映射,其中name是顏色映射的名稱。

PIL的使用

PIL提供了一些基礎圖片處理功能,如:旋轉、剪切、濾鏡、複製、粘貼以及幾何變換等。例如,咱們可使用下面的命令來旋轉一個圖片:

In [9]: imshow(array(img.rotate(45.)))

【圖】

這裏咱們把圖片逆時針旋轉了45度並將其由PIL圖片轉換成NumPy數組顯示出來。

高級圖片處理——color quantization

PIL提供了基礎的圖片處理函數,而Scipy提供了更爲高級的算法。

在這裏咱們將展現一個被稱爲 color quantization的高級圖片處理算法的樣例。該算法的原理是在保持圖片大部分可視結構的條件下減小圖片色彩的數目。在這個示例中,咱們將使用scipy.cluser包實現這個算法。咱們將使用K均值(K-means)算法將顏色值彙集到少數的幾個聚類中,並把每個色素指派給他所屬聚類的顏色。代碼以下:

In [10]: from scipy.cluster.vq import *
M = im[:,:,0].ravel()
centroids, _ = kmeans(M, 4)
qnt, _ = vq(M, centroids)
clustered = centroids[reshape(qnt, (300, 300))]

咱們在這裏只採用了紅色通道的數據,全部像素具備相同的權重。使用ravel函數使圖片平坦化(也就是咱們會獲得一個一維向量,而不是二維矩陣)。接着,kmeans函數尋找色彩空間的聚類並返回中心顏色。最後vg函數將每個像素指派給它所屬的中心索引,咱們就獲得了由中心顏色(centroids)生成的中心索引(在qnt)有趣索引聚類生成的最終圖片。因爲這個算法的輸出結果是一個灰度圖片,因此咱們須要指定一個顏色映射。咱們將使用一組曾經很是流行的顏色,結果就像下面這樣:

In [11]: cmap = matplotlib.colors.
ListedColormap([(0,.2,.3),(.85,.1,.13),(.44,.6,.6),
(1.,.9,.65)])
In [12]: imshow(clustered, cmap=cmap)

【圖】

這裏的ListedColormap函數使用一個離散的顏色集建立了一個定製的顏色映射。

最後咱們可使用Matplotlib的imsave函數將最終的圖片保存爲一個PNG文件。以下:

In [13]: imsave('squirrelama.png', clustered, cmap=cmap)

地圖

地圖是一種雖複雜但又很是重要的圖像類型。basemap tookit給Matplotlib提供了地圖處理能力(需單獨安裝)。它很是強大,咱們在這一章中只會簡單對他進行介紹。特別的,咱們將繼續咱們的cities的例子來繪製真實世界的人口密度圖。

首先,咱們先像下面這樣得到城市的地理位置和人口數目:

In [6]: locations = data[['Longitude','Latitude']].as_matrix()
In [7]: population = data.Population

接着,咱們像下面這樣經過指定投影類型和地圖邊界來初始化一個世界地圖:

In [8]: from mpl_toolkits.basemap import Basemap
In [9]: m = Basemap(projection='mill', llcrnrlat=-65, urcrnrlat=85,
llcrnrlon=-180, urcrnrlon=180)

有不少方法能夠將地球的表面投影到一個平面上,具體選用何種投影方式取決於具體的應用。這裏咱們使用的是米勒圓柱投影(Miller cylindrical projection)。另一個關鍵字參數給出左下角和右上角的經度和緯度。

下一步就是根據世界人口密度數據生成一個二維圖片。要完成這一步咱們須要將城市的地理位置映射到咱們的地圖上。以下:

In [10]: x, y = m(locations[:,0],locations[:,1])

調用m(long,lat)函數能夠得到地理位置的經緯度座標(x,y)。要生成密度地圖,咱們還須要地圖的邊界座標。以下:

In [11]: x0, y0 = m(-180, -65)
In [12]: x1, y1 = m(180, 85)

好了,如今讓咱們來生成密度圖吧。在這裏咱們將使用histogram2d函數,這個函數將根據點集數據返回一個二位的直方圖。每個點表明一個城市,把每一城市的人口數做爲對應城市的權重。必需要注意沒有人口數據的城市,咱們這裏將這些城市的權重設置爲1000。以下:

In [13]: weights = population.copy()
In [14]: weights[isnan(weights)] = 1000
In [15]: h, _, _ = histogram2d(x, y, weights=weights,
bins=(linspace(x0, x1, 500), linspace(y0, y1, 500)))

如今h展開圖變量保存着整個500x500網格的球形平面小方格的人口計數。咱們可使用SciPy的高斯濾波器對log(h)進行處理來生成一張密度地圖(應用的是一種核密度估計)。當數據值跨越幾個數量級的時候使用對數是很是有用的。咱們還須要注意一下0值(指空區域),由於0的對數是未定義/無心義的:

In [16]: h[h == 0] = 1
In [17]: import scipy.ndimage.filters
In [18]: z = scipy.ndimage.filters.gaussian_filter(log(h.T), 1)

log(h.T)進行濾波處理的緣由是相對於地圖座標系h值的座標系轉換獲得的。咱們在這裏使用數值1進行過濾。

最後,咱們將密度地圖和海岸線繪製出來,結果以下:

In [19]: m.drawcoastlines()
In [20]: m.imshow(z, origin='lower', extent=[x0,x1,y0,y1],
cmap=get_cmap('Reds'))

【圖片】

3D繪圖

Matplotlib包含一個能夠用來基礎3D繪圖的3D工具包——mplot3d,基礎功能有3D曲線、曲面圖繪製等。做爲一個演示示例,咱們來建立一個曲面圖。首先須要導入mplot3d工具包:

In [1]: from mpl_toolkits.mplot3d import Axes3D

接着,咱們使用下面的命令建立曲面圖的x、y、z座標:

In [2]: # we create a (X, Y) grid
X = linspace(-5, 5, 50)
Y = X
X, Y = meshgrid(X, Y)
# we compute the Z values
R = sqrt(X**2 + Y**2)
Z = sin(R)

NumPy的meshgrid函數返回由X和Y向量定義的矩形區域展開網格內全部點的座標值。最後,咱們建立一個3D畫布,並在上面繪製曲面圖:

In [3]: ax = gca(projection='3d')
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
cmap=mpl.cm.coolwarm, linewidth=0)

Matplotlib的gca函數返回當前的座標軸實例,須要指出的是這個示例應該使用3D投影。plot_surface函數中,stridecstride關鍵字參數提供曲面的行列步長,cmap提供顏色映射,linewidth提供線框的寬度。下面的截圖展現了最終結果:
【圖】

動畫

Matplotlib能用來建立動畫,並使用FFmpeg或MEncoder導出爲MP4視頻。思路是建立一個圖像,並寫一個函數在一個肯定時間間隔頻率下更新它。動畫模塊的文檔能夠在下面的鏈接中找到:http//matplotlib.org/api/animation_api.html。除此以外,還有一個 Jake Vanderplas製做的教程: http://jakevdp.github.com/
blog/2012/08/18/matplotlib-animation-tutorial/。

其它的可視化包

Matplotlib不是惟一的Python可視化包。這裏是一些可視化方面的庫:

  • Chao:一個Matplotlib的替代庫
    (http://code.enthought.com/chaco/)
  • PyQwt:基於PyQt的繪圖庫
  • PyQtGraph:基於PyQt,提供2D、3D繪圖功能
  • Visvis:基於OpenGL;提供一種面向對象式的繪圖接口
  • Mayavi:提供3D可交互式可視化接口
  • PyOpenGL:提供應用普遍的OpenGL的Python原始接口;提供低級的硬件加速的2D/3D繪圖功能
  • Galry:用於處理百萬千萬個點大數據集的高性能交互式可視化包,基於PyOpenGL。

圖形用戶接口(GUI)

有一段時間只能經過命令行接口進行人機交互。如今大部分通常計算機用戶
相對於鍵盤和帶有閃爍光標的黑色屏幕對鼠標和圖形窗口更爲熟悉。正因爲這個緣由。任何開發者在某些時候可能會被要求寫一個圖形接口,以使得非開發人員能很方便的和程序進行互動。

一個GUI界面能夠被集成到任意Python包中。對於Python來講有大量的圖形工具包可使用,它們中的大多數是原生或C++圖形庫的封裝。比較有名的工具包有Qt、wxWidgets、TKinter、GTK等等。在本書的示例中咱們將使用Qt。

GUI變成是一個至關困難的主題,由於它須要操做系統的底層細節的高深知識、多線程編程和一些人機交互的基本概念認識。在本書中,咱們將展現一個PyQt的很是基礎的一個」HelloWorld「示例。咱們還將看到怎樣使用IPython交互式地處理GUI。

使用IPythonn進行交互式GUI編程

IPython實現的循環集成系統能夠用來從命令行接口展現圖形窗口時不阻斷控制檯。這對於建立GUI來講很是有用,由於這樣就能夠經過命令行和圖形窗口進行動態的交互。

能夠用%gui魔法命令來激活事件循環集成。咱們須要提供將要使用的圖形庫的名字。可用的名字有wx,qt,gtk,和tk。這裏咱們使用Qt。因此咱們能夠輸入%gui qt。Qt主程序接着就會在IPython中自動啓動。另一種方式是使用ipython --gui qt命令啓動IPython。

這一節的示例須要PyQt4或PySide。咱們將假設PyQt4已經安裝好了,若是安裝的是PySide,只需再導入的時候將PyQt4替換成PySide便可。兩個庫綁定的Qt API基本上是一致的。

一個「Hello World」示例
在這個「Hello World」示例中,咱們將展現一個窗口,在這個窗口內有一個用來出發消息框的按鈕。咱們還將展現如何在IPython控制太和窗口進行交互。

咱們須要建立一個繼承自QWidget基類的類來定義一個窗口。QWidget是全部Qt窗口和控制的基類,也被稱爲widgets(部件)。這裏是「Hello World」示例的代碼:

from PyQt4 import QtGui
class HelloWorld(QtGui.QWidget):
    def __init__(self):
        super(HelloWorld, self).__init__()
        # create the button
        self.button = QtGui.QPushButton('Click me', self)
        self.button.clicked.connect(self.clicked)
        # create the layout
        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(self.button)
        self.setLayout(vbox)
        # show the window
        self.show()
    def clicked(self):
        msg = QtGui.QMessageBox(self)
        msg.setText("Hello World !")
        msg.show()

大部分工做都在HelloWorld部件的構造函數中發生。咱們首先須要調用父類的構造函數。接着,咱們分幾步去顯示按鈕:

  1. 咱們首先建立了一個按鈕,也就是QPushButton類的實例。第一個參數是按鈕上要顯示的文本,第二個參數是父部件的實例(self)。每個特定的控制操做和部件由一個繼承自QWidget基類的類所定義,且可以在QtGui命名空間中找到。
  2. 咱們定義了當用戶點擊按鈕時調用的回調方法。cliked屬性表示一旦用戶點擊了按鈕Qt信號就發射。咱們將這個信號鏈接到咱們的HelloWorld部件的clicked方法(被稱做——槽)。信號槽機制是Qt中不一樣部件進行消息傳遞的方法。但某些事件發生是信號會被觸發,信號被處觸發後,鏈接這些信號的「槽」就會被調用。任何部件都包含不少預約義好的信號。固然,也能夠本身來定製信號。
  3. 接着,咱們須要將這個新建立的按鈕放置在窗口上。首先咱們須要建立一個承載部件並對部件進行垂直佈局的QVBoxLayout部件。這裏咱們僅僅是使用addWidget方法將按鈕放置到它上面。咱們還制定了這個盒子/方框是窗口的佈局。經過這種方式,主窗口承載這個盒子,這個盒子承載咱們的按鈕。
  4. 最後,咱們須要使用self.show()這個命令來顯示咱們的窗口。

clicked這個方法中,咱們建立了一個用來顯示信息的QMessageBox,默認狀況下,這個部件就是帶有一個文本一個OK按鈕的對話框。setText方法指定了文本,show方法用來顯示窗口。

如今假設IPython已經經過%gui qtipython --gui qt的方式激活了帶有Qt的事件循環,咱們就可使用下面的命令來顯示咱們建立的窗口:

In [1]: window = HelloWorld()

窗口接着就會出現,且在窗口在被打開的狀態下IPython的控制檯依舊是可用的。
【圖】
點擊按鈕就會彈出一個帶有HelloWorld字樣的對話框。

咱們也能夠在IPython控制檯中和這個窗口進行交互。例如,下面的命令就會使得只要咱們已經點擊了按鈕就會彈出HelloWorld對話框:

In [2]: window.clicked()

這個功能在咱們設計一個複雜窗體和調試的時很是方便。

總結

在本章中,咱們瞭解了IPython提供的圖形功能,Matplotlib以及其餘相關的庫。咱們能夠用來建立線圖、圖表、直方圖、地圖、顯示和處理圖片,圖形用戶接口等等。圖形功能還能很容易地集成都notebook中。全部的圖形皆可定製。這些因素也就解釋了爲何這些工具在科學和工程社區如此受歡迎。在這些領域數據可視化在多數應用中扮演着很是重要的角色。

在下一章,咱們將看到進行Python代碼加速的技術。

相關文章
相關標籤/搜索