如何我有一個文件與該格式每行情節中的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)。
如何繪製每行?不是每列
如何我有一個文件與該格式每行情節中的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)。
如何繪製每行?不是每列
這可能不是最優雅的解決方案,但您可以先過濾兩行(包含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
顯式轉換爲數字。
一種解決方案是使用正確的格式(列中的數據)創建一個新文件。 首先創建一個功能在您的文件中讀取數據(請參閱主題「讀數據集值到一個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
。