Matplotlib无法抑制图形窗口

Mag*_*Man 9 python window matplotlib suppress figure

即使我没有调用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")
Run Code Online (Sandbox Code Playgroud)

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

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

小智 17

步骤1

检查您是否以交互模式运行.默认为非交互式,但您可能永远不会知道:

>>> import matplotlib as mpl
>>> mpl.is_interactive()
False
Run Code Online (Sandbox Code Playgroud)

您可以使用将模式明确设置为非交互模式

>>> from matplotlib import pyplot as plt
>>> plt.ioff()
Run Code Online (Sandbox Code Playgroud)

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

第2步

确保你的后端是一个非gui后端.它的使用之间的区别AggTkAgg,WXAgg,GTKAgg等,后者是GUI后端,而Agg是一个非GUI后端.

您可以通过多种方式设置后端:

  • 在matplotlib配置文件中; 找到以下列开头的行backend:

    backend: Agg
    
    Run Code Online (Sandbox Code Playgroud)
  • 在程序的顶部使用全局matplotlib函数use:

    matplotlib.use('Agg')
    
    Run Code Online (Sandbox Code Playgroud)
  • 直接从正确的后端导入画布; 这在非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')
    
    Run Code Online (Sandbox Code Playgroud)


小智 5

也许只是清除轴,例如:

plt.savefig("static/data.png")
plt.close()
Run Code Online (Sandbox Code Playgroud)

不会在内联模式下绘制输出。我不知道是否真的在清除数据。