Matplotlib 绘图的标准 ASCII 文件格式
我正在做一个大型的硬件测试项目,遇到的问题是我想把测试系统中Python脚本输出的数据绘制成图,但这些系统的性能不够强,无法运行像matplotlib这样的工具。我开始定义一种格式,把数据传回记录所有测试系统数据的服务器;不过,如果有现成的工具可以以标准化的方式将图形写入ASCII文件,并在其他地方读取并绘制出来,那就更好了。
我比较喜欢用matplotlib来绘图,但我对使用其他工具也很灵活。我并不介意定义一个自定义格式,只是希望如果matplotlib(或者其他功能齐全的工具)有办法从某种文本格式动态生成图形,那就太好了。提前感谢你的帮助。
补充一下,数据传输其实很简单;我喜欢用JSON来做这个。我现在想要的是,构建一个文件,不仅存储数据,还能说明如何绘制这些数据(也就是说,脚本或应用程序加载这个文件后可以根据它生成图形,文件里可以指定标题、x轴标签、y轴标签,可能还需要一个图例等等)。通过CSV或JSON写入数据并不难;真正的挑战在于找到一种标准化的方式,把绘图指令发送给主机。
2 个回答
你可以考虑使用Matlab的文本格式来传输数据。Scipy有一套可以使用的Matlab输入输出工具。你也可以用普通的Python来实现,方法是把数据保存为JSON格式,或者使用pickle。
你可以把Python代码写到一个文件里,然后把这个文件发送到服务器上执行,但这样可能会有安全隐患。
为了减少一些安全风险(注意 XML的漏洞),你可以使用 xmlrpclib 来限制从源机器可以调用的函数,这样在服务器上执行的时候就更安全了:
比如,你可以在服务器上运行:
from SimpleXMLRPCServer import SimpleXMLRPCServer
import matplotlib.pyplot as plt
def plot(filename, x, y):
plt.plot(x, y)
plt.savefig(filename)
return True
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(plot, 'plot')
server.serve_forever()
而在源机器上:
import xmlrpclib
proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
x = range(100)
y = [i**2 for i in x]
proxy.plot('/tmp/test.png', x, y)
你还可以给 plot
函数添加更多参数,用来处理标题、图例等等。
在源机器上运行上面的代码会在服务器上生成一个文件 /tmp/test.png
。