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

使用垂直存储的数据文件的gnuplot,gnuplot,Gnuplot,我正试图找出绘制服务器磁盘使用率折线图的基本语法。数据存储在Oracle数据库中,该数据库显然将新数据存储在单独的行上,而不是存储在同一行上。从我到目前为止所阅读的内容来看,gnuplot似乎更喜欢相关数据位于同一行。我的数据是这样的 #disk date GB_used disk1 20121022 99 disk1 20121023 104 disk2 20121022 170 disk2 20121023 182 gnuplot可以处理这种格式的数据吗?图形输出将有两行,一行用于

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

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

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

是的,它可以,但您可能需要对其进行一些欺骗。以下是基本的绘图命令:

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'
但它不喜欢plot命令中的字符串比较

要获得正确的时间格式,您需要执行以下操作

set xdata time
set timefmt '%Y%m%d'
set format x '%F'
在plot命令之前

编辑: 正如@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'

是的,它可以,但你可能不得不欺骗它一点。以下是基本的绘图命令:

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'
但它不喜欢plot命令中的字符串比较

要获得正确的时间格式,您需要执行以下操作

set xdata time
set timefmt '%Y%m%d'
set format x '%F'
在plot命令之前

编辑: 正如@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'

我假设您想为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个空行分隔这两个数据集。如果用一个空行分隔,gnuplot将打印相同线型的两行

如果用两个空行分隔,gnuplot将打印两个数据集,您可以使用不同的线型进行打印:

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

基本上,通过过滤可以实现相同的效果,如@andyras的回答所示。我假设您想要绘制disk1和disk2的GB_使用与日期。如果是这样,这几乎就是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个空行分隔这两个数据集。如果用一个空行分隔,gnuplot将打印相同线型的两行

如果用两个空行分隔,gnuplot将打印两个数据集,您可以使用不同的线型进行打印:

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

本质上,通过过滤可以达到相同的效果,如@andyras的答案所示。这是我第一次回答gnuplot问题,并在我打字时被通知有人回答。在你的纯gnuplot示例中,您可能可以使用strcol1 eq'disk1'而不是$1 eq'disk1'来使用它。这是我第一次回答gnuplot问题,并在我键入时被通知有人回答。在您的纯gnuplot示例中,您可能可以使用strcol1 eq'disk1'而不是$1 eq'disk1'gnuplot从一行中获取每个点。这组点是垂直堆叠的——这与您拥有的几乎相同。数据文件不一致的地方在于没有将空白记录添加到单独的数据分组中。gnuplot从一行中获取每个点。这组点是垂直堆叠的——这与您拥有的几乎相同。数据文件不一致的地方在于没有将空白记录添加到单独的数据分组中。某些情况不起作用:gnuplot>plot for[idx=0:1]“example.dat”i idx u 2:3 w lines…返回无效表达式,指向[@user584583-你有什么版本的gnuplot?如果你在gnuplot 4.2上,迭代将不起作用迭代是在gnuplot 4.3中引入的-当前稳定的版本是4.6。我的版本是旧版本,今年在我使用Initech的地方不会升级。@user584583-上面的迭代行相当于:plot'example.dat'I0 u 2:3 w行,'example.dat'i 1 u 2:3 w行,无迭代。某些内容不起作用:gnuplot>plot for[idx=0:1]”example.dat'i idx u 2:3 w行…返回无效表达式,指向[@user584583-你有什么版本的gnuplot?如果你在gnuplot 4.2上,迭代将不起作用迭代是在gnuplot 4.3中引入的-当前稳定的版本是4.6。我的版本是旧版本,今年在我使用Initech的地方不会升级。@user584583-上面的迭代行相当于:plot'example.dat'I0 u 2:3 w行,“example.dat”i 1 u 2:3 w行,无需迭代。