Matplotlib在无头服务器上创建绘图速度非常慢

4
我在家里的服务器上运行Ubuntu 14.04(服务器版),安装了Python 2.7.6和matplotlib 1.3.1,并将TkAgg用作后端。我通过ssh -Y连接到它。 我遇到的问题是创建绘图对象非常缓慢。例如:
import matplotlib.pyplot as plt
x=[0,1,2,3,4]
y=[0,1,4,9,16]
plt.plot(x,y)

这段代码运行需要约10秒钟,但实际上只需要一小部分时间。注意到它甚至没有显示出图像,如果我添加plt.show()也不会对时间产生显著影响。在Python解释器或从文件中运行代码也没有区别。只要等待足够长的时间,图像就可以正常地显示在本地屏幕上。而且绘制5个点或50个点似乎没有任何区别。你有什么想法吗?

我猜大部分时间都花在导入matplotlib及其依赖项上了。 - Paul H
1
TkAgg是一个图形化、交互式的后端。但是你的服务器是无头的。请尝试使用其他的后端。 - Paul H
1
你的选择包括:GTK、GTKAgg、GTKCairo、GTK3Agg、GTK3Cairo、CocoaAgg、MacOSX、Qt4Agg、TkAgg、WX、WXAgg、Agg、Cairo、GDK、PS、PDF 和 SVG。如果你只需要保存为 PNG 文件,我建议使用 Agg。除此之外,根据情况我会选择 PDF 或者 SVG。 - Paul H
我想我仍然不明白为什么只要安装了所有的matplotlib依赖项,机器上是否运行gui都无关紧要。 - Yelneerg
这只是一个猜测,但似乎初始化带有按钮、缩放功能、缓存和编辑功能的 GUI,即使无法显示,也需要一些时间。 - Paul H
显示剩余2条评论
1个回答

1

在@Paul H的答案基础上,该代码将绘图作为SVG图形输出,然后使用外部feh工具显示它。

设置后端很重要 -- 查看什么是后端获取更多信息。

来源

import matplotlib
# see http://matplotlib.org/faq/usage_faq.html#what-is-a-backend
# or
# https://matplotlib.org/stable/users/explain/backends.html
matplotlib.use('Svg')

import os
import matplotlib.pyplot as plt

x=[0,1,2,3,4]
y=[0,1,4,9,16]
plt.plot(x,y)
plt.savefig('plot.svg')
os.system('feh plot.svg')       # or "eog" for Gnome

你可以尝试调整ssh参数。或者,直接在终端上绘制--快速!https://dev59.com/lWIj5IYBdhLWcg3waEZe - johntellsall
1
你需要将后端从TkAgg更改为其他的。添加import matplotlib; matplotlib.use('Agg')。确保在导入pyplot之前执行它。 - Paul H
plt.savefig('plot.png') 可以工作,但每次想查看生成的内容时都必须打开外部程序,这有点麻烦。 - Yelneerg
好的选择。我使用'eog',因为荒谬的依赖项已经安装 :) 如果答案对您有用,请标记为已接受。 - johntellsall
我已经完善了代码和描述 - 感谢 @Yelneerg - johntellsall
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接