翻譯自:Matplotlib tutorialNicolas P. Rougier - Euroscipy 2012html
這個教程基於能夠從scipy lecture note獲得的 Mike Müller的教程。python
源代碼可從這裏得到。圖像在figures文件夾內,全部的腳本位於scripts文件夾。git
全部的代碼和材料以Creative Commons Attribution 3.0 United States License (CC-by)發佈。github
特別感謝Bill Wing和Christoph Deil的檢查和校訂。shell
matplotlib大概是被使用最多的二維繪圖Python包。它不只提供一個很是快捷的用python可視化數據的方法,並且提供了出版質量的多種格式圖像。咱們將要探索matplotlib包含最多見狀況的交互模式。編程
IPython是一個加強的Python交互shell,它擁有不少有趣的特性包括被命名的輸入與輸出,可以使用shell命令,加強的調試和許多其它特性。當咱們在命令參數中用-pylab
(自從IPython0.12版變成--pylab
),它允許交互的matplotlib會話有像Matlab/Mathematica樣的功能。api
pylab提供了一個針對matplotlib面向對象繪圖庫的程序界面。它模仿Matlab(TM)開發。所以,pylab大部分的繪圖命令和參數和Matlab(TM)類似。重要的命令被交互示例解釋。數組
在這一部分,咱們想在同一個圖片中繪製正弦和餘弦函數。從默認設置開始,咱們將一步一步地改進使它看上去更棒。框架
首先得到正弦和餘弦函數的數據:dom
from pylab import * X = np.linspace(-np.pi, np.pi, 256,endpoint=True) C,S = np.cos(X), np.sin(X)
X如今是一個numpy數組,包含從-π到+π(包含π)等差分佈的256個值。C是正弦(256個值),S是餘弦(256個值)。
運行這個例子,你能夠在IPython交互會話鍵入它們
[lyy@arch ~]$ ipython2 --pylab Python 2.7.3 (default, Apr 24 2012, 00:00:54) Type "copyright", "credits" or "license" for more information. IPython 0.13 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. Welcome to pylab, a matplotlib-based Python environment [backend: Qt4Agg]. For more information, type 'help(pylab)'.
或者你能夠下載每一個示例而後使用普通的的python運行它:
$ python exercice_1.py
你能夠點擊相應圖片的得到每一步的源碼。
matplotlib有一套容許定製各類屬性的默認設置。你能夠幾乎控制matplotlib中的每個默認屬性:圖像大小,每英寸點數,線寬,色彩和樣式,子圖(axes),座標軸和網格屬性,文字和字體屬性,等等。雖然matplotlib的默認設置在大多數狀況下至關好,你卻可能想要在一些特別的情形下更改一些屬性。
from pylab import * X = np.linspace(-np.pi, np.pi, 256,endpoint=True) C,S = np.cos(X), np.sin(X) plot(X,C) plot(X,S) show()
在如下腳本中,咱們示例(並註釋)全部影響圖像外觀的圖像設定。這些設定被顯式地設置成它們的默認值,可是如今你能夠交互地嘗試這些值來探索它們的做用(參考以後的線條屬性和線條樣式)。
# Import everything from matplotlib (numpy is accessible via 'np' alias) from pylab import * # Create a new figure of size 8x6 points, using 80 dots per inch figure(figsize=(8,6), dpi=80) # Create a new subplot from a grid of 1x1 subplot(1,1,1) X = np.linspace(-np.pi, np.pi, 256,endpoint=True) C,S = np.cos(X), np.sin(X) # Plot cosine using blue color with a continuous line of width 1 (pixels) plot(X, C, color="blue", linewidth=1.0, linestyle="-") # Plot sine using green color with a continuous line of width 1 (pixels) plot(X, S, color="green", linewidth=1.0, linestyle="-") # Set x limits xlim(-4.0,4.0) # Set x ticks xticks(np.linspace(-4,4,9,endpoint=True)) # Set y limits ylim(-1.0,1.0) # Set y ticks yticks(np.linspace(-1,1,5,endpoint=True)) # Save figure using 72 dots per inch # savefig("exercice_2.png",dpi=72) # Show result on screen show()
首先,咱們想要餘弦是藍色而正弦是紅色,它們的線條都稍厚一點。咱們將也稍微更改圖片大小來使它更寬一點。
figure(figsize=(10,6), dpi=80) plot(X, C, color="blue", linewidth=2.5, linestyle="-") plot(X, S, color="red", linewidth=2.5, linestyle="-")
當前的圖像邊界有點太緊了一點,並且咱們想要預留一點空間使數據點更清晰。
xlim(X.min()*1.1, X.max()*1.1) ylim(C.min()*1.1, C.max()*1.1)
當前刻度並不理想,由於它們不顯示正餘弦中咱們感興趣的值(+/-π,+/-π/2)。咱們將更改它們讓它們只顯式這些值。
xticks( [-np.pi, -np.pi/2, 0, np.pi/2, np.pi]) yticks([-1, 0, +1])
刻度已經放置合適可是他們的標籤並不很清楚,咱們能夠猜出3.142是π可是最好讓它更直接。當咱們設置刻度值時,咱們也能夠在第二個參數列表中提供相應的標籤。注意,咱們用latex得到更好渲染的標籤。
xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$']) yticks([-1, 0, +1], [r'$-1$', r'$0$', r'$+1$'])
軸線(spines)是鏈接刻度標誌和標示數據區域邊界的線。它們如今能夠被放置在任意地方,它們在子圖的邊緣。咱們將改變這點,由於咱們想讓它們位於中間。由於一共有四個軸線(上/下/左/右)。咱們將經過將它們的顏色設置成None,捨棄位於頂部和右部軸線。而後咱們把底部和左部的軸線移動到數據空間座標中的零點。
ax = gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data',0)) ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data',0))
讓咱們在圖片左上角添加一個圖例。這僅僅須要向plot命令添加關鍵字參數label(以後將被圖例框使用)。
plot(X, C, color="blue", linewidth=2.5, linestyle="-", label="cosine") plot(X, S, color="red", linewidth=2.5, linestyle="-", label="sine") legend(loc='upper left')
讓咱們如今使用annotate命令註解一些咱們感興趣的點。咱們選擇2π/3做爲咱們想要註解的正弦和餘弦值。咱們將在曲線上作一個標記和一個垂直的虛線。而後,使用annotate命令來顯示一個箭頭和一些文本。
t = 2*np.pi/3 plot([t,t],[0,np.cos(t)], color ='blue', linewidth=2.5, linestyle="--") scatter([t,],[np.cos(t),], 50, color ='blue') annotate(r'$sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$', xy=(t, np.sin(t)), xycoords='data', xytext=(+10, +30), textcoords='offset points', fontsize=16, arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2")) plot([t,t],[0,np.sin(t)], color ='red', linewidth=2.5, linestyle="--") scatter([t,],[np.sin(t),], 50, color ='red') annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$', xy=(t, np.cos(t)), xycoords='data', xytext=(-90, -50), textcoords='offset points', fontsize=16, arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
因爲藍色和紅色的線,刻度標籤如今很難看清。。咱們可讓它們更大而且調整它們的屬性使它們的背景半透明。這將讓咱們把數據和標籤都看清。
for label in ax.get_xticklabels() + ax.get_yticklabels(): label.set_fontsize(16) label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65 ))
Note:這一段很繞,我不知道該怎麼翻譯好。在matplotlib中axes容器處於核心地位。翻譯成子圖由於在《Python科學計算》中做者這樣稱呼.subplot翻譯成子區
目前咱們已經隱式地使用了圖像(figure)和子圖(axes)的建立。這對快速繪圖很方便。咱們經過顯式使用figure,subplot,axes能夠控制更多圖像的呈現。一個圖像(figure)意味着用戶界面的整個窗口。在一個圖像中能夠有些子區(subplot)。subplot將繪圖放置在常規的網格位置上而axes容許更自由的放置。它們都很是有用,取決於你的意圖。咱們已經隱式地使用了figure和subplot。當咱們調用plot時,matplotlib調用gca來獲取當前axes反過來調用gcf()獲取當前圖像(figure)。若是沒有當前圖像(figure),它調用figure()建立一個,嚴格地說,是建立一個subplot(111)。讓咱們詳細看看。
圖像是一個圖形用戶界面的窗口,以」Figure #」做爲標題。相對於Python一般是0索引的,圖像是從一開始的。這顯然是matlab風格。這裏有幾個決定圖像外觀的參數:
參數 | 默認 | 描述 |
---|---|---|
num | 1 | 圖像編號 |
figsize | figure.figsize | 圖像大小(寬度,高度)(英寸) |
dpi | figure.dpi | 每英寸分辨率 |
facecolor | figure.facecolor | 背景色 |
edgecolor | figure.edgecolor | 繪圖背景邊沿色 |
frameon | True | 繪製框架與否 |
默承認以在資源文件^1指定,並將在大多數時間被使用。只有圖像的編號頻繁變更。
當你使用圖形用戶界面時,你能夠經過點擊右上角^2的x
來關閉一個圖像。但也能夠用一種編程方式調用close來關閉一個圖像。取決於參數它關閉(1)當前圖像(無參數),(2)一個指定的圖像(以圖像編號或圖像實例做爲參數),(3)全部圖像(以all做爲參數)。
和其它對象同樣,你能夠經過setp
或set_somethin
方法來設置圖像屬性。
你能夠經過subplot在正常網格中佈置圖像。你須要指定行數和列數和區域的編號。注意gridspec命令是個更強大的選擇。
子圖和子區(subplot)很是類似,可是容許把圖片放置到圖像(figure)中的任何地方。因此若是咱們想要在一個大圖片中嵌套一個小點的圖片,咱們經過子圖(axes)來完成它。
良好格式化的刻度是準備發表的圖片中的重要部分。Matplotlib爲刻度提供徹底可配置的系統。刻度定位器指定刻度出現的位置,刻度格式器讓刻度看起來如你所願。主刻度和次要刻度能夠分別放置和格式化,每一個默認主刻度並不顯示,也就是,它們只有一個空列表,由於它們做爲空定位器(NullLocator)(參見下面)。
這有幾個針對不一樣種類需求的各類定位器:
Class | Description |
---|---|
NullLocator | 沒有刻度. |
IndexLocator | 每到一個基數的倍數點放置一個刻度 |
FixedLocator | 刻度位置是固定的 |
LinearLocator | 決定刻度位置 |
MultipleLocator | 在每一個基於基數倍數的整數點放置刻度 |
AutoLocator | 在不錯的位置選擇不超過n個間隔 |
LogLocator | 以log座標決定刻度位置 |
全部這些定位器源於matplotlib基類matplotlib.ticker.Locator。你能夠源於它建立你本身的定位器。處理時間刻度可能很是棘手。所以,matplotlib在matplotlib.dates中提供了特殊的定位器。
從下面的代碼開始,嘗試從新生成上邊的填充圖形。
from pylab import *
n = 256 X = np.linspace(-np.pi,np.pi,n,endpoint=True) Y = np.sin(2*X) plot (X, Y+1, color='blue', alpha=1.00) plot (X, Y-1, color='blue', alpha=1.00) show()
提示:你須要使用fill_between命令。
點擊圖片獲取答案。
從如下代碼開始,嘗試生成上邊的圖形,注意標記大小,顏色和透明度。
from pylab import *
n = 1024 X = np.random.normal(0,1,n) Y = np.random.normal(0,1,n) scatter(X,Y) show()
提示:色彩由(X,Y)角度給出。
點擊圖像獲取答案。
從如下代碼開始,嘗試生成上邊的圖形,添加標籤和紅色條形。
from pylab 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') ylim(-1.25,+1.25) show()
提示:你要注意文本對齊。
點擊圖像獲取答案。
從如下代碼開始,嘗試生成上邊的圖形,注意色彩表。(參見色彩表)
from pylab 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='jet') C = contour(X, Y, f(X,Y), 8, colors='black', linewidth=.5) show()
提示:你須要使用clabel命令。
點擊圖像獲取答案。
從如下代碼開始,嘗試生成上邊的圖形,添加標籤和紅色條形。
from pylab 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,4*n) y = np.linspace(-3,3,3*n) X,Y = np.meshgrid(x,y) imshow(f(X,Y)), show()
提示:你須要注意imshow命令中圖像的來源,而且使用色彩條(colorbar)。
點擊圖像獲取答案。
從如下代碼開始,嘗試生成上邊的圖形,添加標籤和紅色條形。
from pylab import *
n = 20 Z = np.random.uniform(0,1,n) pie(Z), show()
提示:你須要改變Z。
點擊圖像獲取答案。
從如下代碼開始,嘗試生成上邊的圖形,注意色彩和方向。
from pylab import *
n = 8 X,Y = np.mgrid[0:n,0:n] quiver(X,Y), show()
提示:你須要畫兩次箭頭。
點擊圖像獲取答案。
從如下代碼開始,嘗試生成上邊的圖形,添加標籤和紅色條形。
from pylab import *
axes = gca() axes.set_xlim(0,4) axes.set_ylim(0,3) axes.set_xticklabels([]) axes.set_yticklabels([]) show()
點擊圖像獲取答案。
從如下代碼開始,嘗試生成上邊的圖形,添加標籤和紅色條形。
from pylab import * subplot(2,2,1) subplot(2,2,3) subplot(2,2,4) show()
提示:你能夠對不一樣部分使用幾個subplot命令。
點擊圖像獲取答案。
從如下代碼開始,嘗試生成上邊的圖形,添加標籤和紅色條形。
from pylab import * axes([0,0,1,1]) N = 20 theta = np.arange(0.0, 2*np.pi, 2*np.pi/N) radii = 10*np.random.rand(N) width = np.pi/4*np.random.rand(N) bars = bar(theta, radii, width=width, bottom=0.0) for r,bar in zip(radii, bars): bar.set_facecolor( cm.jet(r/10.)) bar.set_alpha(0.5) show()
提示:你僅僅須要修改axes這行。
點擊圖像獲取答案。
從如下代碼開始,嘗試生成上邊的圖形,添加標籤和紅色條形。
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='hot') show()
提示:你須要使用contourf命令。
點擊圖像獲取答案。
試着從頭作這個!提示:看一看matplotlib logo
點擊圖像獲取答案。
matplotlib受益於豐富的文檔和巨大的用戶和開發者社區。這有幾個有關的連接:
代碼至關好的文檔化了,你能夠在python會話中快速查詢指定命令
>>> from pylab import * >>> help(plot) Help on function plot in module matplotlib.pyplot: plot(*args, **kwargs) Plot lines and/or markers to the :class:`~matplotlib.axes.Axes`. *args* is a variable length argument, allowing for multiple *x*, *y* pairs with an optional format string. For example, each of the following is legal:: plot(x, y) # plot x and y using default line style and color plot(x, y, 'bo') # plot x and y using blue circle markers plot(y) # plot y using x as index array 0..N-1 plot(y, 'r+') # ditto, but with red plusses If *x* and/or *y* is 2-dimensional, then the corresponding columns will be plotted.
當你搜尋如何繪製指定圖像時,matplotlib gallery也至關有用。每一個例子和它的源碼一同被提供。
一個較小的畫廊在這裏
最後,這裏有一個用戶郵件列表,那裏你能夠尋求幫助。一個開發者郵件列表是更加技術性的。
沒什麼好翻譯的,看原文吧……傳送門