1

这是一个非常具体的用途,但它可以派上用场。

想象一下,你有不同的值要堆叠,有些数据变化很大,有些几乎是恒定的。如果使用默认顺序,变量数据堆叠在常量数据下,变量数据会使常量数据有一个非常可变的基数。因此,如果您首先在底部堆叠较少可变的数据,它可能会有所帮助。

示例:这两个图表显示了如何通过堆叠更深的数据来提高可读性,这些数据移动得越少,即标准偏差越小。

默认图形不利于可读性
默认图形可能导致可读性差

提高按标准差排序时的可读性
提高按标准差排序时的可读性

4

1 回答 1

1
  1. 使用rrdtool graphwithPRINT命令获取数据源的标准差 ( stdev_array)
  2. 种类stdev_array
  3. 通过按顺序堆叠绘制图形stdev_array

这是 PHP 中的代码,但任何语言都可以做到。
我正在使用 RRDtool 1.4.5
不要忘记定义$rrd_path(rrd 文件$img_path的路径)、(写入图像的路径)、$data_sources(DS 名称的数组,取决于您如何构建 RRD)、$rrd_colors(六色)。

$rrd_colors_count = count($rrd_colors);
$stdev_command = "rrdtool graph /dev/null ";
foreach ($data_sources as $index => $ds_name)
{
  $stdev_command .= "DEF:serv$index=$rrd_path:$ds_name:AVERAGE ";
  $stdev_command .= "VDEF:stdev$index=serv$index,STDEV PRINT:stdev$index:%lf ";
}
exec($stdev_command, $stdev_order, $ret);
if ($ret === 0)
{
  array_shift($stdev_order); // remove first useless line "0x0" (may depend on your rrdtool version?)
  asort($stdev_order); // sort by standard deviation keeping the indexes
}
else $stdev_order = $data_sources; // backup in case $stdev_command failed

$graph_command = "rrdtool graph $img_path ";
$graph_command .= "AREA:0 ";
foreach ($stdev_order as $index => $useless)
{
  $ds_name = $data_sources[$index];
  $graph_command .= "DEF:line$index=$rrd_path:$ds_name:AVERAGE ";
  $graph_command .= "STACK:line$index" . $rrd_colors[$index%$rrd_colors_count].' ';
}
exec($graph_command, $out, $ret);
// check $ret (and $out) to see if all is good
于 2012-12-19T18:06:25.997 回答