即使我没有调用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位。
答案 0 :(得分:16)
第1步
检查您是否在interactive mode中运行。默认为非交互式,但您可能永远不会知道:
>>> import matplotlib as mpl
>>> mpl.is_interactive()
False
您可以使用
将模式明确设置为非交互式>>> from matplotlib import pyplot as plt
>>> plt.ioff()
由于默认是非交互式的,这可能不是问题。
第2步
确保您的后端是非gui后端。这是使用Agg
与TkAgg
,WXAgg
,GTKAgg
等之间的区别,后者是gui后端,而Agg
是非后端gui后端。
您可以通过多种方式set the backend:
;找到以backend
开头的行:
backend: Agg
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()
不会以内联模式绘制输出。我无法确定是否确实要清除数据。