本章咱們將展現Python的繪圖功能以及如何在IPython中交互式地使用它們。html
NumPy爲處理大量的多維數組結構的數據提供了高效的方法。可是看行行列列的數字總不如直接看曲線圖、散點圖、折線圖、圖片等圖像來的直觀。Matplotlib是一個使用NumPy數據生成高質量圖像的Python包,其包含的內容很是豐富。它提供了和世界上工程與科學領域很是流行的商業軟件atlab很是類似的簡單而高級的繪圖接口。Matplotlib和IPython結合的至關好。python
咱們也會介紹一些圖形用戶接口(GUI)編程方面的內容。全面覆蓋這個豐富的主題遠遠超出了本書的範圍。因此咱們在本章中將只是看一些簡單的示例。下面是本章包含的內容:git
有大量的Python包能夠用來進行去先繪製,可是截止目前應用最爲普遍的一個是Matplotlib。它是功能最爲完整與強大的一個繪圖庫。它既能夠用於交互式可視化,也能用來生成科學出版的高質量圖像。除此以外,他的高級接口使得它使用起來很是容易。github
在這一節中,咱們將展現Matplotlib提供的一些功能以及怎樣方便地在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的確切位置可使用xticks
和yticks
進行設定,可使用grid
函數能夠用來添加玩個。x座標和y座標的區間可使用xlim
和ylim
進行指定。可使用xlabel
和ylabel
設定座標軸的標籤。並且,也可使用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
函數中,stride
和cstride
關鍵字參數提供曲面的行列步長,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可視化包。這裏是一些可視化方面的庫:
有一段時間只能經過命令行接口進行人機交互。如今大部分通常計算機用戶
相對於鍵盤和帶有閃爍光標的黑色屏幕對鼠標和圖形窗口更爲熟悉。正因爲這個緣由。任何開發者在某些時候可能會被要求寫一個圖形接口,以使得非開發人員能很方便的和程序進行互動。
一個GUI界面能夠被集成到任意Python包中。對於Python來講有大量的圖形工具包可使用,它們中的大多數是原生或C++圖形庫的封裝。比較有名的工具包有Qt、wxWidgets、TKinter、GTK等等。在本書的示例中咱們將使用Qt。
GUI變成是一個至關困難的主題,由於它須要操做系統的底層細節的高深知識、多線程編程和一些人機交互的基本概念認識。在本書中,咱們將展現一個PyQt的很是基礎的一個」HelloWorld「示例。咱們還將看到怎樣使用IPython交互式地處理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
部件的構造函數中發生。咱們首先須要調用父類的構造函數。接着,咱們分幾步去顯示按鈕:
QPushButton
類的實例。第一個參數是按鈕上要顯示的文本,第二個參數是父部件的實例(self)。每個特定的控制操做和部件由一個繼承自QWidget
基類的類所定義,且可以在QtGui
命名空間中找到。cliked
屬性表示一旦用戶點擊了按鈕Qt信號就發射。咱們將這個信號鏈接到咱們的HelloWorld
部件的clicked
方法(被稱做——槽)。信號槽機制是Qt中不一樣部件進行消息傳遞的方法。但某些事件發生是信號會被觸發,信號被處觸發後,鏈接這些信號的「槽」就會被調用。任何部件都包含不少預約義好的信號。固然,也能夠本身來定製信號。QVBoxLayout
部件。這裏咱們僅僅是使用addWidget
方法將按鈕放置到它上面。咱們還制定了這個盒子/方框是窗口的佈局。經過這種方式,主窗口承載這個盒子,這個盒子承載咱們的按鈕。self.show()
這個命令來顯示咱們的窗口。在clicked
這個方法中,咱們建立了一個用來顯示信息的QMessageBox
,默認狀況下,這個部件就是帶有一個文本一個OK按鈕的對話框。setText
方法指定了文本,show
方法用來顯示窗口。
如今假設IPython已經經過%gui qt
或ipython --gui qt
的方式激活了帶有Qt的事件循環,咱們就可使用下面的命令來顯示咱們建立的窗口:
In [1]: window = HelloWorld()
窗口接着就會出現,且在窗口在被打開的狀態下IPython的控制檯依舊是可用的。
【圖】
點擊按鈕就會彈出一個帶有HelloWorld字樣的對話框。
咱們也能夠在IPython控制檯中和這個窗口進行交互。例如,下面的命令就會使得只要咱們已經點擊了按鈕就會彈出HelloWorld對話框:
In [2]: window.clicked()
這個功能在咱們設計一個複雜窗體和調試的時很是方便。
在本章中,咱們瞭解了IPython提供的圖形功能,Matplotlib以及其餘相關的庫。咱們能夠用來建立線圖、圖表、直方圖、地圖、顯示和處理圖片,圖形用戶接口等等。圖形功能還能很容易地集成都notebook中。全部的圖形皆可定製。這些因素也就解釋了爲何這些工具在科學和工程社區如此受歡迎。在這些領域數據可視化在多數應用中扮演着很是重要的角色。
在下一章,咱們將看到進行Python代碼加速的技術。