2016-09-06 58 views
2

我有約10個相應的輸入文件列表,其中包含分隔標籤數據列約300行/數據點。Python - 多重文件的圖形內容

我正在尋找繪製每組數據的內容,以便我對每組數據都有一個簡單的x vs(y1,y2,y3,...)和一個是由函數轉換,例如x vs(f(y1),f(y2),f(y3),...)。

我不知道,以達到它的最佳方式,我想過使用文件名的簡單數組,那麼可能不知道如何來存儲它們所有,而不覆蓋數據 - 這樣的事情:

import numpy as np 
import matplotlib.pyplot as plt 

def ReadDataFile(file): 
    print (file) 
    x,y = np.loadtxt(file, unpack=True, usecols=(8,9)) 
    return x, y 

inputFiles = ['data1.txt','data2.txt','data2.txt',...] 
for file in inputFiles: 
    x1,y1 = ReadDataFile(file) ## ? ## 
    p1,q1 = function(x1,y1) ## ? ## 

plt.figure(1) 
plt.plot(x1,y1) 
plt.plot(x2,y2) 
... 
# plt.savefig(...) 

plt.figure(2) 
plt.plot(p1,q1) 
plt.plot(p2,q2) 
... 
# plt.savefig(...) 
plt.show() 

我想我的問題是如何最好地讀取和存儲所有的數據,並保持訪問它的能力,而無需將所有代碼放在readloop中。我可以將兩個數據集讀入成對的列表嗎?這是Python中的一件事嗎?如果是這樣,我該如何訪問它們?

在此先感謝您的幫助! 此致敬禮!

+0

如何讀取每個數據文件並將它們放入字典?這對你有用嗎? – gabra

+0

您可以將數據保存在一個數組中,並使用'np.hstack()'來加入數據(每個x一個col,每個y一個),並將連接的數組繪製爲一個plot對象內的子圖。我發現'GridSpec'對此非常好。 – Andrew

+0

@gabra 我必須說我根本沒有使用字典......但我的理解是他們存儲鍵值對,我想有點像C++地圖嗎? 「價值」條目可以成爲一個列表? ie:key1 ='x1',value1 = [... x1 values list ...] with key2 ='y2'and value2'= [... y1 values list ...] 這似乎有點笨重對我來說!我覺得必須有更優雅的解決方案? – Pete

回答

0

基本上,我認爲你應該把所有的代碼放在readloop中,因爲這樣做很容易。使用matplotlib的方式稍有不同,可以輕鬆地使用現有的數據組織並編寫較短的代碼。這裏有一個玩具,但完整的,例如:

import matplotlib.pyplot as plt 
from numpy.random import random 

fig, axs = plt.subplots(2) 

for c in 'abc':     # In your case, for filename in [file-list]: 
    x, y = random((2, 5)) 
    axs[0].plot(x, y, label=c)  # filename instead of c in your case 
    axs[1].plot(x, y**2, label=c) # Plot p(x,y), q(x,y) in your case 

axs[0].legend() # handy to get this from the data list 

fig.savefig('two_plots.png') 

enter image description here

您也可以建立兩個人物和情節變成每個人的明確,如果你需要他們在不同的文件中進行頁面佈局等:

import matplotlib.pyplot as plt 
from numpy.random import random 

fig1, ax1 = plt.subplots(1) 
fig2, ax2 = plt.subplots(1) 

for c in 'abc':     # or, for filename in [file-list]: 
    x, y = random((2, 5)) 
    ax1.plot(x, y, label=c) 
    ax2.plot(x, y**2, label=c) 

ax1.legend() 
ax2.legend() 

fig1.savefig('two_plots_1.png') 
fig2.savefig('two_plots_2.png') 
+0

非常感謝!鍛鍊了魅力。 – Pete