性能#
无论是在交互模式下探索数据还是以编程方式保存大量绘图,渲染性能都可能成为管道中具有挑战性的瓶颈。Matplotlib 提供了多种方法来大大减少渲染时间,但代价是您的绘图外观略有变化(至可设置的容差)。可用于减少渲染时间的方法取决于正在创建的绘图类型。
线段简化#
对于具有线段的绘图(例如典型的线图、多边形的轮廓等),渲染性能可以通过
rcParams["path.simplify"]
(默认值:)True
和rcParams["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.plot
and Axes.plot
,markevery
都可以使用该参数:
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'])