gnuplot使用垂直存储的数据文件

时间:2012-10-23 12:31:12

标签: gnuplot

我试图找出绘制服务器磁盘使用情况的折线图的基本语法。数据存储在Oracle数据库中,该数据库显然将新数据存储在不同的行上,而不是存储在同一行上。从我到目前为止所读到的内容来看,gnuplot似乎更倾向于将相关数据放在同一行上。我的数据看起来像这样。

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

gnuplot可以处理这种格式的数据吗?图形输出将有2行,一行用于disk1,一行用于disk2。数据文件只有几个disk_numbers,但最终每天都会记录数百行。

2 个答案:

答案 0 :(得分: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运行数据文件,从每行中删除字符串'disk'。然后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'

但它不喜欢plot命令中的字符串比较。

要获得正确的时间格式,您需要执行类似

的操作
set xdata time
set timefmt '%Y%m%d'
set format x '%F'
在绘图命令之前

编辑: 正如@mgilson指出的那样,如果你想要一个'纯gnuplot'解决方案,可以使用strcol命令:

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'

答案 1 :(得分:2)

我假设你想为disk1和disk2绘制GB_used vs date。如果是这种情况,这就是几乎 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

的回答所示