2014-03-29 7 views
4

사용하기 matplotlib : 하기 matplotlib 쇼 그림을 다시

from matplotlib import pyplot as plt 

figure = plt.figure() 

ax = figure.add_subplot(111) 
ax.plot(x,y) 

figure.show() # figure is shown in GUI 

# How can I view the figure again after I closed the GUI window? 

figure.show() # Exception in Tkinter callback... TclError: this isn't a Tk application 
figure.show() # nothing happened 

그래서 제 질문은 다음과 같습니다

  1. 어떻게 내가 figure.show라고 한 뒤 경우 이전 플롯을 얻을 수 있습니다()?

  2. 숫자가 많기 때문에 from pylab import *; plot(..); show()이 (가) 해결책이 아닌 것 같습니다. figure.add_suplot(111)에 대한보다 편리한 대안이 있습니까?

그리고 내가 간절히 원하는 것은 stuff이 한 장의 사진으로 배열 된 모든 플롯을 포함하는 객체입니다

showfunc(stuff) # or 
stuff.showfunc() 

이며, showfunc가 상태입니다 (내 말은, 내가 그것을 호출 할 때마다, 나는 동작 마치 처음으로 불렀던 것처럼). matplotlib으로 작업 할 때 이것이 가능합니까?

+0

여기에 어떤 문제가 있는지 명확하지 않습니다. 어떤 이전 음모를 말하는 겁니까? – ebarr

+0

@ebarr 즉, GUI 창을 닫은 후에 어떻게 그림을 다시 볼 수 있습니까? 'figure'와'plot'을 다시 만드시겠습니까? 나는이 일을하는 더 좋은 방법이 있어야한다고 생각합니다. –

+0

그래서'show'는 스크립트에서 한 번만 실행해야합니다. Tk 메인 루프가 실행되기 시작합니다. 문서에서는 "v1.0.0의 새로운 기능 : show가 GUI 주 루프를 이미 시작한 경우에만 시작하므로 표시 할 호출이 여러 번 허용됩니다." 이 기능이 필요한 기능에 대한 정보를 추가 할 수 있습니까? GUI를 구축하고 있습니까, 아니면 차례대로 플롯을보고 싶습니까? – ebarr

답변

2

나는 만족스러운 답변을 찾을 수없는, 그래서 나는 matplotlib.figure.Figure을 확장하는 사용자 정의 Figure 클래스를 작성하고 gtk.Window 객체를 호출 할 때마다 생성 새로운 show() 방법을 제공함으로써이 문제를 처리합니다.

import gtk 
import sys 
import os 
import threading 

from matplotlib.figure import Figure as MPLFigure 
from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas 
from matplotlib.backends.backend_gtkagg import NavigationToolbar2GTKAgg as NaviToolbar 


class ThreadFigure(threading.Thread): 
    def __init__(self, figure, count): 
     threading.Thread.__init__(self) 
     self.figure = figure 
     self.count = count 
    def run(self): 
     window = gtk.Window() 
     # window.connect('destroy', gtk.main_quit) 

     window.set_default_size(640, 480) 
     window.set_icon_from_file(...) # provide an icon if you care about the looks 

     window.set_title('MPL Figure #{}'.format(self.count)) 
     window.set_wmclass('MPL Figure', 'MPL Figure') 

     vbox = gtk.VBox() 
     window.add(vbox) 

     canvas = FigureCanvas(self.figure) 
     vbox.pack_start(canvas) 

     toolbar = NaviToolbar(canvas, window) 
     vbox.pack_start(toolbar, expand = False, fill = False) 

     window.show_all() 
     # gtk.main() ... should not be called, otherwise BLOCKING 


class Figure(MPLFigure): 
    display_count = 0 
    def show(self): 
     Figure.display_count += 1 
     thrfig = ThreadFigure(self, Figure.display_count) 
     thrfig.start() 

이 파일을 IPython의 시작 파일로 사용하십시오. 및

figure = Figure() 
ax = figure.add_subplot(211) 
... (same story as using standard `matplotlib.pyplot`) 
figure.show() 

# window closed accidentally or intentionally... 

figure.show() 
# as if `.show()` is never called 

Works! 나는 결코 GUI 프로그래밍을 접한 적이 없으며 이것이 부작용이 있는지를 모른다. 그런 식으로해야한다고 생각하면 자유롭게 의견을 말하십시오.

+0

이것은 가장 유용한 matplotlib 해결 방법 중 하나 여야합니다. 마주 친 적이있다. 이 솔루션에 적합합니다. 이상한 Tcl/Tk 윈도우 시스템에서 Gtk로 빠져 나가는 것은 참으로 해방이며, 스레드와 관련된 다른 여러 가지 matplotlib 오해를 해결합니다. – venzen