2013-11-21 27 views
8

我在wxPython中写了一个有matplotlib图(使用wxagg后端)面板的小应用程序。我想添加用户将图中当前绘制的X,Y数据导出到文本文件的功能。有没有一种非侵入性的方式来做到这一点?我搜索了很多东西,似乎找不到任何东西,尽管我觉得它在我的面前非常简单和正确。从matplotlib中检索XY数据图

我可以肯定地获取数据并将其存储在绘图时的某个位置,然后使用它 - 但这会非常有创意,进入我的代码的较低级别。这将是如此容易得多,而且通用的,如果我能做到一样容易的事:

x = FigurePanel.axes.GetXData() 
y = FigurePanel.axes.GetYData() 

希望这有一定道理:)

非常感谢!任何帮助是极大的赞赏!

编辑:为了澄清,我想知道如何做的是获取X,Y数据。写入文本文件之后是微不足道的;)

+0

,但跨线程没来!感谢您的链接。 – brettb

+0

我只发现通过搜索'matplotlib get_xdata',而不是使用SO的标准搜索。 –

+1

只是供参考:一般来说,matplotlib绘图函数会返回一个'Artist'实例(或'plot'情况下的艺术家序列),其中包含数据,样式信息等。许多艺术家具有'get_data'和'set_data'方法(例如,你可以做'x,y = line.get_data()')。对于某些人来说,该方法可能被称为别的东西(例如'scatter'返回一个集合,其中等价方法是'get_offsets')。一些艺术家(例如'ContourSets')不包含对原始输入数据的引用,但是这是相当罕见的。基本上,你想要坚持绘图功能的输出。 –

回答

11

这工作:

In [1]: import matplotlib.pyplot as plt 

In [2]: plt.plot([1,2,3],[4,5,6]) 
Out[2]: [<matplotlib.lines.Line2D at 0x30b2b10>] 

In [3]: ax = plt.gca() # get axis handle 

In [4]: line = ax.lines[0] # get the first line, there might be more 

In [5]: line.get_xdata() 
Out[5]: array([1, 2, 3]) 

In [6]: line.get_ydata() 
Out[6]: array([4, 5, 6]) 

In [7]: line.get_xydata() 
Out[7]: 
array([[ 1., 4.], 
     [ 2., 5.], 
     [ 3., 6.]]) 

我发现这些在轴线物体周围挖。我只能找到关于这些函数的一些minimal information,显然你可以给它们一个布尔标志来获得原始数据或处理过的数据,不确定是什么意思。

编辑:乔金顿呈略微更合适的方法来做到这一点:我发誓,我用Google搜索,我能想到的词的每一个可能的组合

In [1]: import matplotlib.pyplot as plt 

In [2]: lines = plt.plot([1,2,3],[4,5,6],[7,8],[9,10]) 

In [3]: lines[0].get_data() 
Out[3]: (array([1, 2, 3]), array([4, 5, 6])) 

In [4]: lines[1].get_data() 
Out[4]: (array([7, 8]), array([ 9, 10])) 
+0

谢谢!我会试试这个。 – brettb

+0

工程就像一个魅力。对于将来的读者,我还会添加line.get_label()也会返回与该行对象关联的标签;)再次感谢! – brettb

+0

为什么'mpl_toolkits.mplot3d.art3d.Line3D对象'没有'get_zdata()'?我无法提取z值。 :-( –