通常一个人会输入
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()
我得到这样的东西:
很明显,导入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())
这将允许我将绘图存储在内存中,直到完成处理为止。如果我想避免不必要的磁盘写入,但仍然希望在此过程中压缩/简化数据,那么这很好。但是,如果我想修改绘图的不同方面(例如,我想在查看所有数据后调整比例,则我的标题/字幕会根据整体结果而改变,等等)。
有什么方法可以将图的状态存储在内存中,以便以后可以对其进行修改,然后然后写入磁盘/显示出来?
答案 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))