使用matplotlib API在屏幕上绘图
我知道怎么用pyplot界面在屏幕上显示matplotlib图表(我想我懂!)。我开始在一个多线程的程序中绘图,这导致了一些错误,所以我想换成面向对象的接口。我可以用下面的代码做一个简单的图并保存到文件:
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
fig = Figure()
can = FigureCanvas(fig)
ax = fig.add_subplot(111)
ax.plot((1,2,3))
can.print_figure('test')
但是我怎么才能在屏幕上显示这个图呢?我看到过其他代码使用can.draw()
,但这没有任何效果。
另外,如果我上面的代码有什么不太好的地方,请告诉我——我还没有完全理解这些figure、canvas和axes对象到底是干什么的。
1 个回答
4
你的问题是,你正在使用一个不支持屏幕显示的后端(比如 Agg
,而不是 TkAgg
、GtkAgg
、QtAgg
等等)。这意味着它无法把内容显示在屏幕上。
不过,如果你想在使用任何图形用户界面(GUI)库的多线程代码中工作,必须把图形界面的主循环放在自己的线程里运行。
换句话说,想要切换到一个可以在屏幕上显示的后端,就需要在你的多线程代码中增加不少复杂性。
有几种不同的方法可以做到这一点,但任何通用的方法效率都很低下。(简单的解决方案是使用 pyplot.ion
,然后在一个线程中每隔 x 毫秒绘制一次画布,同时在另一个线程中做其他事情。这种方法效率是非常低的。)
你能多说一点你在做什么吗?为什么你选择使用线程而不是多进程?(也就是说,你是在做大量的输入输出操作吗?)你使用的是什么图形库?(如果你不知道,那可能是 Tk
,因为这是 matplotlib 的默认后端。)