不使用子流程,是否有一种方法可以将matplotlib中的多个单独的图一次存储在内存中?

时间:2018-08-31 20:45:25

标签: python matplotlib

通常一个人会输入

 import matplotlib.pyplot as plt
 import numpy as np
 x = np.random.randint(1, 100, 500)
 plt.hist(x)
 plt.savefig(mypath) # or plt.show()

但是,说我想创建多个图,并且在创建所有图之前,我不想保存其中的任何一个。我尝试执行以下操作

import importlib
plots = [importlib.import_module('matplotlib.pyplot') for _ in range(5)]
for plot in plots:
    plot.hist(np.random.randint(1,100, 500))

但是当我跑步

plots[0].savefig(mypath) # or plots[0].show()

我得到这样的东西:

enter image description here

很明显,导入matplotlib.pyplot并不重要,因为它总是那样。

如果我不想在阅读后修改任何图像,可以执行以下操作:

import io
import matplotlib.pyplot as plt

fig_files = [io.BytesIO() for _ in range(5)]

for f in fig_files:
    plt.hist(np.random.randint(1, 100, 500))
    plt.savefig(f) # save to BytesIO object
    plt.gcf().clear() # clear out plot so subsequent ones don't overlap like above image
    f.seek(0) # move to beginning of buffer so it can be read

for i, f in enumerate(fig_files):
    with open('test_img_%d.png' % i, 'wb') as out:
        out.write(f.read())

这将允许我将绘图存储在内存中,直到完成处理为止。如果我想避免不必要的磁盘写入,但仍然希望在此过程中压缩/简化数据,那么这很好。但是,如果我想修改绘图的不同方面(例如,我想在查看所有数据后调整比例,则我的标题/字幕会根据整体结果而改变,等等)。

有什么方法可以将图的状态存储在内存中,以便以后可以对其进行修改,然后然后写入磁盘/显示出来?

1 个答案:

答案 0 :(得分:1)

就像您要存储在内存中的其他内容一样,您可以将绘图分配给变量。

最好也直接使用面向对象的方法来操纵对象。

import matplotlib.pyplot as plt
import numpy as np

fig1, ax1 = plt.subplots()
x1 = np.random.randint(1, 100, 500)
ax1.hist(x1)

fig2, ax2 = plt.subplots()
x2 = np.random.randint(1, 100, 500)
ax2.hist(x2)

fig1.savefig("mypath.png")
fig2.savefig("myotherpath.png")

您也可以将数字存储在列表中,例如

import matplotlib.pyplot as plt
import numpy as np

figures = []
for i in range(3):
    fig, ax = plt.subplots()
    x = np.random.randint(1, 100, 500)
    ax.hist(x)
    figures.append(fig)

for i,fig in enumerate(figures):
    fig.savefig("mypath{}.png".format(i))