Python 繪圖包 Matplotlib Introductory(開場)
這些教程涵蓋了使用 Matplotlib 建立視覺化的基礎知識,以及有效使用包的一些最佳實踐。
可以簡單的繪製出直方圖,功率圖,條形圖,誤差圖,散點圖等。 https://matplotlib.org/tutorials/introductory/sample_plots.html 示例相簿
https://matplotlib.org/gallery/index.html 縮圖庫
Matplotlib 有大量的程式碼庫,可能會讓許多新使用者卻步,然而 Matplotlib 的大部分內容只需要一個相當簡單的概念框架和一些重要的知識點就可以理解。
繪圖需要在一定範圍的層次上進行操作,從最一般的層次(contour this 2-D array )到最具體的層次(color this screen pixel red )。繪圖包的目的是通過所有必要的控制。即:大部分時間使用相對高階的命令,並且在需要時仍然能使用低階命令—幫助儘可能容易地完成視覺化資料。
因此 Matplotlib 中的所有內容都被組織在一個 層次結構 中,位於層次結構頂部的是 Matplotlib “狀態機環境”,由 Matplotlib.pyplot 模組提供。在這個級別上使用簡單的函式向當前圖形的當前軸新增繪圖元素(線條、影象、文字等)。
Pyplot 的狀態機環境的行為類似於 MATLAB,對於具有 MATLAB 經驗的使用者來說應該是最熟悉的。
層次結構的下一個級別是面向物件介面的第一個級別,其中 pyplot 僅用於圖形建立等少數函式,使用者顯示建立並跟蹤圖形和軸物件。在這個級別上使用者使用 pyplot 建立圖形,並通過這些圖形建立一個或多個軸物件,然後這些軸物件用於大多數繪圖操作。
Parts of a Figure(圖中的部件):
Figure(圖):
完整的一個圖。該圖保留追蹤到的所有子 軸域 、一些 Matplotlib 中特有的 Artist(藝術家物件。如:標題,角色說明等)和 canvas 。(不要過於擔心 canvas ,這一點非常重要,雖然實際上是這個物件繪製出了你的圖,但是作為使用者來說或多或少是不可見的)。一個圖形可以有任意數量的 軸域 ,但為了有用,至少應該有一個 軸域 。
建立一個新圖形最簡單的方法是用 pyplot:
import matplotlib.pyplot as plt;
fig = plt.figure()# an empty figure with no axes
fig.suptitle('No axes on this figure')# Add a title so we know which it is
fig, ax_lst = plt.subplots(2, 2)# a figure with a 2x2 grid of Axes
plt.show();
Axes(軸域):
所謂的“圖”,它的區域是影象和資料的 作用域 。一個給定的圖形可以包含多個軸域,但是一個給定的軸域物件只能在一個圖中。軸域包含兩個(或三個 3D 情況下)軸線物件(注意:Axes(軸域)金額 Axis(軸線)之間的區別),它們(指軸域)負責資料範圍(資料範圍也可以通過 set_xlim() 和 set_ylim() 軸域方法進行控制)。每個軸域都有一個標題(通過 set_title() 設定)、一個 x-label (通過 set_xlabel() 設定)和 y-label 通過 set_ylabel() 設定。Axes 類及其成員函式是使用 OO 介面的主要介面點。
Axis(軸線):
它們類似 number-line-like 物件。負責設定圖形限制並生成刻度(軸線上的標記)和ticklael(刻度標籤)。刻度的位置由 Locator 物件確定,刻度標籤的線的格式由 Formatter 物件設定。正確的 Locator 和 Formatter 程式組合可以很好地控制刻度位置和標籤。
Artist(藝術家):
基本上,在圖形上看到的所有東西都是藝術家( Artistd 物件 )(甚至包括 Figure,Axes,Axis 物件等)。這包括 Text(文字)物件,Line2D 物件, collection(集合) 物件,Patch(修補)物件等等(你懂的)。當圖形繪製時,所有的 Artist(藝術家)被畫到 Canvas(畫布)上。大多數 Artist(藝術家)都繫結在一個 Axes(軸域)物件上,這樣的 Artist(藝術家)不能被多個 Axes(軸域)物件共享,也不能從一個 Axes(軸域)物件移動到另一個 Axes(軸域)物件上。
plotting (繪圖)函式所支援的資料型別:
所有 plotting 函式都支援 np.array 或 np.ma.masked_array 資料。array-like 形式的物件和
pandas 資料類有可能支援。最好在影象繪製前將資料物件轉換為 np.array 物件。
Matplotlib、pyplot 和 pylab 之間的關係:
Matplotlib 是整個包;Matplotlib.pyplot 是 Matplotlib 中的一個模組;pylab 是與 Matplotlib 一起安裝的模組。
Pyplot 為底層 繪相簿物件 提供 state-machine 介面。state-machine 會自動和以使用者無感的方式建立 Figures(圖)物件 和 axes (軸域),以實現所需的繪圖操作。例如:
import matplotlib.pyplot as plt;
import numpy as np;
x = np.linspace(0, 2, 100);
plt.plot(x, x,label = 'linear');
plt.plot(x, x**2, label = 'quadratic');
plt.plot(x, x**3, label = 'cubic');
plt.xlabel('X 標註');
plt.ylabel('Y 標註');
plt.title('標題');
plt.legend();
plt.show();
對 plt.plot() 的第一個呼叫將自動建立 Figure 和 Axes 物件,以實現所需的繪圖。對 plt.plot() 後續的呼叫會重複使用當前 Axes 物件,並每次新增一行。設定 title 標題、legend 圖例等,都會使用當前 Axes 物件,設定相應的 Artist(藝術家)。
Pylab 是一個便捷的模組,它在一個名稱空間中被批量匯入 Matplotlib.pyplot(用於繪圖)和 Numpy(用於數學和陣列)。Pylab 是不推薦使用的,並且由於名稱空間汙染強烈禁止使用它。請使用 pyplot 替代。
對於 non-interactive(非互動式)繪圖,建議使用 pyplot 建立圖形,然後使用 OO 介面進行繪圖。
Coding Styles (編碼風格)
在檢視此文件和示例時,您將發現不同的編碼風格和使用模式。這些風格是完全有效的,並有它們的優點和缺點。幾乎所有的例子都可以轉換成另一種風格,並得到相同的結果。唯一需要注意的是要避免為自己的程式碼混合編碼風格。
注意
Matplotlib 的開發人員必須遵循特定的風格和指導方針。參見 Matplotlib 開發者指南 。
在不同的風格中,有兩種是官方支援的。因此這些是使用 Matplotlib 的首選方法。
對於 pyplot 風格,指令碼匯入通常是:
import matplotlib.pyplot as plt
import numpy as np
然後呼叫,例如,np.arange、np.zeros、np.pi、plt.figure、plt.plot、plt.show 等等。使用 pyplot 介面建立圖形,然後使用 object 方法建立其餘的圖形:
x = np.arange(0, 10, 0.2) y = np.sin(x) fig, ax = plt.subplots() ax.plot(x, y) plt.show()
那麼,在例子中為什麼不使用 Matlab 風格(它依賴於全域性變數和淺的名稱空間)而使用另外的方式?對於像這個例子非常簡單,僅用在學術(學習)上;用複雜的風格程式設計,會更清楚的知道程式執行的來龍去脈和發生了什麼。對複雜程式來說,這種明確性和清晰性會越來越重要,更豐富和更完整的面向物件介面可能會使程式更容易編寫和維護。
很多情況下,會發現自己一遍又一遍地繪製相同的圖表,但使用的資料集不同,這導致需要編寫專門的函式來繪製圖表。 函式如下:
import matplotlib.pyplot as plt;
import numpy as np;
def my_plotter(ax, data1, data2, param_dict):
"""
A helper function to make a graph
Parameters
----------
ax : Axes
The axes to draw to
data1 : array
The x data
data2 : array
The y data
param_dict : dict
Dictionary of kwargs to pass to ax.plot
Returns
-------
out : list
list of artists added
"""
out = ax.plot(data1, data2, **param_dict)
return out
# which you would then use as:
data1, data2, data3, data4 = np.random.randn(4, 100)
fig, ax = plt.subplots(1, 1)
my_plotter(ax, data1, data2, {'marker': 'x'})
plt.show()
如果想同時生成兩個圖:
fig, (ax1, ax2) = plt.subplots(1, 2) my_plotter(ax1, data1, data2, {'marker': 'x'}) my_plotter(ax2, data3, data4, {'marker': 'o'})
當然,對於這個例子來說,這樣的程式設計風格麻煩了,但是一旦圖表變得稍微複雜一些,風格說帶來的回報就體現出來了。
Backends(後端)
什麼是後端?
網站和郵件列表中的許多文件都提到了“Backends(後端)”,許多新使用者對這個術語感到困惑。Matplotlib 針對許多不同的案例和輸出格式。有些從 python shell 互動式地使用 Matplotlib 當輸入命令時,會彈出繪圖視窗。有些執行 Jupyter 筆記本並繪製內聯圖以便快速進行資料分析。還有些將 Matplotlib 嵌入到圖形介面中,比如 wxpython 或 pygtk,以構建富應用程式。也可以批處理指令碼中使用 Matplotlib 從資料模擬中生成 postscript 影象,更可以執行 web 應用伺服器來動態提供圖形。
為了支援所有案例,Matplotlib 可以針對不同的輸出, 這些功能中的每一個都稱為後端(也就是 Matplotlib 開發者的程式碼),反之“前端”是面向使用者的程式碼,即:繪圖程式碼 ,而“後端”完成所有在幕後製作圖形的工作。有兩種型別的後端:使用者介面後端(用於 pygtk、wxpython、tkinter、qt4 或 macosx;也稱“互動式後端”)和用於生成影象檔案的硬拷貝後端(PNG、SVG、PDF、PS;也稱為“非互動式後端”)。
有四種配置後端的方法。如果它們彼此衝突,可以使用下面列表中最後提到的方法,例如呼叫 use() 將覆蓋 Matplotlibrc 中的配置。
1:Matplotlibrc 檔案中的後端引數( 參照樣式表和 rcParams 自定義 Matplotlib ) :
backend : WXAgg<em># use wxpython with antigrain (agg) rendering</em>
2:為當前 shell 或單個指令碼設定 MPLBACKEND 環境變數。 在 Unix 上:
export MPLBACKEND=module://my_backend python simple_plot.py MPLBACKEND="module://my_backend" python simple_plot.py
在 Windows 上,只有樣例可以:
set MPLBACKEND=module://my_backend python simple_plot.py
設定這個環境變數將覆蓋任何 Matplotlibrc 中的後端引數,即使當前工作目錄中有 Matplotlibrc。因此在全域性設定 MPLBACKEND,例如在 .bashrc 和 .profile,可能會導致與預期相反的結果,所以不推薦使用。
3:如果指令碼依賴於特定的後端,可以使用 use() 函式:
<strong>import</strong> <strong>matplotlib</strong> matplotlib.use('PS')<em># generate postscript output by default</em>
如果使用 use() 函式,則必須在匯入 matplotlib.pyplot 之前完成。在引入 pyplot 之後呼叫 use() 將不起作用。如果使用者希望使用不同的後端,那麼使用 use() 將需要對程式碼進行更改。所以除非絕對必要,因此應該避免顯示呼叫 use()。
注意:
後端名稱規範不區分大小寫; 例如,"GTK3Agg"和"gtk3agg"是等效的。