matplotlib(四)核心模式以及注意事项
??matplotlib擁有廣泛的代碼庫,對許多新用戶來說可能令人生畏。但是,大多數(shù)matplotlib用法都可以通過一個相當簡單的概念框架和一些重要知識來理解,所以,這篇博客主要介紹一些基本的使用模式、最佳實踐以及注意事項,讓你更深刻的認識matplotlib的工作方式。
matplotlib一般概念
提醒一句話:everything in matplotlib is organized in a hierarchy.
?
Parts of Image
state-machine environment
??在層次結構的最頂部是matplotlib “state-machine environment”,它由matplotlib.pyplot模塊提供。在此級別,簡單函數(shù)用于將繪圖元素(線條,圖像,文本等)添加到當前圖形中的當前軸。Pyplot的 “state-machine environment”與MATLAB的行為類似,對于具有MATLAB經驗的用戶來說應該是最熟悉的 。
Figure
??即整個圖像,該圖記錄了所有子軸,一些“特殊”的artist(標題,圖形圖例等)和畫布(不要過于糾結畫布,它是一個至關重要的,因為它是實際上繪圖的對象,以獲得你的Plot內容,但作為用戶它或多或少是不可見的)。一個圖像可以有任意數(shù)量的Axes,但是應該至少有一個。
fig = plt.figure() # an empty figure with no axes fig.suptitle('No axes on this figure') # Add a title so we know which it isfig, ax_lst = plt.subplots(2, 2) # a figure with a 2x2 grid of AxesAxes
??這就是所說的“plot”,它是具有數(shù)據(jù)空間的圖像區(qū)域。給定的圖形可以包含許多軸,但給定的Axes對象只能在一個圖中。 Axes包含兩個(或3D的三個)Axis對象(注意Axes和Axis之間的差異),它們負責數(shù)據(jù)限制(數(shù)據(jù)限制也可以通過set_xlim()和set_ylim()來設置,每個Axes都有一個標題(通過set_title()設置),一個x標簽(通過set_xlabel()設置)和一個通過set_ylabel()設置的y標簽。
Axis
??這些是類似數(shù)字的對象,它們負責設置圖形限制并生成刻度線和ticklabels(標記刻度線的字符串)。刻度線的位置由Locator對象確定,ticklabel字符串由Formatter格式化。正確的定位器和格式化器的組合可以非常精確地控制刻度位置和標簽。
Artist
??基本上你在圖上看到的一切都是artist,這包括Text對象,Line2D對象,集合對象,Patch對象……。渲染圖形時,所有artist都被繪制到畫布上。大多數(shù)artist都與軸有關;這樣的artist不能被多個軸共享,也不能從一個軸移動到另一個軸。
matplotlib數(shù)據(jù)輸入
??所有繪圖函數(shù)都需要np.array或np.ma.masked_array作為輸入。像“array-like”的類(如pandas數(shù)據(jù)對象和np.matrix)可能會或可能不會按預期工作,最好在繪圖之前將它們轉換為np.array對象。
matplotlib、pyplot、pylab
- matplotlib是整個包;
 - matplotlib.pyplot是matplotlib中的一個模塊;
 - pylab是一個與matplotlib一起安裝的模塊;
 
??pylab是一個便利模塊,它在單個名稱空間中批量導入matplotlib.pyplot(用于繪圖)和numpy(用于數(shù)學和使用數(shù)組)。雖然之前許多示例使用pylab,但不再推薦使用它。 另外,對于非交互式繪圖,建議使用pyplot創(chuàng)建圖形,然后使用OO界面進行繪圖 。
Coding Style
編程風格很重要,對于matplotlib有兩種編程風格,這在python matplotlib入門(一)Matplotlib工作流程 就總結過,一是 MATLAB-style,這是一種類似于matlab的代碼風格;另一種是 OO-style,即面向對象的代碼風格。
Backends
??matplotlib針對許多不同的用例和輸出格式:有些人從python shell交互使用matplotlib,并在鍵入命令時彈出繪圖窗口;有些人將matplotlib嵌入到圖形用戶界面(如wxpython或pygtk)中以構建豐富的應用程序;其他人在批處理腳本中使用matplotlib從一些數(shù)值模擬生成postscript圖像;還有一些在Web應用程序服務器中生成posts動畫以動態(tài)提供圖形。 為了支持所有這些用例,matplotlib可以針對不同的輸出,并且這些功能中的每一個都稱為后端。“前端”是面向用戶的代碼,即繪圖代碼;而“后端”完成幕后的所有艱苦工作以制作圖形。有兩種類型的后端:用戶界面后端和硬拷貝后端來制作圖像文件(PNG,SVG,PDF,PS)。
# 方法1 #The backend parameter in your matplotlibrc file (see Customizing Matplotlib with style sheets and rcParams):backend : WXAgg # use wxpython with antigrain (agg) rendering# 方法2 # If your script depends on a specific backend you can use the use() function:import matplotlib matplotlib.use('PS') # generate postscript output by default注意:如果使用use()函數(shù),則必須在導入matplotlib.pyplot之前完成此操作。導入pyplot后調用use()將不起作用。如果用戶想要使用不同的后端,則使用use()將需要更改代碼。因此,除非絕對必要,否則應避免顯式調用use()。
Performance
使用快速樣式
快速樣式可用于自動將簡化和分塊參數(shù)設置為合理的設置,以加快繪制大量數(shù)據(jù)的速度。它可以通過運行簡單地使用:
import matplotlib.style as mplstyle mplstyle.use('fast')# 也可以使用多個樣式組合,并確保fast在最后mplstyle.use(['dark_background', 'ggplot', 'fast'])線分塊(chunk)
# 僅適用于以agg作為后端時import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcParams['path.simplify_threshold'] = 1.0# Setup, and create the data to ploty = np.random.rand(100000) y[50000:] *= 2 y[np.logspace(1,np.log10(50000), 400).astype(int)] = -1mpl.rcParams['path.simplify'] = Truempl.rcParams['agg.path.chunksize'] = 0 plt.plot(y) plt.show()mpl.rcParams['agg.path.chunksize'] = 10000 plt.plot(y) plt.show()標記簡化
標記也可以簡化,盡管不如下面要介紹的線段簡化強大 。標記簡化僅適用于Line2D對象(通過屬性markevery)。無論何處傳遞Line2D構造參數(shù),例如matplotlib.pyplot.plot()和matplotlib.axes.Axes.plot(),更多請參考 Markevery Demo
plt.plot(x, y, markevery=10)
線段簡化
path.simplify參數(shù)是一個布爾值,表示線段是否簡化;path.simplify_threshold參數(shù)控制簡化的線段數(shù)量,更高的閾值會有更快的渲染。
import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl# Setup, and create the data to ploty = np.random.rand(100000) y[50000:] *= 2 y[np.logspace(1, np.log10(50000), 400).astype(int)] = -1 mpl.rcParams['path.simplify'] = True# simplify_threshold 默認是1/9mpl.rcParams['path.simplify_threshold'] = 0.0 plt.plot(y) plt.show()mpl.rcParams['path.simplify_threshold'] = 1.0 plt.plot(y) plt.show()總結
以上是生活随笔為你收集整理的matplotlib(四)核心模式以及注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Matplotlib(三) rcPara
 - 下一篇: matplotlib(五)排版布局