2013-11-21 28 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值。 :-( –