性能#
无论是在交互模式下探索数据,还是以编程方式保存大量图表,渲染性能都可能成为您工作流程中的一个挑战性瓶颈。Matplotlib 提供了多种方法,可以在稍微改变(到一个可设置的容差)图表外观的情况下,大大减少渲染时间。可用于减少渲染时间的方法取决于正在创建的图表类型。
线段简化#
对于包含线段的图(例如典型的线图、多边形的轮廓等),渲染性能可以通过 rcParams["path.simplify"] (default: True) 和 rcParams["path.simplify_threshold"] (default: 0.111111111111) 来控制,这些可以在 matplotlibrc 文件中定义(有关 matplotlibrc 文件的更多信息,请参见 使用样式表和rcParams自定义Matplotlib)。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.plot 和 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')。如果有大量数据点,这可能是一个非常昂贵的计算。在这种情况下,您可能希望提供一个特定的位置。
使用 快速 样式#
可以使用 fast 样式来自动将简化和分块参数设置为合理的值,以加快绘制大量数据的绘图速度。以下代码运行它:
import matplotlib.style as mplstyle
mplstyle.use('fast')
它非常轻量,因此与其他样式配合得很好。确保快速样式最后应用,以便其他样式不会覆盖设置:
mplstyle.use(['dark_background', 'ggplot', 'fast'])