matplotlib(四)核心模式以及注意事項

  matplotlib擁有廣泛的代碼庫,對許多新用戶來說可能令人生畏。但是,大多數matplotlib用法都可以通過一個相當簡單的概念框架和一些重要知識來理解,所以,這篇博客主要介紹一些基本的使用模式、最佳實踐以及注意事項,讓你更深刻的認識matplotlib的工作方式。

matplotlib一般概念

提醒一句話:everything in matplotlib is organized in a hierarchy.

Parts of Image

這裏寫圖片描述

state-machine environment

  在層次結構的最頂部是matplotlib “state-machine environment”,它由matplotlib.pyplot模塊提供。在此級別,簡單函數用於將繪圖元素(線條,圖像,文本等)添加到當前圖形中的當前軸。Pyplot的 “state-machine environment”與MATLAB的行爲類似,對於具有MATLAB經驗的用戶來說應該是最熟悉的 。

Figure

  即整個圖像,該圖記錄了所有子軸,一些“特殊”的artist(標題,圖形圖例等)和畫布(不要過於糾結畫布,它是一個至關重要的,因爲它是實際上繪圖的對象,以獲得你的Plot內容,但作爲用戶它或多或少是不可見的)。一個圖像可以有任意數量的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 is

fig, ax_lst = plt.subplots(2, 2)  # a figure with a 2x2 grid of Axes

這裏寫圖片描述

Axes

  這就是所說的“plot”,它是具有數據空間的圖像區域。給定的圖形可以包含許多軸,但給定的Axes對象只能在一個圖中。 Axes包含兩個(或3D的三個)Axis對象(注意Axes和Axis之間的差異),它們負責數據限制(數據限制也可以通過set_xlim()set_ylim()來設置,每個Axes都有一個標題(通過set_title()設置),一個x標籤(通過set_xlabel()設置)和一個通過set_ylabel()設置的y標籤。

Axis

  這些是類似數字的對象,它們負責設置圖形限制並生成刻度線和ticklabels(標記刻度線的字符串)。刻度線的位置由Locator對象確定,ticklabel字符串由Formatter格式化。正確的定位器和格式化器的組合可以非常精確地控制刻度位置和標籤。

Artist

  基本上你在圖上看到的一切都是artist,這包括Text對象,Line2D對象,集合對象,Patch對象……。渲染圖形時,所有artist都被繪製到畫布上。大多數artist都與軸有關;這樣的artist不能被多個軸共享,也不能從一個軸移動到另一個軸。

matplotlib數據輸入

  所有繪圖函數都需要np.arraynp.ma.masked_array作爲輸入。像“array-like”的類(如pandas數據對象和np.matrix)可能會或可能不會按預期工作,最好在繪圖之前將它們轉換爲np.array對象。

matplotlib、pyplot、pylab

  • matplotlib是整個包;
  • matplotlib.pyplot是matplotlib中的一個模塊;
  • pylab是一個與matplotlib一起安裝的模塊;

  pylab是一個便利模塊,它在單個名稱空間中批量導入matplotlib.pyplot(用於繪圖)和numpy(用於數學和使用數組)。雖然之前許多示例使用pylab,但不再推薦使用它。 另外,對於非交互式繪圖,建議使用pyplot創建圖形,然後使用OO界面進行繪圖 。

Coding Style

編程風格很重要,對於matplotlib有兩種編程風格,這在python matplotlib入門(一)Matplotlib工作流程 就總結過,一是 MATLAB-style,這是一種類似於matlab的代碼風格;另一種是 OO-style,即面向對象的代碼風格。

Backends

  matplotlib針對許多不同的用例和輸出格式:有些人從python shell交互使用matplotlib,並在鍵入命令時彈出繪圖窗口;有些人將matplotlib嵌入到圖形用戶界面(如wxpython或pygtk)中以構建豐富的應用程序;其他人在批處理腳本中使用matplotlib從一些數值模擬生成postscript圖像;還有一些在Web應用程序服務器中生成posts動畫以動態提供圖形。 爲了支持所有這些用例,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()函數,則必須在導入matplotlib.pyplot之前完成此操作。導入pyplot後調用use()將不起作用。如果用戶想要使用不同的後端,則使用use()將需要更改代碼。因此,除非絕對必要,否則應避免顯式調用use()

Performance

  1. 使用快速樣式

    快速樣式可用於自動將簡化和分塊參數設置爲合理的設置,以加快繪製大量數據的速度。它可以通過運行簡單地使用:

    import matplotlib.style as mplstyle
    mplstyle.use('fast')
    
    
    # 也可以使用多個樣式組合,並確保fast在最後
    
    mplstyle.use(['dark_background', 'ggplot', 'fast'])
  2. 線分塊(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 plot
    
    y = np.random.rand(100000)
    y[50000:] *= 2
    y[np.logspace(1,np.log10(50000), 400).astype(int)] = -1
    
    mpl.rcParams['path.simplify'] = True
    
    mpl.rcParams['agg.path.chunksize'] = 0
    plt.plot(y)
    plt.show()
    
    mpl.rcParams['agg.path.chunksize'] = 10000
    plt.plot(y)
    plt.show()
  3. 標記簡化

    標記也可以簡化,儘管不如下面要介紹的線段簡化強大 。標記簡化僅適用於Line2D對象(通過屬性markevery)。無論何處傳遞Line2D構造參數,例如matplotlib.pyplot.plot()matplotlib.axes.Axes.plot(),更多請參考 Markevery Demo

    plt.plot(x, y, markevery=10)

  4. 線段簡化

    path.simplify參數是一個布爾值,表示線段是否簡化;path.simplify_threshold參數控制簡化的線段數量,更高的閾值會有更快的渲染。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    
    
    # Setup, and create the data to plot
    
    y = 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/9
    
    mpl.rcParams['path.simplify_threshold'] = 0.0
    plt.plot(y)
    plt.show()
    
    mpl.rcParams['path.simplify_threshold'] = 1.0
    plt.plot(y)
    plt.show()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章