Matplotlib学习笔记(第二章 2.11性能与图例)

性能

无论是以交互方式探索数据,还是以编程方式保存大量绘图,渲染过程都可能是一件痛苦的事。

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秒)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值