matplotlib實際上是一套面向對象的繪圖庫,它所繪製的圖表中的每個繪圖元素,例如線條Line2D、文字Text、刻度等在記憶體中都有一個對象與之對應。為了方便快速繪圖matplotlib通過pyplot模塊提供了一套和MATLAB類似的繪圖API,將眾多繪圖對象所構成的複雜結構隱藏在這套API內 ...
matplotlib實際上是一套面向對象的繪圖庫,它所繪製的圖表中的每個繪圖元素,例如線條Line2D、文字Text、刻度等在記憶體中都有一個對象與之對應。
為了方便快速繪圖matplotlib通過pyplot模塊提供了一套和MATLAB類似的繪圖API,將眾多繪圖對象所構成的複雜結構隱藏在這套API內部。我們只需要調用pyplot模塊所提供的函數就可以實現快速繪圖以及設置圖表的各種細節。pyplot模塊雖然用法簡單,但不適合在較大的應用程式中使用。
為了將面向對象的繪圖庫包裝成只使用函數的調用介面,pyplot模塊的內部保存了當前圖表以及當前子圖等信息。當前的圖表和子圖可以使用plt.gcf()和plt.gca()獲得,分別表示"Get Current Figure"和"Get Current Axes"。在pyplot模塊中,許多函數都是對當前的Figure或Axes對象進行處理,比如說:
plt.plot()實際上會通過plt.gca()獲得當前的Axes對象ax,然後再調用ax.plot()方法實現真正的繪圖。
它的文檔相當完備,並且 Gallery頁面 中有上百幅縮略圖,打開之後都有源程式。因此如果你需要繪製某種類型的圖,只需要在這個頁面中瀏覽/複製/粘貼一下,基本上都能搞定。
可以在Ipython中輸入類似"plt.plot??"的命令查看pyplot模塊的函數是如何對各種繪圖對象進行包裝的。
1、pyplot.plot(*args, **kwargs)
這個函數有兩個參數,一個可變參數,一個命名參數。可變參數可以指定三個參數,x,y序列和線條格式字元串,下麵的例子是一些常用的搭配
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
如果沒有使用命名參數,那麼可以設置任意組的x,y,格式字元串,例如:
a.plot(x1, y1, 'g^', x2, y2, 'g-')
plot的返回值類型是matplotlib.lines.Line2D object
如果不指定plot會採用預設的線條和顏色,下麵給出線條和顏色的可設值
線條值
================ =============================== character description ================ =============================== ``'-'`` solid line style 實線 ``'--'`` dashed line style 虛線 ``'-.'`` dash-dot line style 虛點線 ``':'`` dotted line style 點線 ``'.'`` point marker 圓點作點 ``','`` pixel marker ``'o'`` circle marker 藍色圓圈作點 ``'v'`` triangle_down marker 下三角作點 ``'^'`` triangle_up marker 上三角作點 ``'<'`` triangle_left marker ``'>'`` triangle_right marker ``'1'`` tri_down marker ``'2'`` tri_up marker ``'3'`` tri_left marker ``'4'`` tri_right marker ``'s'`` square marker ``'p'`` pentagon marker ``'*'`` star marker ``'h'`` hexagon1 marker ``'H'`` hexagon2 marker ``'+'`` plus marker ``'x'`` x marker ``'D'`` diamond marker ``'d'`` thin_diamond marker ``'|'`` vline marker ``'_'`` hline marker ================ =============================== 顏色值 ========== ======== character color ========== ======== 'b' blue 'g' green 'r' red 'c' cyan 'm' magenta 'y' yellow 'k' black 'w' white ========== ========
命名參數可以用來設置線條的屬性,每個屬性都有一個set_...的方法,可以用來設置線條的標簽,線寬等等
字元串格式指定格式只是縮寫的形式,可以不用縮寫的形式,只用命名參數的形式設定線條的格式,示例如下
命名參數的屬性就是類matplotlib.lines.Line2D的屬性,對應的屬性有
2、plt.figure
plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=<class 'matplotlib.figure.Figure'>, **kwargs)
作用:創建一個新的figure或者返回當前已存在的figure
參數
num:可選參數,可以是整數或字元串如果沒有指定該參數,則會創建一個新figure,同時返回的figure對象里的num屬性自動加1;如果指定了該參數,那麼如果指定num的figure對象已存在,則返回這個已存在的figure對象,否則就創建一個新的figure對象。
figsize:可選參數,整形的元組,指定figure的寬度和長度,單位為英寸,預設值為[6.4, 4.8]
dpi:可選參數,指定figure的解析度,即每英寸多少個像素,預設值為100。
facecolor:背景顏色
edgecolor:邊框顏色
返回值:figure對象
說明:如果創建了很多figure對象,要確保對不用的figure對象調用了close方法,因為這有利於減少記憶體占用。
plt類的rcParams字典屬性定義了各屬性的預設值,這可以在matplotlibrc文件中修改,rcParams是一個字典類型,可以查看其全部的屬性值,也可以通過下標查看指定的屬性值,
例如:
plt還有 一個rc_params 函數,它返回配置字典rcParams
Matplotlib 使用配置文件 matplotlibrc 時的搜索順序如下:
- 當前路徑 : 程式的當前路徑
- 用戶配置路徑 : 通常為 HOME/.matplotlib/,可以通過環境變數MATPLOTLIBRC修改
- 系統配置路徑 : 保存在 matplotlib的安裝目錄下的 mpl-data 下
通過下麵的語句可以獲取用戶配置路徑:
>>> import matplotlib >>> matplotlib.get_configdir() 'C:\\Documents and Settings\\suntp\\.matplotlib'
通過下麵的語句可以獲得目前使用的配置文件的路徑:
matplotlib.matplotlib_fname() Out[2]: 'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc'
由於在當前路徑和用戶配置路徑中都沒有找到位置文件,因此最後使用的是系統配置路徑下的配置文件。
在matplotlib模塊載入的時候會調用rc_params,並把得到的配置字典保存到rcParams變數中
matplotlib將使用rcParams中的配置進行繪圖。用戶可以直接修改此字典中的配置,所做的改變會反映到此後所繪製的圖中。例如下麵的腳本所繪製的線將帶有圓形的點標識符:
>>> matplotlib.rcParams["lines.marker"] = "o" >>> import pylab >>> pylab.plot([1,2,3]) >>> pylab.show()
為了方便配置,可以使用rc函數,下麵的例子同時配置點標識符、線寬和顏色:
>>> matplotlib.rc("lines", marker="x", linewidth=2, color="red")
如果希望恢復到預設的配置(matplotlib載入時從配置文件讀入的配置)的話,可以調用 rcdefaults 函數。
>>> matplotlib.rcdefaults()
如果手工修改了配置文件,希望重新從配置文件載入最新的配置的話,可以調用:
>>> matplotlib.rcParams.update( matplotlib.rc_params() )
matplotlib所繪製的圖的每個組成部分都對應有一個對象,我們可以通過調用這些對象的屬性設置方法set_*或者pyplot的屬性設置函數setp設置其屬性值。例如plot函數返回一個 matplotlib.lines.Line2D 對象的列表,下麵的例子顯示如何設置Line2D對象的屬性:
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> x = np.arange(0, 5, 0.1) >>> line, = plt.plot(x, x*x) # plot返回一個列表,通過line,獲取其第一個元素 >>> # 調用Line2D對象的set_*方法設置屬性值 >>> line.set_antialiased(False) >>> # 同時繪製sin和cos兩條曲線,lines是一個有兩個Line2D對象的列表 >>> lines = plt.plot(x, np.sin(x), x, np.cos(x)) # >>> # 調用setp函數同時配置多個Line2D對象的多個屬性值 >>> plt.setp(lines, color="r", linewidth=2.0)
這段例子中,通過調用Line2D對象line的set_antialiased方法,關閉對象的反鋸齒效果。或者通過調用plt.setp函數配置多個Line2D對象的顏色和線寬屬性。
同樣我們可以通過調用Line2D對象的get_*方法,或者plt.getp函數獲取對象的屬性值:
>>> line.get_linewidth() 1.0 >>> plt.getp(lines[0], "color") # 返回color屬性 'r' >>> plt.getp(lines[1]) # 輸出全部屬性 alpha = 1.0 animated = False antialiased or aa = True axes = Axes(0.125,0.1;0.775x0.8) ... ...
註意getp函數只能對一個對象進行操作,它有兩種用法:
- 指定屬性名:返回對象的指定屬性的值
- 不指定屬性名:列印出對象的所有屬性和其值
matplotlib的整個圖表為一個Figure對象,此對象在調用plt.figure函數時返回,我們也可以通過plt.gcf函數獲取當前的繪圖對象:
>>> f = plt.gcf() >>> plt.getp(f) alpha = 1.0 animated = False ...
Figure對象有一個axes屬性,其值為AxesSubplot對象的列表,每個AxesSubplot對象代表圖表中的一個子圖,前面所繪製的圖表只包含一個子圖,當前子圖也可以通過plt.gca獲得:
>>> plt.getp(f, "axes") [<matplotlib.axes.AxesSubplot object at 0x05CDD170>] >>> plt.gca() <matplotlib.axes.AxesSubplot object at 0x05CDD170>
用plt.getp可以發現AxesSubplot對象有很多屬性,例如它的lines屬性為此子圖所包括的 Line2D 對象列表:
>>> alllines = plt.getp(plt.gca(), "lines") >>> alllines <a list of 3 Line2D objects> >>> alllines[0] == line # 其中的第一條曲線就是最開始繪製的那條曲線 True
通過這種方法我們可以很容易地查看對象的屬性和它們之間的包含關係,找到需要配置的屬性。
一個繪圖對象(figure)可以包含多個軸(axis),在Matplotlib中用軸表示一個繪圖區域,可以將其理解為子圖。上面的第一個例子中,繪圖對象只包括一個軸,因此只顯示了一個軸(子圖)。我們可以使用subplot函數快速繪製有多個軸的圖表。subplot函數的調用形式如下:
subplot(numRows, numCols, plotNum)
subplot將整個繪圖區域等分為numRows行 * numCols列個子區域,然後按照從左到右,從上到下的順序對每個子區域進行編號,左上的子區域的編號為1。如果numRows,numCols和plotNum這三個數都小於10的話,可以把它們縮寫為一個整數,例如subplot(323)和subplot(3,2,3)是相同的。subplot在plotNum指定的區域中創建一個軸對象。如果新創建的軸和之前創建的軸重疊的話,之前的軸將被刪除。
下麵的程式創建3行2列共6個軸,通過axisbg參數給每個軸設置不同的背景顏色。
for idx, color in enumerate("rgbyck"): plt.subplot(320+idx+1, axisbg=color) plt.show()
如果希望某個軸占據整個行或者列的話,可以如下調用subplot:
plt.subplot(221) # 第一行的左圖 plt.subplot(222) # 第一行的右圖 plt.subplot(212) # 第二整行 plt.show()
當繪圖對象中有多個軸的時候,可以通過工具欄中的Configure Subplots按鈕,互動式地調節軸之間的間距和軸與邊框之間的距離。如果希望在程式中調節的話,可以調用subplots_adjust函數,它有left, right, bottom, top, wspace, hspace等幾個關鍵字參數,這些參數的值都是0到1之間的小數,它們是以繪圖區域的寬高為1進行正規化之後的坐標或者長度。
Artist對象
matplotlib API包含有三層:
- backend_bases.FigureCanvas : 圖表的繪製領域
- backend_bases.Renderer : 知道如何在FigureCanvas上如何繪圖
- artist.Artist : 知道如何使用Renderer在FigureCanvas上繪圖
FigureCanvas和Renderer需要處理底層的繪圖操作,例如使用wxPython在界面上繪圖,或者使用PostScript繪製PDF。Artist則處理所有的高層結構,例如處理圖表、文字和曲線等的繪製和佈局。通常我們只和Artist打交道,而不需要關心底層的繪製細節。
Artists分為簡單類型和容器類型兩種。簡單類型的Artists為標準的繪圖元件,例如Line2D、 Rectangle、 Text、AxesImage 等等。而容器類型則可以包含許多簡單類型的Artists,使它們組織成一個整體,例如Axis、 Axes、Figure等。
直接使用Artists創建圖表的標準流程如下:
- 創建Figure對象
- 用Figure對象創建一個或者多個Axes或者Subplot對象
- 調用Axies等對象的方法創建各種簡單類型的Artists
下麵首先調用pyplot.figure輔助函數創建Figure對象,然後調用Figure對象的add_axes方法在其中創建一個Axes對象,add_axes的參數是一個形如[left, bottom, width, height]的列表,這些數值分別指定所創建的Axes對象相對於fig的位置和大小,取值範圍都在0到1之間:
>>> import matplotlib.pyplot as plt >>> fig = plt.figure() >>> ax = fig.add_axes([0.15, 0.1, 0.7, 0.3])
然後我們調用ax的plot方法繪圖,創建一條曲線,並且返回此曲線對象(Line2D)。
>>> line, = ax.plot([1,2,3],[1,2,1]) >>> ax.lines [<matplotlib.lines.Line2D object at 0x0637A3D0>] >>> line <matplotlib.lines.Line2D object at 0x0637A3D0>
ax.lines是一個為包含ax的所有曲線的列表,後續的ax.plot調用會往此列表中添加新的曲線。如果想刪除某條曲線的話,直接從此列表中刪除即可。
Axes對象還包括許多其它的Artists對象,例如我們可以通過調用set_xlabel設置其X軸上的標題:
>>> ax.set_xlabel("time")
如果我們查看set_xlabel的源代碼的話,會發現它是通過調用下麵的語句實現的:
self.xaxis.set_label_text(xlabel)
如果我們一直跟蹤下去,會發現Axes的xaxis屬性是一個XAxis對象:
>>> ax.xaxis
<matplotlib.axis.XAxis object at 0x06343230>
XAxis的label屬性是一個Text對象:
>>> ax.xaxis.label
<matplotlib.text.Text object at 0x06343290>
而Text對象的_text屬性為我們設置的值:
>>> ax.xaxis.label._text 'time'
這些對象都是Artists,因此也可以調用它們的屬性獲取函數來獲得相應的屬性:
>>> ax.xaxis.label.get_text() 'time'
Artist的屬性
圖表中的每個元素都用一個matplotlib的Artist對象表示,而每個Artist對象都有一大堆屬性控制其顯示效果。例如Figure對象和Axes對象都有patch屬性作為其背景,它的值是一個Rectangle對象。通過設置此它的一些屬性可以修改Figrue圖表的背景顏色或者透明度等屬性,下麵的例子將圖表的背景顏色設置為綠色:
>>> fig = plt.figure() >>> fig.show() >>> fig.patch.set_color("g") >>> fig.canvas.draw()
patch的color屬性通過set_color函數進行設置,屬性修改之後並不會立即反映到圖表的顯示上,還需要調用fig.canvas.draw()函數才能夠更新顯示。
下麵是Artist對象都具有的一些屬性:
- alpha : 透明度,值在0到1之間,0為完全透明,1為完全不透明
- animated : 布爾值,在繪製動畫效果時使用
- axes : 此Artist對象所在的Axes對象,可能為None
- clip_box : 對象的裁剪框
- clip_on : 是否裁剪
- clip_path : 裁剪的路徑
- contains : 判斷指定點是否在對象上的函數
- figure : 所在的Figure對象,可能為None
- label : 文本標簽
- picker : 控制Artist對象選取
- transform : 控制偏移旋轉
- visible : 是否可見
- zorder : 控制繪圖順序
Artist對象的所有屬性都通過相應的 get_* 和 set_* 函數進行讀寫,例如下麵的語句將alpha屬性設置為當前值的一半:
>>> fig.set_alpha(0.5*fig.get_alpha())
如果你想用一條語句設置多個屬性的話,可以使用set函數:
>>> fig.set(alpha=0.5, zorder=2)
使用前面介紹的 matplotlib.pyplot.getp 函數可以方便地輸出Artist對象的所有屬性名和值。
>>> plt.getp(fig.patch) aa = True alpha = 1.0 animated = False antialiased or aa = True ... ...
Figure容器
現在我們知道如何觀察和修改已知的某個Artist對象的屬性,接下來要解決如何找到指定的Artist對象。前面我們介紹過Artist對象有容器類型和簡單類型兩種,這一節讓我們來詳細看看容器類型的內容。
最大的Artist容器是matplotlib.figure.Figure,它包括組成圖表的所有元素。圖表的背景是一個Rectangle對象,用Figure.patch屬性表示。當你通過調用add_subplot或者add_axes方法往圖表中添加軸(子圖時),這些子圖都將添加到Figure.axes屬性中,同時這兩個方法也返回添加進axes屬性的對象,註意返回值的類型有所不同,實際上AxesSubplot是Axes的子類。
>>> fig = plt.figure() >>> ax1 = fig.add_subplot(211) >>> ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.3]) >>> ax1 <matplotlib.axes.AxesSubplot object at 0x056BCA90> >>> ax2 <matplotlib.axes.Axes object at 0x056BC910> >>> fig.axes [<matplotlib.axes.AxesSubplot object at 0x056BCA90>, <matplotlib.axes.Axes object at 0x056BC910>]
為了支持pylab中的gca()等函數,Figure對象內部保存有當前軸的信息,因此不建議直接對Figure.axes屬性進行列表操作,而應該使用add_subplot, add_axes, delaxes等方法進行添加和刪除操作。但是使用for迴圈對axes中的每個元素進行操作是沒有問題的,下麵的語句打開所有子圖的柵格。
for ax in fig.axes: ax.grid(True)
Figure對象可以擁有自己的文字、線條以及圖像等簡單類型的Artist。預設的坐標系統為像素點,但是可以通過設置Artist對象的transform屬性修改坐標系的轉換方式。最常用的Figure對象的坐標系是以左下角為坐標原點(0,0),右上角為坐標(1,1)。下麵的程式創建並添加兩條直線到fig中:
>>> from matplotlib.lines import Line2D >>> fig = plt.figure() >>> line1 = Line2D([0,1],[0,1], transform=fig.transFigure, figure=fig, color="r") >>> line2 = Line2D([0,1],[1,0], transform=fig.transFigure, figure=fig, color="g") >>> fig.lines.extend([line1, line2]) >>> fig.show()
註意為了讓所創建的Line2D對象使用fig的坐標,我們將fig.TransFigure賦給Line2D對象的transform屬性;為了讓Line2D對象知道它是在fig對象中,我們還設置其figure屬性為fig;最後還需要將創建的兩個Line2D對象添加到fig.lines屬性中去。
Figure對象有如下屬性包含其它的Artist對象:
- axes : Axes對象列表
- patch : 作為背景的Rectangle對象
- images : FigureImage對象列表,用來顯示圖片
- legends : Legend對象列表
- lines : Line2D對象列表
- patches : patch對象列表
- texts : Text對象列表,用來顯示文字
Axes容器
Axes容器是整個matplotlib庫的核心,它包含了組成圖表的眾多Artist對象,並且有許多方法函數幫助我們創建、修改這些對象。和Figure一樣,它有一個patch屬性作為背景,當它是笛卡爾坐標時,patch屬性是一個Rectangle對象,而當它是極坐標時,patch屬性則是Circle對象。例如下麵的語句設置Axes對象的背景顏色為綠色:
>>> fig = plt.figure() >>> ax = fig.add_subplot(111) >>> ax.patch.set_facecolor("green")
當你調用Axes的繪圖方法(例如plot),它將創建一組Line2D對象,並將所有的關鍵字參數傳遞給這些Line2D對象,並將它們添加進Axes.lines屬性中,最後返回所創建的Line2D對象列表:
>>> x, y = np.random.rand(2, 100) >>> line, = ax.plot(x, y, "-", color="blue", linewidth=2) >>> line <matplotlib.lines.Line2D object at 0x03007030> >>> ax.lines [<matplotlib.lines.Line2D object at 0x03007030>]
註意plot返回的是一個Line2D對象的列表,因為我們可以傳遞多組X,Y軸的數據,一次繪製多條曲線。
與plot方法類似,繪製直方圖的方法bar和繪製柱狀統計圖的方法hist將創建一個Patch對象的列表,每個元素實際上都是Patch的子類Rectangle,並且將所創建的Patch對象都添加進Axes.patches屬性中:
>>> ax = fig.add_subplot(111) >>> n, bins, rects = ax.hist(np.random.randn(1000), 50, facecolor="blue") >>> rects <a list of 50 Patch objects> >>> rects[0] <matplotlib.patches.Rectangle object at 0x05BC2350> >>> ax.patches[0] <matplotlib.patches.Rectangle object at 0x05BC2350>
一般我們不會直接對Axes.lines或者Axes.patches屬性進行操作,而是調用add_line或者add_patch等方法,這些方法幫助我們完成許多屬性設置工作:
>>> fig = plt.figure() >>> ax = fig.add_subplot(111) >>> rect = matplotlib.patches.Rectangle((1,1), width=5, height=12) >>> print rect.get_axes() # rect的axes屬性為空 None >>> rect.get_transform() # rect的transform屬性為預設值 BboxTransformTo(Bbox(array([[ 1., 1.], [ 6., 13.]]))) >>> ax.add_patch(rect) # 將rect添加進ax <matplotlib.patches.Rectangle object at 0x05C34E50> >>> rect.get_axes() # 於是rect的axes屬性就是ax <matplotlib.axes.AxesSubplot object at 0x05C09CB0> >>> # rect的transform屬性和ax的transData相同 >>> rect.get_transform() ... # 太長,省略 >>> ax.transData ... # 太長,省略 >>> ax.get_xlim() # ax的X軸範圍為0到1,無法顯示完整的rect (0.0, 1.0) >>> ax.dataLim._get_bounds() # 數據的範圍和rect的大小一致 (1.0, 1.0, 5.0, 12.0) >>> ax.autoscale_view() # 自動調整坐標軸範圍 >>> ax.get_xlim() # 於是X軸可以完整顯示rect (1.0, 6.0) >>> plt.show()
通過上面的例子我們可以看出,add_patch方法幫助我們設置了rect的axes和transform屬性。
下麵詳細列出Axes包含各種Artist對象的屬性:
- artists : Artist對象列表
- patch : 作為Axes背景的Patch對象,可以是Rectangle或者Circle
- collections : Collection對象列表
- images : AxesImage對象列表
- legends : Legend對象列表
- lines : Line2D對象列表
- patches : Patch對象列表
- texts : Text對象列表
- xaxis : XAxis對象
- yaxis : YAxis對象
下麵列出Axes的創建Artist對象的方法:
Axes的方法 | 所創建的對象 | 添加進的列表 |
annotate | Annotate | texts |
bars | Rectangle | patches |
errorbar | Line2D, Rectangle | lines,patches |
fill | Polygon | patches |
hist | Rectangle | patches |
imshow | AxesImage | images |
legend | Legend | legends |
plot | Line2D | lines |
scatter | PolygonCollection | Collections |
text | Text | texts |
下麵以繪製散列圖(scatter)為例,驗證一下:
>>> fig = plt.figure() >>> ax = fig.add_subplot(111) >>> t = ax.scatter(np.random.rand(20), np.random.rand(20)) >>> t # 返回值為CircleCollection對象 <matplotlib.collections.CircleCollection object at 0x06004230> >>> ax.collections # 返回的對象已經添加進了collections列表中 [<matplotlib.collections.CircleCollection object at 0x06004230>] >>> fig.show() >>> t.get_sizes() # 獲得Collection的點數 20
Axis容器
Axis容器包括坐標軸上的刻度線、刻度文本、坐標網格以及坐標軸標題等內容。刻度包括主刻度和副刻度,分別通過Axis.get_major_ticks和Axis.get_minor_ticks方法獲得。每個刻度線都是一個XTick或者YTick對象,它包括實際的刻度線和刻度文本。為了方便訪問刻度線和文本,Axis對象提供了get_ticklabels和get_ticklines方法分別直接獲得刻度線和刻度文本:
>>> pl.plot([1,2,3],[4,5,6]) [<matplotlib.lines.Line2D object at 0x0AD3B670>] >>> pl.show() >>> axis = pl.gca().xaxis
>>> axis.get_ticklocs() # 獲得刻度的位置列表 array([ 1. , 1.5, 2. , 2.5, 3. ])
>>> axis.get_ticklabels() # 獲得刻度標簽列表 <a list of 5 Text major ticklabel objects> >>> [x.get_text() for x in axis.get_ticklabels()] # 獲得刻度的文本字元串 [u'1.0', u'1.5', u'2.0', u'2.5', u'3.0']
>>> axis.get_ticklines() # 獲得主刻度線列表,圖的上下刻度線共10條 <a list of 10 Line2D ticklines objects>
>>> axis.get_ticklines(minor=True) # 獲得副刻度線列表 <a list of 0 Line2D ticklines objects>
獲得刻度線或者刻度標簽之後,可以設置其各種屬性,下麵設置刻度線為綠色粗線,文本為紅色並且旋轉45度:
>>> for label in axis.get_ticklabels(): ... label.set_color("red") ... label.set_rotation(45) ... label.set_fontsize(16) ...
>>> for line in axis.get_ticklines(): ... line.set_color("green") ... line.set_markersize(25) ... line.set_markeredgewidth(3)
最終的結果圖如下:
上面的例子中,獲得的副刻度線列表為空,這是因為用於計算副刻度的對象預設為NullLocator,它不產生任何刻度線;而計算主刻度的對象為AutoLocator,它會根據當前的縮放等配置自動計算刻度的位置:
>>> axis.get_minor_locator() # 計算副刻度的對象 <matplotlib.ticker.NullLocator instance at 0x0A014300> >>> axis.get_major_locator() # 計算主刻度的對象 <matplotlib.ticker.AutoLocator instance at 0x09281B20>
我們可以使用程式為Axis對象設置不同的Locator對象,用來手工設置刻度的位置;設置Formatter對象用來控制刻度文本的顯示。下麵的程式設置X軸的主刻度為pi/4,副刻度為pi/20,並且主刻度上的文本以pi為單位:
# -*- coding: utf-8 -*- import matplotlib.pyplot as pl from matplotlib.ticker import MultipleLocator, FuncFormatter import numpy as np x = np.arange(0, 4*np.pi, 0.01) y = np.sin(x) pl.figure(figsize=(8,4)) pl.plot(x, y) ax = pl.gca() def pi_formatter(x, pos): """ 比較羅嗦地將數值轉換為以pi/4為單位的刻度文本 """ m = np.round(x / (np.pi/4)) n = 4 if m%2==0: m, n = m/2, n/2 if m%2==0: m, n = m/2, n/2 if m == 0: return "0" if m == 1 and n == 1: return "$\pi$" if n == 1: return r"$%d \pi$" % m if m == 1: return r"$\frac{\pi}{%d}$" % n return r"$\frac{%d \pi}{%d}$" % (m,n) # 設置兩個坐標軸的範圍 pl.ylim(-1.5,1.5) pl.xlim(0, np.max(x)) # 設置圖的底邊距 pl.subplots_adjust(bottom = 0.15) pl.grid() #開啟網格 # 主刻度為pi/4 ax.xaxis.set_major_locator( MultipleLocator(np.pi/4) ) # 主刻度文本用pi_formatter函數計算 ax.xaxis.set_major_formatter( FuncFormatter( pi_formatter ) ) # 副刻度為pi/20 ax.xaxis.set_minor_locator( MultipleLocator(np.pi/20) ) # 設置刻度文本的大小 for tick in ax.xaxis.get_major_ticks(): tick.label1.set_fontsize(16) pl.show()
關於刻度的定位和文本格式的東西都在matplotlib.ticker中定義,程式中使用到如下兩個類:
- MultipleLocator : 以指定值的整數倍為刻度放置刻度線
- FuncFormatter : 使用指定的函數計算刻度文本,他會傳遞給所指定的函數兩個參數:刻度值和刻度序號,程式中通過比較笨的辦法計算出刻度值所對應的刻度文本
此外還有很多預定義的Locator和Formatter類,詳細內容請參考相應的API文檔。