【问题标题】:In matplotlib, why is it faster to plot with thinner lines?在 matplotlib 中,为什么用更细的线绘制更快?
【发布时间】:2013-09-25 03:55:00
【问题描述】:

我今天偶然发现:如果线宽小于 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()

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

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

结果如下:

使用小于 1.0 的线宽可提供约 10 倍的加速,在 1.0 之后,时间线性增加。如果数据点的数量很大,我只观察到这种效果,大于大约 5000 个点左右。对我来说,如果我要求 matplotlib 显示更多像素,那么绘制绘图可能需要更长的时间,但我没想到使用稍小的线宽(0.5 对 1.0)会带来巨大的加速。

谁能解释为什么会发生这种情况?我很高兴发现它,因为它可以更快地显示大型数据集。


有些人认为这可能特定于 MacOSX 后端。这似乎很可能。如果我尝试以 png 格式保存图而不是将它们绘制到屏幕上,则时间似乎更随机分布:

【问题讨论】:

  • 有趣。它似乎不依赖于别名,因为至少在我的机器上,即使对于所有线宽,线别名也设置为 True。
  • 我认为这很可能取决于操作系统或后端。在 Mac Lion 上,使用后端 Qt4Agg,使用你的脚本,我得到的点随机分布在 0.081 秒左右,所以粗线基本上不会慢。
  • 我猜这与 Agg 级别的细节有关,但@flebool 似乎说这不是 Agg 的错。您使用的是什么后端/操作系统/版本? (matplotlib.get_backend()matplotlib.__version__
  • 我已经在我的 linux 机器上试用了 GTK、Qt 和 WX,但它们都没有表现出这种行为——它看起来像是 Mac 特有的怪癖。有趣!
  • 是的,使用您的代码我会收到消息:python3.3 matplotlib_speed.py /opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/matplotlib/pyplot.py:412: RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (matplotlib.pyplot.figure) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParam figure.max_num_figures). max_open_warning, RuntimeWarning)

标签: python macos numpy matplotlib scipy


【解决方案1】:

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

【讨论】:

  • 请注意使用macos后端和在mac上使用*Agg后端
猜你喜欢
  • 2018-10-13
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多