From d3af2e6a5b3960d05dbaa8774c59e4e82012a74c Mon Sep 17 00:00:00 2001 From: "Peter J. Holzer" Date: Tue, 17 Dec 2019 11:40:40 +0100 Subject: [PATCH] Add tsplotsql based on tsplot --- tsplotsql | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100755 tsplotsql diff --git a/tsplotsql b/tsplotsql new file mode 100755 index 0000000..998b098 --- /dev/null +++ b/tsplotsql @@ -0,0 +1,108 @@ +#!/usr/bin/perl +use v5.24; +use warnings; + +use Getopt::Long; +use Pod::Usage; + +use DBIx::SimpleConnect; +use TimeSeries; + +=head1 NAME + +tsplot - plot time series in column format + +=head1 SYNOPSIS + +tsplot +[--dbname dbname] +[--finalresolution dpi] +[--legend-position pos] +[--output-format format ] +[--stacked] +[--style style] +[--time_t] +[--yrange min max] +[query ...] + +=head1 DESCRIPTION + +This program expects time series data in column format, I.e., +each line contains a timestamp and the values for each series, except +the first one which contains the column headers, which are used for the +legend. Columns are separated by any amount of whitespace unless the +--tsv option is given which enables tab-separated columns. + +The default legend position is "top right", same as with gnuplot. +Another frequently useful position (especially if you have lots of series) +is "below". Note that positions which consist of several words (such as +"top right") need to be passed to tsplotv as a single argument, so the +space needs to be hidden from the shell by use of quotes or a backslash. + +The default output format is "png", the default style is "lines". + +See L for a description of possible legend positions, +output formats, and styles. + +The --stacked option causes the time series to be stacked on top of each +other. + +The --time_t option specifies that the timestamps are in seconds since +the epoch. Otherwise they are parsed by add_timestring function (which +in turn uses the parse_date function of the HTTP::Date module). + +=cut +my $output_format ='png'; +my $log_y =0; +my $time_t =0; +my $style = "lines"; +my $tsv = 0; +my $stacked = 0; +my @yrange; +my $keeptempfiles; +my $finalresolution; +my $dbname; + +GetOptions('output_format|output-format=s' => \$output_format, + 'log_y|log-y' => \$log_y, + 'time_t' => \$time_t, + 'style=s' => \$style, + 'tsv' => \$tsv, + 'stacked' => \$stacked, + 'yrange=s{2}' => \@yrange, + 'keeptempfiles' => \$keeptempfiles, + 'finalresolution=i' => \$finalresolution, + 'dbname=s' => \$dbname, + ) + or pod2usage(verbose => 0); + +my $sep = $tsv ? qr/\t/ : ' '; + +binmode STDOUT, ':raw'; + +my $ts = TimeSeries->new(output_format => $output_format); +$ts->{keeptempfiles} = 1 if $keeptempfiles; + +my $dbh = DBIx::SimpleConnect->connect($dbname); +my $sth = $dbh->prepare($ARGV[0]); +$sth->execute(); +my @legend = $sth->{NAME}->@*; +shift @legend; +$ts->legend(@legend); + +while (my (@r) = $sth->fetchrow_array) { + my ($timestamp, @values) = @r; + if ($time_t) { + $ts->add($timestamp, @values); + } else { + $ts->add_timestring($timestamp, @values); + } +} +$ts->log_y($log_y); +$ts->style($style); +$ts->stacked($stacked); +$ts->yrange(@yrange); +$ts->finalresolution($finalresolution) if $finalresolution; + +my $g = $ts->plot(); +print $g