在matplotlib中,为什么用较细的线条绘图会更快?

Dan*_*ein 12 python macos numpy matplotlib scipy

今天我偶然发现了这一点:如果线宽小于1.0,似乎在matplotlib中绘制线要快得多.我只在Mac上测试了这个,但效果似乎很强.

例如,如果您尝试使用此代码,您将看到数据绘制速度提高约10倍,线宽为0.5而不是线宽为1.0.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,10,20000)
y = np.sin(x) + np.random.random(len(x))*0.1

plt.ion()
plt.show()

plt.plot(x,y,lw=0.5)
plt.draw()

plt.figure()

plt.plot(x,y,lw=1.0)
plt.draw()
Run Code Online (Sandbox Code Playgroud)

我用这段代码制作了线宽和速度之间关系的图表:

import numpy as np
import matplotlib.pyplot as plt
import time

x = np.linspace(0,10,10000)
y = np.sin(x) + np.random.random(len(x))*0.1

plt.ion()
plt.show()

linewidths = np.linspace(2,0,20)
times = []

for lw in linewidths:
    t = time.time()

    plt.plot(x,y,lw=lw)
    plt.draw()

    times.append(time.time()-t)

    plt.figure()



plt.ioff()
plt.plot(linewidths[1:],times[1:],'ro')

plt.xlabel('Linewidth (points)')
plt.ylabel('Time (seconds)')
plt.show()
Run Code Online (Sandbox Code Playgroud)

这是结果: 在此输入图像描述

使用小于1.0的线宽可提供~10倍的加速,而在1.0之后,时间会线性增加.如果数据点的数量很大,大于约5000点左右,我只会观察到这种效应.我觉得如果我要求matplotlib显示更多的像素,那么制作绘图可能需要更长的时间,但我并不期望使用略小的线宽(0.5对1.0)的巨大加速.

谁能解释为什么会这样?我很高兴发现它,因为它使显示大型数据集的速度更快.


有人认为这可能是MacOSX后端特有的.这似乎很可能.如果我尝试以png格式保存绘图而不是将它们绘制到屏幕上,则时间似乎更随机分布: 在此输入图像描述

Dan*_*ein 1

有人可能可以用更彻底的答案来替换它,但这种效果似乎是 MacOSX 后端独有的,因为将数字保存为 png 时它不会出现。绘图时间似乎也受到 Matplotlib 版本的影响(1.3.x 与 1.3.0)。但是,Mac 用户似乎可以通过将线宽减小到小于 1.0 的值来享受大型数据集的加速。