性能#
无论是在交互模式下探索数据,还是通过编程方式保存大量绘图,渲染性能都可能是您工作流程中一个具有挑战性的瓶颈。Matplotlib 提供了多种方法来大幅缩短渲染时间,但代价是您的绘图外观会略有变化(在可设置的容差范围内)。可用的渲染时间缩短方法取决于正在创建的绘图类型。
线段简化#
对于包含线段的绘图(例如典型的线图、多边形轮廓等),渲染性能可以通过 rcParams["path.simplify"]
(默认值:True
)和 rcParams["path.simplify_threshold"]
(默认值:0.111111111111
)进行控制,这些参数可以在例如 matplotlibrc
文件中定义(有关 matplotlibrc
文件的更多信息,请参阅 通过样式表和rc参数自定义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
文件。或者,用户可以为交互式绘图(最大简化)创建一个新样式,并为出版质量绘图(最小简化)创建另一个样式,并根据需要激活它们。有关如何执行这些操作的说明,请参阅 通过样式表和rc参数自定义Matplotlib。
简化工作原理是迭代地将线段合并为一个向量,直到下一个线段到该向量的垂直距离(在显示坐标空间中测量)大于 path.simplify_threshold
参数。
注意
线段简化方式的更改是在 2.1 版本中进行的。在 2.1 版本之前,这些参数仍会改善渲染时间,但在 2.1 及更高版本中,某些类型数据的渲染时间将大幅改善。
标记点子采样#
标记点也可以被简化,尽管不如线段那么健壮。标记点子采样仅适用于 Line2D
对象(通过 markevery
属性)。凡是传递 Line2D
构造参数的地方,例如 pyplot.plot
和 Axes.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'])