2012-10-23 22 views
1

我想弄清楚繪製服務器的磁盤使用率線圖的基本語法。數據存儲在Oracle數據庫中,該數據庫顯然將新數據存儲在單獨的行上,而不是存儲在同一行中。從我迄今讀過的內容來看,gnuplot似乎更傾向於將相關數據放在同一行上。我的數據看起來像這樣。gnuplot使用垂直存儲的數據文件

#disk date  GB_used 
disk1 20121022 99 
disk1 20121023 104 
disk2 20121022 170 
disk2 20121023 182 

gnuplot可以處理這種格式的數據嗎?圖形輸出將有2行,一個用於disk1,另一個用於disk2。數據文件只有幾個disk_number,但最終每天會包含數百行記錄。

+0

gnuplot的取每個點由單個行濾波來實現。這組點是垂直疊加的 - 這幾乎是你所擁有的。數據文件不符合的地方是您不會添加空白記錄來分隔數據分組。 – mgilson

回答

2

我假設你想繪製GB_used VS日期爲disk1和磁盤2: 作爲@mgilson指出的那樣,strcol命令,如果你想要一個「純粹的gnuplot」的解決方案中。如果是這樣的話,這是幾乎 gnuplot的喜歡的格式:

#disk date  GB_used 
disk1 20121022 99 
disk1 20121023 104 


disk2 20121022 170 
disk2 20121023 182 

這裏有一個簡單的awk腳本轉換:

awk 'BEGIN{getline;x=$1;print $0}{if($1!=x){print '\n\n';print$0;x=$1}else{print $0}}' example.dat 

在這種情況下,gnuplot的會要你分開的兩個數據集由1或2個空行組成。如果按1個空行分開,gnuplot的將繪製2號線相同的線型

如果通過2個空白行分開,gnuplot的將繪製兩個數據集,你可以把它用不同的線的情節類型:

plot for [idx=0:1] 'example.dat' i idx u 2:3 w lines 

基本相同的效果可以通過如由@andyras在應答證明

+0

某事不起作用:gnuplot> plot for [idx = 0:1 ]'example.dat'i idx u 2:3 w lines ...返回「invalid expression」,指向「[」 – user584583

+0

@ user584583 - 你有什麼版本的gnuplot?如果你使用gnuplot 4.2,迭代將不起作用(迭代是在gnuplot 4.3中引入的 - 當前的穩定版本是4.6)。 – mgilson

+0

我的版本是舊的版本,升級不會發生在今年我工作的地方(Initech)。 – user584583

2

是的,它可以,但你可能不得不欺騙一下。這是基本的繪圖命令:

plot "< sed 's/^disk//' data.dat" using ($1==1?$2:1/0):3 title 'disk 1', \ 
'' using ($1==2?$2:1/0):3 title 'disk 2' 

首先我貫穿sed數據文件從每行中刪除字符串「盤」。然後,gnuplot在using關鍵字之後進行條件比較。在第一個plot命令中,它檢查第一個數據列是否等於1(它將用於'disk1' - 'disk'),如果是,則繪製第二列與第三列,否則繪製1/0 (哪個gnuplot忽略)。

我試着這樣做純粹的gnuplot:

plot 'data.dat' u ($1 eq 'disk1'?$2:1/0):3 t 'disk 1', \ 
'' u ($1 eq 'disk2'?$2:1/0):3 t 'disk 2' 

,但它並沒有像在繪圖命令字符串比較。

爲了讓你會想繪圖命令前做這樣的事情

set xdata time 
set timefmt '%Y%m%d' 
set format x '%F' 

時間格式正確。

編輯:

plot 'data.dat' u (strcol(1) eq 'disk1'?$2:1/0):3 t 'disk 1', \ 
    '' u (strcol(1) eq 'disk2'?$2:1/0):3 t 'disk 2' 
+0

這是我第一次回答gnuplot問題,並被通知別人在我打字的時候回答。 – mgilson

+1

在你純粹的gnuplot例子中,你可能可以用'strcol(1)eq'disk1''而不是'$ 1 eq'disk1''來處理它 – mgilson