性能
无论是以交互方式探索数据,还是以编程方式保存大量绘图,渲染过程都可能是一件痛苦的事。
Matplotlib提供了几种方法来大大减少渲染时间,代价是你的图的外观有一点变化(到一个可设置的公差)。减少渲染时间的方法取决于要创建的图的类型。
线段简化
对于具有线段的图(例如典型的线图、多边形轮廊等),渲染性能可以通过rcParams["path.simply”] 来控制。(默认值:true)和rcParams[“path.simplify_threshold”] (默认: 0.111111111111),它可以在matplotlibrc文件中定义(有关mat plot libc文件的更多信息,请参阅使用样式表和rcParams定制Matplotlib)。
rcParams[“path.simplify”] (默认值: (true)是一个布尔值,它指示线段是否被简化。
rcParams[“path.simplify_threshold”]控制简化线段的数量,较高的闻值导致更快的渲染。
下面的脚本将首先显示没有任何简化的数据,然后显示相同的数据与简化。尝试与它们两个互动:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# 设置并创建要绘制的数据
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构造参数(例如matplotlib.pyplot.plot() 和 matplotlib.axes.Axes.plot(),的地方。
使用marketeverv参数:
plt.plot(x, y, markevery=10)
marketevery该参数允许简单的二次采样,或尝试均匀间隔(沿x轴)取样。查看/gallery/lines_bars_and_markers/markevery_demo了解更多信息。
将行分割成更小的块
如果您使用的是Age后端(请参阅什么是后端?),那么您可以使用rcParams[“agg.path.chunksize”](默认:0)这允许您指定一个块大小,并且任何具有大于该数量的顶点的行将被拆分为多个行,每个行的顶点数不超过agg.path.chunksize。 (除非agg.path.chunksize为0,在这种情况下不存在分块。) 对于某些类型的数据,将线条划分为合理的大小可以大大减少渲染时间。
下面的脚本将首先显示没有任何块大小限制的数据,然后显示相同的数据,块大小为10000。当图形很大时,最能看出差异,尝试最大化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'])
脚本的总运行时间:(0分2.263秒)