性能#

无论是在交互模式下探索数据还是以编程方式保存大量绘图,渲染性能都可能成为管道中具有挑战性的瓶颈。Matplotlib 提供了多种方法来大大减少渲染时间,但代价是您的绘图外观略有变化(至可设置的容差)。可用于减少渲染时间的方法取决于正在创建的绘图类型。

线段简化#

对于具有线段的绘图(例如典型的线图、多边形的轮廓等),渲染性能可以通过 rcParams["path.simplify"](默认值:)TruercParams["path.simplify_threshold"](默认值:)来控制0.111111111111,可以在matplotlibrc文件中定义(参见 使用样式自定义 Matplotlib表和 rcParams以获取有关该matplotlibrc文件的更多信息)。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.plotand Axes.plotmarkevery都可以使用该参数:

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

markevery参数允许进行简单的二次采样,或尝试均匀间隔(沿x轴)采样。有关更多信息,请参阅 Markevery 演示

将行分割成更小的块#

如果您使用的是 Agg 后端(请参阅什么是后端?),那么您可以使用rcParams["agg.path.chunksize"](default: 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'])