2014-11-17 17 views
7

show()를 호출하지 않은 경우에도 figure wnidow 표시를 주장하는 matplotlib에 문제가 있습니다.Matplotlib이 그림 창을 표시 할 수 없습니다.

문제의 함수이다 : DF가 dataframe 인

def make_plot(df): 
    fig, axes = plt.subplots(3, 1, figsize=(10, 6), sharex=True) 
    plt.subplots_adjust(hspace=0.2) 

    axes[0].plot(df["Date_Time"], df["T1"], df["Date_Time"], df["T2"]) 
    axes[0].set_ylabel("Temperature (C)") 
    axes[0].legend(["T1", "T2"], bbox_to_anchor=(1.12, 1.1)) 
    axes[1].semilogy(df["Date_Time"], df["IGP"], df["Date_Time"], df["IPP"]) 
    axes[1].legend(["IGP", "IPP"], bbox_to_anchor=(1.12, 1.1)) 
    axes[1].set_ylabel("Pressure (mBar)") 
    axes[2].plot(df["Date_Time"], df["Voltage"], "k") 
    axes[2].set_ylabel("Voltage (V)") 
    current_axes = axes[2].twinx() 
    current_axes.plot(df["Date_Time"], df["Current"], "r") 
    current_axes.set_ylabel("Current (mA)") 
    axes[2].legend(["V"], bbox_to_anchor=(1.15, 1.1)) 
    current_axes.legend(["I"], bbox_to_anchor=(1.14, 0.9)) 

    plt.savefig("static/data.png") 

가 팬더하여 만들었다. 이것은 웹 서버의 배경에 있어야하기 때문에이 함수는 지정된 디렉토리에 파일을 놓기를 원합니다. 그러나 실행하면이 작업을 수행 한 다음 그림 창을 위로 당겨 루프에서 멈추어 페이지를 다시로드하지 못하게합니다. 나는 명백한 것을 놓치고 있는가?

편집 : 추가하는 것을 잊어 버렸습니다. Windows 7, Python 2.7에서 실행 중입니다.

+3

당신은 당신이 [대화 형 모드]에서 실행하고 있는지 확인 할 수 있습니다 (http://matplotlib.org/faq/usage_faq.html#what-is -interactive-mode). – Evert

+2

또한 어떤 백엔드를 사용합니까? non-gui 백엔드를 골랐습니까? – Evert

+0

안녕하세요. 인터랙티브 모드를 강제로 해제하기 위해 plt.ioff()를 사용해 보았지만 도움이되지 않았습니다. 또는 오히려 코드가 한 번만 실행되는 대신 코드가 두 번 실행될 수있었습니다 (멈추기 전에 두 개의 그림 창 생성). non-gui 백엔드를 선택하는 방법을 설명해 주시겠습니까? –

답변

12

1 단계

확인 당신은 에서 실행하고 있는지. 기본값은 대화 형이 아닌,하지만 당신은 결코 알지 못할 수 있습니다

>>> import matplotlib as mpl 
>>> mpl.is_interactive() 
False 

당신은 기본이 아닌 대화 형이기 때문에

>>> from matplotlib import pyplot as plt 
>>> plt.ioff() 

를 사용하여 비 대화식으로 명시 적으로 모드를 설정할 수 있습니다, 이것은 아마도 문제는 아닙니다.

2 단계

백엔드가 아닌 GUI를 백엔드 있는지 확인합니다. AggTkAgg, WXAgg, GTKAgg 등의 차이점은 후자가 gui 백엔드 인 반면 Agg은 비 GUI 백엔드입니다.

당신은 여러 가지 방법으로 set the backend 할 수 있습니다 귀하의하기 matplotlib 구성 파일의

  • ; backend로 시작하는 라인을 찾을 :

    backend: Agg 
    
  • 을 글로벌하기 matplotlib 기능 use와 프로그램의 상단에 :

    matplotlib.use('Agg') 
    
  • 올바른 백엔드에서 직접 캔버스를 가져; 이것은 내가 자주 사용하는 비 pyplot "모드"(OO 스타일)에서 가장 유용합니다. 그리고 웹 서버 스타일의 사용에 대해서는 결국 위와 다른 차이점이 있습니다. 본격적인 간단한 예제) :

    import numpy as np 
    from matplotlib.figure import Figure 
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
    figure = Figure() 
    canvas = FigureCanvas(figure) 
    axes = figure.add_subplot(1, 1, 1) 
    axes.plot(x, np.sin(x), 'k-') 
    canvas.print_figure('sine.png')