性能#

无论是在交互模式下探索数据还是以编程方式保存大量绘图,渲染性能都可能是您管道中的一个具有挑战性的瓶颈。 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'])