パフォーマンス#

インタラクティブ モードでデータを探索する場合でも、プログラムで大量のプロットを保存する場合でも、レンダリング パフォーマンスはパイプラインの困難なボトルネックになる可能性があります。Matplotlib は、プロットの外観を (設定可能な許容値まで) わずかに変更することを犠牲にして、レンダリング時間を大幅に短縮する複数の方法を提供します。レンダリング時間を短縮する方法は、作成するプロットのタイプによって異なります。

線分の単純化#

線分を含むプロット (典型的な線プロット、多角形のアウトラインなど) の場合、レンダリング パフォーマンスは rcParams["path.simplify"](デフォルト: True) およびrcParams["path.simplify_threshold"](デフォルト: 0.111111111111) で制御できます。これらは、ファイルなどで定義できます (スタイルを使用した Matplotlib のカスタマイズmatplotlibrcを参照 )。ファイルの詳細については、sheets および rcParamsmatplotlibrcを参照してください)。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どこでも、パラメーターを使用できます。Line2Dpyplot.plotAxes.plotmarkevery

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')。多数のデータ ポイントがある場合、これは非常にコストのかかる計算になる可能性があります。この場合、特定の場所を提供することができます。

高速スタイルの使用#

高速スタイルを使用して、単純化およびチャンク パラメータを合理的な設定に自動的に設定し、大量のデータのプロットを高速化できます。次のコードはそれを実行します。

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

とても軽いので、他のスタイルとの相性も抜群です。他のスタイルが設定を上書きしないように、高速スタイルが最後に適用されていることを確認してください。

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