1

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

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

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

4

2 回答 2

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”。using然后 gnuplot 在关键字之后进行条件比较。在第一个绘图命令中,它检查第一个数据列是否等于 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'

在 plot 命令之前。

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

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'
于 2012-10-23T14:14:53.943 回答
2

我假设您想为磁盘 1 和磁盘 2 绘制 GB_used 与日期。如果是这样的话,这几乎是 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 的回答所证明的那样,基本上可以通过过滤来实现相同的效果

于 2012-10-23T14:16:27.347 回答