性能#

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

线段简化#

对于具有线段的绘图(例如,典型的折线图,多边形轮廓等),可以通过 rcParams["path.simplify"] (default: True) 和 rcParams["path.simplify_threshold"] (default: 0.111111111111) 来控制渲染性能,例如,可以在 matplotlibrc 文件中定义它们(有关 使用样式表和 rcParams 自定义 Matplotlib 文件的更多信息,请参阅 matplotlibrc ). rcParams["path.simplify"] (default: True) 是一个布尔值,指示是否简化线段. rcParams["path.simplify_threshold"] (default: 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"] (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'])