Matplotlib Tutorial(译)
Matplotlib Tutorial(譯)
翻譯自:Matplotlib tutorialNicolas P. Rougier - Euroscipy 2012
- toc
{: toc}
這個教程基于可以從scipy lecture note得到的 Mike Müller的教程。
源代碼可從這里獲得。圖像在figures文件夾內,所有的腳本位于scripts文件夾。
所有的代碼和材料以Creative Commons Attribution 3.0 United States License (CC-by)發布。
特別感謝Bill Wing和Christoph Deil的檢查和校正。
引言
matplotlib大概是被使用最多的二維繪圖Python包。它不僅提供一個非常快捷的用python可視化數據的方法,而且提供了出版質量的多種格式圖像。我們將要探索matplotlib包含最常見情況的交互模式。
Ipython 和 pylab模式
IPython是一個增強的Python交互shell,它擁有很多有趣的特性包括被命名的輸入與輸出,可使用shell命令,增強的調試和許多其它特性。當我們在命令參數中用-pylab(自從IPython0.12版變成--pylab),它容許交互的matplotlib會話有像Matlab/Mathematica樣的功能。
pylab
pylab提供了一個針對matplotlib面向對象繪圖庫的程序界面。它模仿Matlab(TM)開發。因此,pylab大部分的繪圖命令和參數和Matlab(TM)相似。重要的命令被交互示例解釋。
簡單繪圖
在這一部分,我們想在同一個圖片中繪制正弦和余弦函數。從默認設置開始,我們將一步一步地改進使它看上去更棒。
首先獲得正弦和余弦函數的數據:
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$'])移動軸線(spine)
軸線(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 ))圖像,子區,子圖,刻度(Figures,Subplots,Axes,Ticks)
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)
圖像是一個圖形用戶界面的窗口,以”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方法來設置圖像屬性。
子區(subplots)
你可以通過subplot在正常網格中布置圖像。你需要指定行數和列數和區域的編號。注意gridspec命令是個更強大的選擇。
子圖(axes)
子圖和子區(subplot)非常相似,但是允許把圖片放置到圖像(figure)中的任何地方。所以如果我們想要在一個大圖片中嵌套一個小點的圖片,我們通過子圖(axes)來完成它。
刻度(ticks)
良好格式化的刻度是準備發表的圖片中的重要部分。Matplotlib為刻度提供完全可配置的系統。刻度定位器指定刻度出現的位置,刻度格式器讓刻度看起來如你所愿。主刻度和次要刻度可以分別放置和格式化,每個默認主刻度并不顯示,也就是,它們只有一個空列表,因為它們作為空定位器(NullLocator)(參見下面)。
刻度定位器(Tick Locator)
這有幾個針對不同種類需求的各種定位器:
| 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命令。
點擊圖片獲取答案。
散點圖(scatter plots)
從以下代碼開始,嘗試生成上邊的圖形,注意標記大小,顏色和透明度。
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)角度給出。
點擊圖像獲取答案。
條形圖(bar plots)
從以下代碼開始,嘗試生成上邊的圖形,添加標簽和紅色條形。
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()提示:你要注意文本對齊。
點擊圖像獲取答案。
等高線圖(contour plots)
從以下代碼開始,嘗試生成上邊的圖形,注意色彩表。(參見色彩表)
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命令。
點擊圖像獲取答案。
Imshow
從以下代碼開始,嘗試生成上邊的圖形,添加標簽和紅色條形。
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)。
點擊圖像獲取答案。
餅圖(Pie charts)
從以下代碼開始,嘗試生成上邊的圖形,添加標簽和紅色條形。
from pylab import *n = 20 Z = np.random.uniform(0,1,n) pie(Z), show()提示:你需要改變Z。
點擊圖像獲取答案。
矢量圖(quiver plots)
從以下代碼開始,嘗試生成上邊的圖形,注意色彩和方向。
from pylab import *n = 8 X,Y = np.mgrid[0:n,0:n] quiver(X,Y), show()提示:你需要畫兩次箭頭。
點擊圖像獲取答案。
網格(grids)
從以下代碼開始,嘗試生成上邊的圖形,添加標簽和紅色條形。
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 Axes3Dfig = 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受益于豐富的文檔和巨大的用戶和開發者社區。這有幾個有關的鏈接:
教程
pyplot教程
圖像教程
文本教程
artist對象教程
路徑教程
變換教程
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 lengthargument, allowing for multiple *x*, *y* pairs with anoptional format string. For example, each of the following islegal::plot(x, y) # plot x and y using default line style and colorplot(x, y, 'bo') # plot x and y using blue circle markersplot(y) # plot y using x as index array 0..N-1plot(y, 'r+') # ditto, but with red plussesIf *x* and/or *y* is 2-dimensional, then the corresponding columnswill be plotted.畫廊(Galleries)
當你搜尋如何繪制指定圖像時,matplotlib gallery也相當有用。每個例子和它的源碼一同被提供。
一個較小的畫廊在這里
郵件列表
最后,這里有一個用戶郵件列表,那里你可以尋求幫助。一個開發者郵件列表是更加技術性的。
快速參考
沒什么好翻譯的,看原文吧……傳送門
線條屬性
線型
標記
色彩表
from:?http://reverland.org/python/2012/09/07/matplotlib-tutorial/#ipython--pylab
總結
以上是生活随笔為你收集整理的Matplotlib Tutorial(译)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐几个好玩又有难度的编程网站
- 下一篇: 利用 Bootstrap 进行快速 We