效能#

無論是在互動模式下探索資料,還是在程式中儲存大量的繪圖,渲染效能都可能是您流程中的一個挑戰瓶頸。Matplotlib 提供了多種方法來大幅減少渲染時間,但會略微改變您的繪圖外觀(可設定容差)。減少渲染時間的方法取決於正在建立的繪圖類型。

線段簡化#

對於具有線段的繪圖(例如典型的折線圖、多邊形輪廓等),渲染效能可以通過 rcParams["path.simplify"] (預設:True) 和 rcParams["path.simplify_threshold"] (預設:0.111111111111) 來控制,這些可以在例如 matplotlibrc 檔案中定義(有關 matplotlibrc 檔案的更多資訊,請參閱 使用樣式表和 rcParams 自訂 Matplotlib)。rcParams["path.simplify"] (預設:True) 是一個布林值,指示是否要簡化線段。rcParams["path.simplify_threshold"] (預設:0.111111111111) 控制線段的簡化程度;較高的閾值會導致更快的渲染速度。

以下腳本會先顯示沒有任何簡化的資料,然後顯示簡化後的相同資料。嘗試與它們互動

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.geomspace(10, 50000, 400).astype(int)] = -1
mpl.rcParams['path.simplify'] = True

mpl.rcParams['path.simplify_threshold'] = 0.0
plt.plot(y)
plt.show()

mpl.rcParams['path.simplify_threshold'] = 1.0
plt.plot(y)
plt.show()

Matplotlib 目前預設的保守簡化閾值為 1/9。若要變更預設設定以使用不同的值,請變更 matplotlibrc 檔案。或者,使用者可以為互動式繪圖(最大簡化)建立新的樣式,並為出版品質的繪圖(最小簡化)建立另一個樣式,並在需要時啟用它們。有關如何執行這些動作的說明,請參閱 使用樣式表和 rcParams 自訂 Matplotlib

簡化的工作原理是反覆將線段合併為單個向量,直到下一個線段與向量的垂直距離(以顯示座標空間測量)大於 path.simplify_threshold 參數。

注意

與線段簡化方式相關的變更是在 2.1 版中進行的。在 2.1 版之前,這些參數仍然可以提高渲染時間,但對於某些資料類型,在 2.1 版及更高版本中,渲染時間將會大幅改善。

標記子取樣#

標記也可以簡化,儘管不如線段那麼強大。標記子取樣僅適用於 Line2D 物件(透過 markevery 屬性)。在任何傳遞 Line2D 建構參數的地方,例如 pyplot.plotAxes.plot,可以使用 markevery 參數

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

markevery 引數允許簡單的子取樣,或嘗試均勻間隔(沿著 x 軸)取樣。有關更多資訊,請參閱 Markevery 示範

將線條分割成更小的區塊#

如果您使用的是 Agg 後端(請參閱 什麼是後端?),則可以使用 rcParams["agg.path.chunksize"] (預設:0)。這允許使用者指定區塊大小,並且任何頂點數大於該值的線條都將被分割成多條線條,每條線條的頂點數都不超過 agg.path.chunksize。(除非 agg.path.chunksize 為零,在這種情況下不會進行區塊化。)對於某些資料類型,將線條區塊化為合理的尺寸可以大大減少渲染時間。

以下腳本會先顯示沒有任何區塊大小限制的資料,然後顯示區塊大小為 10,000 的相同資料。當圖表很大時,差異最為明顯,請嘗試最大化 GUI,然後與它們互動

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.geomspace(10, 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()

圖例#

軸的預設圖例行為會嘗試尋找覆蓋最少資料點的位置 (loc='best')。如果有大量的資料點,這可能是一個非常耗費資源的計算。在這種情況下,您可能需要提供一個特定的位置。

使用 fast 樣式#

fast 樣式可以用於自動將簡化和區塊化參數設定為合理的設定,以加快繪製大量資料的速度。以下程式碼執行它

import matplotlib.style as mplstyle
mplstyle.use('fast')

它非常輕巧,因此可以很好地與其他樣式一起使用。請確保最後應用 fast 樣式,以便其他樣式不會覆蓋設定

mplstyle.use(['dark_background', 'ggplot', 'fast'])