【问题标题】:plotting too many lines in matplotlib: out of memory在 matplotlib 中绘制太多行:内存不足
【发布时间】:2018-02-01 23:49:17
【问题描述】:

我需要在一个绘图中绘制 ~2000x300 行。 例如类似的东西,但有 300 条曲线(每条 2000 个数据点)而不是此处显示的 4 条曲线: example plot

首先我设置了图:

fig, ax = plt.subplots(figsize=(8, 8))

然后我做了很多次:

drawnLine = plt.Line2D([Xstart, Xfinish], [Ystart,Yfinish], 1, linestyle='solid', color='b')
ax.add_artist(drawnLine)

最后我想做的是:

fig.savefig(ExpFolder + 'NewFig.png')

但是脚本达到 8GB 内存限制并停止。

【问题讨论】:

  • 您真的需要全部 2000 个数据点吗?不能接受平滑或二次采样?
  • 您当然可以尝试使用LineCollection 而不是单独的行。这将更有效率。 (如果低于内存限制就足够了,但是,我不知道)如果您对此有疑问,请提供问题的minimal reproducible example

标签: python matplotlib


【解决方案1】:

是的,matplotlib 并不是世界上内存效率最高的库。

现在,600,000 个片段真的很多,如果你在纯粹的天真的软件绘图中做到这一点,嗯,不酷。

我的建议是你放弃 matplotlib 的画布方法:

  • 考虑固定的图像大小(以像素为单位),并直接将线条渲染到该画布上。您可以对使用matplotlibimagesc 和配偶展示的图像进行一些技巧来做到这一点,但实际上,那时您并没有让您的生活更轻松。因此,选择任何允许您将像素绘制到位图上的 python 库。有一些。
  • 考虑一些不尝试在软件中绘制 600,000 行的东西 - 我正在考虑直接与您的图形硬件对话。
  • 只需使用比 matplotlib 效率低的更少的东西。我喜欢pyqtgraph

pyqtgraph 示例:

import pyqtgraph as pg
from PyQt4.QtGui import QApplication
import numpy
N=20
x = numpy.random.poisson(lam=0.01, size=(N,2000))
y = numpy.random.normal(size=(N,2000))
p = pg.plot()
for x_,y_ in zip(x,y):
    p.addItem(pg.PlotDataItem(x_,y_))
QApplication.instance().exec_()

【讨论】:

  • 非常感谢。我实际上在为 win_x64 安装 PyQt4 时遇到问题。可以用什么东西代替这个包吗?很抱歉问了一些简单的问题,我对 python 图形的经验为零。
  • @PetyaLidsky 我很久没用过windows了,但是pyqtgraph.org的Windows amd64安装程序不应该正是你需要的吗?
  • 对于 pyqt4 / Q4 依赖,请参阅stackoverflow.com/questions/22640640/…
【解决方案2】:

感谢大家。 最后,最佳解决方案是使用 matplotlib.collections,正如 ImportanceOfBeingErnest 所建议的那样。

【讨论】:

    猜你喜欢
    • 2011-01-22
    • 2021-07-18
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多