У меня есть ряд функций, каждый из которых создает одну или несколько цифр. По мере создания рисунков ссылка добавляется в словарь, например:
self.figures['figureKey'] = figure()
В другой функции я хотел бы повторить этот словарь и сохранить каждую цифру; было бы неплохо использовать ключ словаря как часть или все имя файла. Мне удалось выполнить итерацию словаря, но функция figure()
, похоже, требует целого числа, соответствующего номеру фигуры, отклоняя ссылку, данную ключом.
for fig in self.figures:
figure(self.figures[fig]) #does not work
figure(fig) #also does not work
savefig(fig) #seems to let me use the key as a filename--nice
Я также попытался использовать `get_fignums() 'и перебрать возвращенный массив, но теряет связь с именами ключей. Возможно, можно разыменовать номер цифры из указателя фигуры? У кого-нибудь есть хороший подход к этому?
Пожалуйста, сопротивляйтесь тенденции начинать ответ с фразы "почему бы вам просто не...". Ответ на этот вопрос заключается в том, что это был не очевидный подход ко мне. Я вроде как новичок в этом.
Вы можете получить номер цифры из экземпляра рисунка. Из документов:
Возвращаемые фигурные объекты имеют атрибут number, содержащий это число.
Итак, чтобы получить цифру по номеру, вы можете сделать это:
figure(self.figures[fig].number)
У меня нет matplotlib, установленного только сейчас, чтобы проверить это.
Возможно, я в замешательстве относительно того, что вы делаете... Если вы просто хотите сохранить фигуру, почему бы не использовать метод fig
object savefig
?
pyplot.savefig
сохраняет активную фигуру, но с использованием метода экземпляра конкретного экземпляра fig.savefig
сохраняет этот конкретный рисунок, независимо от того, какой из них активен.
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
figures = [plt.figure() for _ in range(10)]
for i, fig in enumerate(figures):
ax = fig.add_subplot(111)
ax.plot(x, i*x)
ax.axis('equal')
for i, fig in enumerate(figures):
fig.savefig('temp_slope_%02i.png' % i)
Мне может быть что-то упущено (на самом деле не пользователь matplotlib), но разве вы не храните сами объекты фигуры в словаре? Если это так, вы можете перебирать и ключи и значения с помощью for key, value in self.figures.items()
, а затем получить номер цифры с помощью атрибута number
.
В качестве теста я попробовал использовать интерактивный интерпретатор:
>>> import matplotlib.pyplot as plt
>>> figures = {}
>>> figures['name1'] = plt.figure()
>>> plt.plot([1, 2, 3])
>>> figures['name2'] = plt.figure()
>>> plt.plot([6, 5, 4])
>>> for key, figure in figures.items():
... print 'Saving figure #%d as %s.' % (figure.number, key)
... plt.figure(figure.number)
... plt.savefig(key)
...
Saving figure #2 as name2
Saving figure #1 as name1
И оказалось, что работа: 2 графика (одно монотонно возрастающее и одно монотонно уменьшающееся) были сохранены как PNG файлы name1.png и name2.png в текущем каталоге.
savefig()
я понимаю, savefig()
сохраняет текущую фигуру, которая устанавливается путем вызова figure()
для существующего номера фигуры. Итак, что вы делаете (если я правильно истолковываю документы), сохраняем одну и ту же фигуру под тремя разными именами.
number
- мне даже интересно, добавлен ли атрибутnumber
pyplot.figure()
.