Без использования подпроцессов, есть ли способ сохранить несколько отдельных графиков из matplotlib в памяти одновременно? - PullRequest
0 голосов
/ 31 августа 2018

Обычно можно набрать

 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 голосов
/ 01 сентября 2018

Точно так же, как и с другими вещами, которые вы хотите сохранить в памяти, вы бы назначали свои графики переменным.

Лучше всего также использовать объектно-ориентированный подход к манипулированию объектами.

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...