Как перебрать словарь ссылок на рисунки matplotlib

1

У меня есть ряд функций, каждый из которых создает одну или несколько цифр. По мере создания рисунков ссылка добавляется в словарь, например:

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() 'и перебрать возвращенный массив, но теряет связь с именами ключей. Возможно, можно разыменовать номер цифры из указателя фигуры? У кого-нибудь есть хороший подход к этому?

Пожалуйста, сопротивляйтесь тенденции начинать ответ с фразы "почему бы вам просто не...". Ответ на этот вопрос заключается в том, что это был не очевидный подход ко мне. Я вроде как новичок в этом.

Теги:
matplotlib

3 ответа

1
Лучший ответ

Вы можете получить номер цифры из экземпляра рисунка. Из документов:

Возвращаемые фигурные объекты имеют атрибут number, содержащий это число.

Итак, чтобы получить цифру по номеру, вы можете сделать это:

figure(self.figures[fig].number)

У меня нет matplotlib, установленного только сейчас, чтобы проверить это.

  • 0
    Ваше решение работает как шарм. Спасибо за ссылку на документацию, хотя, кроме того, что есть атрибут «число», я не нашел его в виде таблицы или в документации для pyplot_api или figure_api. Я полагаю, что здесь не должно быть исчерпывающих описаний классов.
  • 0
    @ 2NinerRomeo, это было единственное место, где я нашел упоминание об атрибуте number - мне даже интересно, добавлен ли атрибут number pyplot.figure() .
2

Возможно, я в замешательстве относительно того, что вы делаете... Если вы просто хотите сохранить фигуру, почему бы не использовать метод 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)
  • 0
    Это полезно знать, что каждый экземпляр имеет свой собственный метод .savefig
1

Мне может быть что-то упущено (на самом деле не пользователь 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 в текущем каталоге.

  • 0
    savefig() я понимаю, savefig() сохраняет текущую фигуру, которая устанавливается путем вызова figure() для существующего номера фигуры. Итак, что вы делаете (если я правильно истолковываю документы), сохраняем одну и ту же фигуру под тремя разными именами.
  • 0
    @senderle, ты прав. Добавление некоторых данных в сюжет показало мою ошибку. Я обновил свой ответ примером, который действительно работает в моей системе.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню