2012-12-25 8 views
1

我想繪製存儲在hist.dat爲已經創建直方圖數據:如何使用gnuplot的繪圖操作數據並將數字存儲在同一個文件中?

#hist1 
100 
1 
9 
10 
30 
30 
10 
9 
1 

凡(零行是註釋),第一行包含直方圖的y值的總和,並且x值是1,2,...(行號)。因此,沒有normation,我可以用

plot "hist.dat" every::1 using 0:1 

與normation我可以用

plot "hist.dat" every::1 using 0:($1/100) 

的問題是我怎麼可以參考累加值(100)?因爲我不想預先讀取文件來創建正確的gnuplot代碼,所以我不想寫下隱含的值。我已經嘗試過

plot "hist.dat" using 0:($1/(columnhead+0)) 

但columnhead不能使用內調用(它是一個字符串,這就是爲什麼我試圖加0,使其INT)。

我不想修改該文件或基於此創建一個新文件,我只想使用相應的gnuplot命令。我想避免忽略總值並用gnuplot重新計算。


解決方案:根據andyras誰給出正確的答案,有點改進的方法是

first(x) = ($0 == 0) ? (first = column(x), 1/0) : first 

plot "hist.dat" using 0:($1/first(1)) 

所以,如果你有多個列,如果hist.dat是你可以用它來繪製直方圖

#hist1 hist2 
10000 8000 
1000 50 
9000 70 
1000 1100 
3000 4500 
3000 1200 
1000 700 
9000 380 
1000  

回答

2

我該如何參考總值(100)? (無預讀取文件)

是,使用一個gnuplot的功能:

first(x) = ($0 == 0) ? (first = $1, 1/0) : first 

plot "hist.dat" using 0:($1/first($1)) 

如果讀取所述第一線,所述功能指定從該線到可變first值,並返回1/0(gnuplot將其視爲缺失數據,不會擴展x範圍以包含該點)。否則,該函數返回值first

這樣你甚至不必使用every ::1

如果您不介意重新讀取文件,則可以使用stats命令找出文件中最大的值。

+0

信不信由你,我從來沒有意識到你可以在gnuplot函數中使用字段'$ 1','$ 0','$ ...'。另外,在三元運算符內部非常巧妙地使用內聯函數 - 我也不會認爲這是可能的。到處都是,這是一個夢幻般的答案。 +1(和聖誕快樂)從我身上。 – mgilson

+0

謝謝,祝你聖誕快樂!我實際上從你的答案中得到了一些啓發,這些答案告訴我你可以在函數定義中逗號分隔命令。 (http://stackoverflow.com/questions/13655048/display-underscore-rather-than-subscript-in-gnuplot-titles/13655849#13655849) – andyras

+0

答案是相當不錯的,但你不使用的信息(參數)傳遞給函數'first'。在問題部分可以看到針對多列文件的改進解決方案。 – DanielTuzes

相關問題