Использовать цифры matplotlib на другом рисунке matplotlib?

#python #python-3.x #matplotlib

#python #python-3.x #matplotlib

Вопрос:

Итак, у меня есть функция, которая вводит некоторые данные и возвращает цифру matplotlib. Вот как это выглядит (поскольку я имею дело с очень специфическими данными внутри моей функции, я не могу предоставить минимальный рабочий пример, но мой вопрос больше касается общих вещей).

  def foo(data):
     fig, ax= plt.subplots()
     ...
     return fig
  

Эта функция работает отлично, если я хочу, чтобы появилось изображение, я просто вызываю foo(data).show() и все в порядке.

Моя проблема в том, что я готов в другой части кода (не в том же файле) использовать эти цифры на более общем рисунке. Например, у меня могут быть foo(data1) , foo(data2) и foo(data3) , которые я хочу поместить в строку на том же рисунке matplotlib.

На самом деле, я не знаю, возможно ли это сделать в Matplotlib и как это сделать.

Ответ №1:

Создайте свои fig и ax вне функции и передайте ax в качестве параметра значение по умолчанию (таким образом, мы можем создать ax в функции для сохранения обратной совместимости:

 def foo(data, ax=None):
   if ax is None:
      _, ax = plt.subplots()
  

Это позволяет вам по-прежнему вызывать foo(data) , как и раньше.

Если вам нужно отобразить эту «функцию» несколько раз, как запрошено, тогда:

 fig, axes = plt.subplots(nrows=3)

foo(data1, axes[0])
foo(data2, axes[1])
foo(data3, axes[2])
  

Если fig это также требуется, либо передайте его в качестве параметра функции, либо получите к нему доступ через ax.figure . Код станет:

 def foo(data, ax=None):
   if ax is None:
      fig, ax = plt.subplots()
   else:
      fig, ax = ax.figure, ax
  

Комментарии:

1. В моей foo функции, к которой я делаю несколько вызовов fig , я попробовал ваше решение, но получаю следующую ошибку: NameError: имя ‘fig’ не определено, должен ли я передать fig также в качестве параметра?

2. Либо вы передаете fig в качестве параметра, либо получаете к нему доступ из ax.figure (я думаю, это работает ^^)