9

我在 matplotlib 坚持显示图形 wnidow 时遇到问题,即使我没有调用 show()。

有问题的功能是:

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 64 位上运行 python 2.7。

4

2 回答 2

18

步骤1

检查您是否在交互模式下运行。默认是非交互式的,但你可能永远不知道:

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

您可以通过使用将模式显式设置为非交互

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

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

第2步

确保您的后端是非 gui 后端。这是使用AggTkAgg,等之间的区别WXAggGTKAgg后者是 gui 后端,而Agg是非 gui 后端。

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

  • 在您的 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')
    
于 2014-11-17T13:47:10.313 回答
5

也许只是清除轴,例如:

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

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

于 2019-10-15T09:36:06.493 回答