【问题标题】:Keeping matplotlib images in-memory until it is ready to be plotted将 matplotlib 图像保存在内存中,直到它准备好被绘制
【发布时间】:2020-09-03 14:44:28
【问题描述】:

我有一种情况,我在一个循环中执行一些计算,然后绘制结果并为每个图分配一个分数。最后,我按分数降序对图进行排序。也许需要上四分之一,其余的被丢弃。然后我用保存的图像生成一个 html 文件。

绘图和保存会减慢该过程。有没有办法将 matplotlib 图像存储在内存中?

对于 MCVE,请考虑以下代码。

from matplotlib import pyplot as plt
import random

score_list = []
for a in range(50):
    score = random.random()
    fig = plt.figure()
    ax = plt.subplot2grid((1, 1), (0, 0))
    ax.plot([0, 0], [1, 1], 'r--')
    fig.savefig('{}.png'.format(a))
    plt.close(fig)
    score_list.append(['{}.png'.format(a), score])

sorted_score_list = sorted(score_list, key=lambda x: x[1], reverse=True)
print(sorted_score_list)

MCVE 可能过度简化了问题。得分实际上决定了绘制的内容。携带这些信息并延迟绘图是不可撤销的,但我想知道是否有其他解决方案可以在内存中保留一定数量的图像。

【问题讨论】:

  • 为什么不将您的数字附加到列表中?
  • 你的意思是 score_list.append([fig, score])?有时 matplotlib 会写入同一个图形。我还需要在循环中使用 plt.close(fig) 吗?
  • 如果您每次都创建一个新图形,则不应该这样做。您甚至可以不将它们存储在列表中,稍后使用get_fignums 访问它们
  • 你介意写一个答案让我测试一下吗?

标签: python matplotlib in-memory


【解决方案1】:

您可以通过影响您的图形的特定索引然后使用相同的索引获取它们来实现您想要的:

from matplotlib import pyplot as plt
import random

score_list = []
for a in range(50):
    score = random.random()
    fig = plt.figure(a)
    ax = plt.subplot2grid((1, 1), (0, 0))
    ax.plot([0, 0], [1, 1], 'r--')
    score_list.append(['{}'.format(a), score])

sorted_score_list = sorted(score_list, key=lambda x: x[1], reverse=True)

# Saving the first 10 ones by score
for idx, score in sorted_score_list[:10]:
    fig = plt.figure(idx)
    fig.savefig('{}.png'.format(idx))
    plt.close(fig)

【讨论】:

  • 如果我前面有几个 for 循环,比如 a、b、c,它会起作用吗?我可以这样分配吗:fig = plt.figure((a,b,c))?
  • 否,但您可以使用简单的编码来计算您的索引。 (比如100*a+10*b+c,如果你的循环不大于10),或者使用字符串“abc”(不过这将是你的情节的标题)。但请记住,这是非常低效的内存。你最好推迟 IHMO 的绘图。
  • 现在,我的解决方案是在分数上设置一个截止值,如果它低于截止值,则根本不绘制它。这似乎将地块数量减少了 80%。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 2012-03-26
  • 2011-12-10
  • 1970-01-01
相关资源
最近更新 更多