2017-03-14 95 views
1

如何我有一個文件與該格式每行情節中的gnuplot

0 R1 R2 R3 R4 
w1 I1 I2 I3 I4 
w2 I1 I2 I3 I4 
w3 I1 I2 I3 I4 

在許多波長瓦特半徑R和強度I的值。我想在2D中繪製,x軸的第1行(半徑)和y軸的第3行(選擇w2)。

如何繪製每行?不是每列

回答

0

這可能不是最優雅的解決方案,但您可以先過濾兩行(包含x值的標題和對應於感興趣的波長的行),並排打印它們,最後繪圖這個輔助數據使用Gnuplot。

爲此,該戰略將是要從其與以下內容執行的Gnuplot的目錄下創建一個名爲filter.awk腳本,例如:

NR==1{ 
    N = NF-1; 
    for(i=1;i<=N;i++) x[i] = $(i+1); 
    next; 
} 

$1==w{ 
    printf "#%f\n", $1; 
    for(i=1;i<=N;i++) print x[i], $(i+1); 
    printf "\n"; 
} 

這會記住第一個x值並將它們存儲在數組x中。波長通過變量w作爲命令行參數傳遞(見下文)。如果數據中的第一列等於w,那麼腳本會生成兩列:第一列中的x值,第二列中的y值(取自當前行)。

在gnuplot的你就可以用這個爲:

plot \ 
    '<gawk -v w=100 -f filter.awk data.dat' w l 

其中data.dat將輸入數據和100的值表示這是應該被過濾的波長。

爲了概括這一點,例如可以這樣做:

cmd(w)=sprintf('<gawk -v w=%f -f filter.awk test.dat', w); 

plot for [w in "100 200"] cmd(w+0) w l t sprintf('wave length of %.1f', w+0) 

在此,經由cmd函數接受一個參數表示波長產生的繪圖命令。繪圖命令然後遍歷波長的「列表」,並用自定義標題分別繪製它們。此處使用語句w+0將字符串值w顯式轉換爲數字。

0

一種解決方案是使用正確的格式(列中的數據)創建一個新文件。 首先創建一個功能在您的文件中讀取數據(請參閱主題「讀數據集值到一個gnuplot的變量X系列(開始)」):

at(file, row, col) = system(sprintf("awk -v row=%d -v col=%d 'NR == row  {print $col}' %s", row, col, file)) 
file="myFile" 

因此建立新的文件,並繪製它:

do for [j=1:5] { # 5 = number of your columns 

x = at(file,1,j) # x axis in your example 
y = at(file,3,j) # y axis 
set print "newFile.txt" append 
print x," ",y 
set print 
} 

plot "newFile.txt" 

每次執行該過程時都一定要刪除newFile.txt