2014-11-17 2 views
7

У меня возникли проблемы с matplotlib, настаивающим на отображении фигуры, даже когда я не вызвал show().Matplotlib не может подавить фигурное окно

Функция в вопросе:

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") 

где ДФ является dataframe создана при панд. Предполагается, что это будет на фоне веб-сервера, поэтому я хочу, чтобы эта функция удаляла файл в указанном каталоге. Однако, когда он выполняется, он делает это, а затем поднимает окно фигуры и застревает в цикле, не позволяя мне перезагрузить страницу. Мне что-то не хватает?

EDIT: Забыл добавить, я запускаю python 2.7 на Windows 7, 64 бит.

+3

вы можете проверить, является ли вы работать в интерактивном режиме [] (http://matplotlib.org/faq/usage_faq.html#what-is -interactive-режим). – Evert

+2

Кроме того, какой бэкэнд вы используете? Вы выбрали не-gui-бэкэнд? – Evert

+0

Hi @Evert. Я попытался использовать plt.ioff(), чтобы отключить интерактивный режим, но это не помогло. Вернее, он позволял коду запускаться дважды, а не только один раз (генерируя два фигурных окна перед тем, как застревать). Не могли бы вы объяснить, как мне выбрать не-gui-бэкэнд? –

ответ

12

Шаг 1

Проверьте, используете ли вы в . Значение по умолчанию не является интерактивным, но вы никогда не можете знать:

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

Вы можете установить режим явно неинтерактивный с помощью

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

Поскольку по умолчанию не является интерактивным, это, вероятно, не проблема.

Шаг 2

Убедитесь, что бэкенд не является графический интерфейс бэкенд. Разница заключается в использовании Agg по сравнению с TkAgg, WXAgg, GTKAgg и т. Д., Последний из которых является gui-бэкендами, а Agg является не-gui-бэкэнд.

set the backend Вы можете в несколько способов:

  • в файле конфигурации Matplotlib; найти строку, начинающуюся с backend:

    backend: Agg 
    
  • в верхней части вашей программы с глобальной функцией Matplotlib use:

    matplotlib.use('Agg') 
    
  • импортировать холст прямо из правильного внутреннего интерфейса; это наиболее полезно в режиме «non-pyplot» (OO-style), который я часто использую, и для стиля использования веб-сервера, который в конечном итоге может оказаться лучшим (так как это немного отличается от приведенного выше, полномасштабный короткий пример):

    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') 
    
Смежные вопросы