2013-04-15 46 views
0

我想弄清楚如何在gnuplot做柵欄圖,但我很難理解我在互聯網上找到的例子中發生了什麼。Gnuplot:從數據的柵欄圖

我有一個(不同的)數量從不同的點數據組中的時間在我的模擬,以組織爲值的矩陣數據文件:

t1 x11 y11 // indices here indicate that (x1,y1) are a data point which 
t1 x21 y21 // I'd plot on a regular 2D plot for this timestep, with the 
...    // additional index noting which time step the values are for. 
t1 xN1 yN1 
[blank line] 
t2 x12 y12 
t2 x22 y22 
... 
t2 xN2 yN2 
[etc...] 
tM xNM yNM 

我想用一個繪製該每個時間值的柵欄。我可以簡單地繪製splot 'data.txt',並得到與我想要的東西非常相似的東西 - +沿着柵欄的「頂部邊緣」的標記,時間在x軸上,x軸數據在y軸上,y軸數據在z軸上。但是,如果我在splot命令中添加諸如w lines之類的東西,我只需獲取所有數據序列連接的曲面。

我試着修改the demo script collection的例子(大約一半),但他們都依賴於一個虛擬變量,我不知道如何將它與我的數據系列相結合。我還發現了一些其他的例子,但它們都非常詳盡,我不明白他們在做什麼。

什麼是從使用gnuplot的數據創建圍欄圖的好方法?


如果有必要,有可能改變這一點 - 我在生成數據的代碼的控制。這是一個麻煩,雖然...

+0

'東西' - 我需要記住一個... – mgilson

+0

@ mgilson:如果你知道它是* superscript *的簡寫,很容易記住。你能猜到'東西'是做什麼的嗎? ;) –

回答

3

這確實需要對數據不幸的一點改變。這種變化雖然很輕微,也許可以用一個簡單的awk1,2腳本處理:

這裏是我的gnuplot交互會話的複製/粘貼:

gnuplot> !cat test.dat 
1 2 3 
1 2 0 

1 3 4 
1 3 0 

1 4 5 
1 4 0 


2 2 3 
2 2 0 

2 3 4 
2 3 0 

2 4 5 
2 4 0 


3 2 3 
3 2 0 

3 3 4 
3 3 0 

3 4 5 
3 4 0 
! 
gnuplot> splot 'test.dat' u 1:2:3 w lines 

這裏是要注意的事情在「柵欄」之間有2條空行,每個x,y數據點出現兩次,之後出現空行。它的出現,z座標,第二次爲0

要獲得每個柵欄有不同的顏色:

gnuplot> splot for [i=0:3] 'test.dat' index i u 1:2:3 w lines 

的awk腳本甚至可以在線完成:

splot "< awk {...} datafile" 

但是,報價可能會有點棘手(在單引號字符串中包括單引號,您將其加倍)...

AWKCMD='awk ''{if(!NF){print ""}else if(index($0,"#")!=1){printf "%s %s %s\n%s %s 0\n\n", $1,$2,$3,$1,$2}}'' ' 
splot '<'.AWKCMD.'datafile.dat' u 1:2:3 w lines 

就效率而言,我相信我上面使用的迭代將在每次迭代時調用awk命令。這裏的解決方法是從指數上拉的顏色:

splot '<'.AWKCMD.' test.dat' u 1:2:3:(column(-2)) w l lc variable 

我相信,隨着期望的那麼只用萬個條目,應該還是比較迅速作出反應,這隻會做awk命令一次。


awk '{if(!NF){print ""}else{printf "%s %s %s\n%s %s 0\n\n", $1,$2,$3,$1,$2}}' test.dat

awk '{if(!NF){print ""}else if(index($0,"#")!=1){printf "%s %s %s\n%s %s 0\n\n", $1,$2,$3,$1,$2}}' test.dat(版本忽略註釋)

+0

謝謝!一些後續問題:1)我以前從未使用過'awk'。我如何修改它以忽略所有以'#'開頭的行?我用它打印出我的數據文件中的診斷輸出(有關運行的一些信息,以供將來參考),並且我想保留它。 2)這個性能很重嗎?一個數據文件通常包含〜10^5-10^6行數據。 3)如果我沒有弄錯,可以直接在gnuplot腳本中完成,而不是分兩步。我怎麼做?再次感謝! –

+0

@TomasLycken - 查看我的更新。 – mgilson

+0

太棒了!就這樣 - 它給了我美感!我將不得不在透明度等方面進行一些改進,以使其更好,但這是另一回事。非常感謝! –