2016-03-03 39 views
2

注意:我可以控制數據文件的格式,但它必須是單個文件。繪製一個文件中的多個數據集

我想使用gnuplot在同一個圖上繪製多個數據集。我想理想的情節是這樣的:

data_1 0 0 
data_2 0 0 
data_1 1 1 
data_2 0 1 
data_1 2 2 
data_2 1 2 

依此類推。在這種情況下,data_1data_2應該是兩條分開的曲線。

我也想避免在gnuplot腳本中放入可能的數據集的列表,甚至是數字。基本上,我希望它通過特定的字段對數據點進行「分組」,並將每個組作爲單獨的數據集在同一個圖上繪製。

作爲最後的選擇,我可以使用grep將原始文件拆分成每個數據集的一個文件,並繪製這些文件(我猜這很容易?),但是我正在尋找一種方法文件。

回答

3

的gnuplot的-的方式來保存你的數據是將數據集空行分開。然後你可以使用index訪問單個文件不同的數據集:

data_1 0 0 
data_1 1 1 
data_1 2 2 


data_2 0 0 
data_2 0 1 
data_2 1 2 

和情節與

plot 'file.dat' using 2:3 index 0, '' using 2:3 index 1 

要獲得的數據集的數量,使用stats命令節省了數在可變數據集(數據塊),你可以使用迭代的:

stats 'file.dat' using 0 nooutput 
plot for [i=0:(STATS_blocks - 1)] 'file.dat' using 2:3 index i 

要擴展這個,你甚至可以設置文件格式如下

data_1 
0 0 
1 1 
2 2 


data_2 
0 0 
0 1 
1 2 

,並使用SEACH數據集劇情關鍵的第一行:

set key autotitle columnheader 
stats 'file.dat' using 0 nooutput 
plot for [i=0:(STATS_blocks - 1)] 'file.dat' using 1:2 index i 

enter image description here

+0

這肯定是要走如果OP可以重組文件的方式(和他們說他們可以自由地這樣做)。我想用所提供的文件結構來回答它。然而,這種重組是可能的,這是更簡單的方法。 – Matthew

1

您可以使用外部程序從第一列獲取值,然後根據該值有條件地繪製數據。

例如,使用python3(和Windows風格引號),我們可以做

values = system('python -c "data = sorted(set(x.split()[0] for x in open(\"datafile\",\"r\"))); print(\"\n\".join(data))"') 

這將導致變量包含"data_1 data_2"。現在,我們可以使用plot for循環這個變量。我們測試每一行以查看第一列值是否正確。如果不是,我們使用值1/0,這會導致gnuplot跳過該行。

plot for [w in values] datafile u 2:((strcol(1) eq w)?$3:1/0) with points pt 7 t w 

enter image description here

當然,這導致在曲線不連續。如果我們不想要(例如,使用線條樣式),我們可以使用外部程序進行過濾。例如,用awk(與Windows引號)

plot for [w in values] sprintf('< awk "($1==\"%s\")" datafile',w) u 2:3 with lines t w 

enter image description here

這裏我們使用sprintf建立用awk的指數,我們重定向命令正在處理:

< awk "($1==\"data_1\")" datafile 
< awk "($1==\"data_2\")" datafile 


使用標準的unix命令,我們也可以做(Windows報價)

values = system('awk "{print $1}" datafile | sort | uniq')