Matplotlib: как показать фигуру, которая была закрыта

У меня есть функция, которая возвращает Figure созданный с помощью pyplot . Эта функция закрывает фигуру перед ее возвратом. Если бы я не закрыл его, показать его было бы очень просто с помощью plt.show() , но предположим, что я не могу этого сделать.

Я могу легко сохранить возвращенный Figure в файл, но я не могу найти способ его отображения (т. Е. Иметь всплывающее окно, показывающее рисунок).

 from matplotlib import pyplot as plt def new_figure(): fig = plt.figure() plt.plot([0, 1], [2, 3]) plt.close(fig) return fig fig = new_figure() fig.savefig('output.svg') fig.show() 

Как мне показать фигуру?

One Solution collect form web for “Matplotlib: как показать фигуру, которая была закрыта”

Когда plt.close вызывается на экземпляр figure , фактически уничтожается графический интерфейс ( FigureManager ), который используется для отображения фигуры на экране (см. Комментарий JoeKington в Matplotlib: повторите открытие закрытой фигуры? ). Таким образом, экземпляр фигуры все еще существует и не был уничтожен. Чтобы снова отобразить фигуру на экране, нам пришлось бы каким-то образом восстановить интерфейс для замены того, который был уничтожен при вызове plt.close(fig) .

Это можно сделать, просто создав новую фигуру с помощью plt.figure() , «краду» своего менеджера и используя ее для отображения фигуры, которую мы хотим показать на экране. В качестве альтернативы можно вручную восстановить интерфейс для отображения рисунка с помощью инструментария GUI. Я предоставляю пример с PySide, используя бэкенд Qt4Agg. Кроме того, есть хороший пример, который показывает, как это можно сделать с Tkinter (TkAgg) здесь: http://matplotlib.org/examples/user_interfaces/embedding_in_tk.html (я тоже тестировал этот подход и он работает).

Подход к макету:

Это решение основано на том, как закрыть окно show (), но сохранить фигуру в живых? и получение диспетчера фигур через интерфейс OO в Matplotlib . Инструментарий GUI, который используется для построения графического интерфейса для отображения фигуры на экране, зависит от бэкэнд, который используется matplotlib. Если бэкэнд используется TkAgg , TkInter даст некоторое предупреждение в Python 2.7, которое можно игнорировать (см. Этот пост в python bug tracker ).

 import matplotlib.pyplot as plt def new_figure(): fig = plt.figure() plt.plot([0, 1], [2, 3]) plt.close(fig) return fig def show_figure(fig): # create a dummy figure and use its # manager to display "fig" dummy = plt.figure() new_manager = dummy.canvas.manager new_manager.canvas.figure = fig fig.set_canvas(new_manager.canvas) if __name__ == '__main__': fig = new_figure() show_figure(fig) plt.show() 

Подход Pyside:

Это заключается в восстановлении GUI с новым холстом и панелью инструментов для отображения экземпляра fig на экране.

Важное примечание: приведенный ниже код должен быть выполнен в новой выделенной консоли Python (нажмите F6), если он запускается из Spyder , поскольку Spyder также является приложением Qt, которое запускает собственный QApplication (см. Скрипт PySide Qt не запускается из Spyder, но работает с оболочка ).

 import matplotlib matplotlib.use('Qt4Agg') matplotlib.rcParams['backend.qt4']='PySide' from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT import matplotlib.pyplot as plt from PySide import QtGui import sys def new_figure(): fig = plt.figure() plt.plot([0, 1], [2, 3]) plt.close(fig) return fig class myFigCanvas(QtGui.QWidget): def __init__(self, fig, parent=None): super(myFigCanvas, self).__init__(parent) #---- create new canvas and toolbar -- canvas = FigureCanvasQTAgg(fig) toolbar = NavigationToolbar2QT(canvas, self) #---- setup layout of GUI ---- grid = QtGui.QGridLayout() grid.addWidget(canvas, 0, 0) grid.addWidget(toolbar, 1, 0) self.setLayout(grid) if __name__ == '__main__': app = QtGui.QApplication(sys.argv) fig = new_figure() new_canvas = myFigCanvas(fig) new_canvas.show() sys.exit(app.exec_()) 

что приводит к:

введите описание изображения здесь

  • Как установить стиль по умолчанию в Bokeh?
  • Matplotlib: аннотирование 3D-графика
  • Большой участок: ~ 20 миллионов образцов, гигабайт данных
  • Как заставить matplotlib открывать окно для комментариев пользователей?
  • Частичная раскраска текста в matplotlib
  • Matplotlib: колчан и imshow накладывается, как я могу установить две цветные панели?
  • Две соответствующие оси y
  • ImportError: нет модуля с именем _backend_gdk
  • Как использовать кросс-спектральную плотность для расчета фазового сдвига двух связанных сигналов
  • Python - лучший язык программирования в мире.