性能#

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

将线条分成更小的块#

如果您使用的是 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'])