效能#
無論是在互動模式下探索資料,還是在程式中儲存大量的繪圖,渲染效能都可能是您流程中的一個挑戰瓶頸。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.plot
和 Axes.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'])