Matplotlib无法抑制图形窗口

时间:2014-11-17 09:59:41

标签: python matplotlib window figure suppress

即使我没有调用show(),matplotlib仍然无法显示一个数字wnidow。

有问题的功能是:

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

其中df是使用pandas创建的数据帧。这应该是在Web服务器的后台,所以我想要的是这个函数将文件放在指定的目录中。但是,当它执行时会执行此操作,然后拉出一个数字窗口并陷入循环,阻止我重新加载页面。我错过了一些明显的东西吗?

编辑:忘记添加,我在Windows 7上运行python 2.7,64位。

2 个答案:

答案 0 :(得分:16)

第1步

检查您是否在interactive mode中运行。默认为非交互式,但您可能永远不会知道:

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

您可以使用

将模式明确设置为非交互式
>>> from matplotlib import pyplot as plt
>>> plt.ioff()

由于默认是非交互式的,这可能不是问题。

第2步

确保您的后端是非gui后端。这是使用AggTkAggWXAggGTKAgg等之间的区别,后者是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')
    

答案 1 :(得分:0)

也许只是清除轴,例如:

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

不会以内联模式绘制输出。我无法确定是否确实要清除数据。