From 112ed474401ded8d572e07d89ab367adad1df6b2 Mon Sep 17 00:00:00 2001 From: Ole Tange Date: Wed, 3 Mar 2021 22:18:06 +0100 Subject: [PATCH] plotpipe: --log axis. --- plotpipe/plotpipe | 83 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 26 deletions(-) diff --git a/plotpipe/plotpipe b/plotpipe/plotpipe index a3b78f5..5baeda0 100755 --- a/plotpipe/plotpipe +++ b/plotpipe/plotpipe @@ -9,12 +9,12 @@ plotpipe - Plot CSV data from a pipe =head1 SYNOPSIS -I | B [-n] [-H] [-0] [--logx] [--logy] [-C str] [-h] [-V] +I | B [-n] [-H] [-0] [--log axis] [-C str] [-h] [-V] =head1 DESCRIPTION -B is a simple wrapper for Gnuplot to simply plot data. +B is a simple wrapper for Gnuplot to simply plotting data. The input is a CSV-file. Lines starting with '#' will be used as titles on the plot. @@ -48,11 +48,11 @@ B<--header>. Show help. -=item B<--logx> +=item B<--log x> -=item B<--logy> +=item B<--log y> -=item B<--logxy> +=item B<--log xy> Logarithmic X/Y/X&Y axis. @@ -139,7 +139,18 @@ input.csv: 4 9 16 8 27 64 - cat input.csv | plotpipe --nox --logy + cat input.csv | plotpipe --nox --log y + +=head1 EXAMPLE: XY-line plots + +You are not limited to a simple graph, but can also do XY-line plots. + + seq 0 0.001 6.29 | + perl -nE 'say sin($_*100)*0.3+0.5*cos($_*2),",", + sin($_*2)-cos($_*100)*0.3,",", + sin($_)+cos($_*99),",", + sin($_*3)-cos($_*101)' | + plotpipe =head1 LIMITS @@ -149,7 +160,7 @@ B is limited by Gnuplot. =head1 AUTHOR -Copyright (C) 2019-2020 Ole Tange, +Copyright (C) 2019-2021 Ole Tange, http://ole.tange.dk and Free Software Foundation, Inc. @@ -173,12 +184,12 @@ along with this program. If not, see . =head1 DEPENDENCIES -B uses B. +B uses B and B. =head1 SEE ALSO -B, B +B, B =cut @@ -193,9 +204,7 @@ sub options_hash() { "version|V" => \$opt::version, "colsep|col-sep|C=s" => \$opt::colsep, "help|h" => \$opt::help, - "logx" => \$opt::logx, - "logy" => \$opt::logy, - "logxy" => \$opt::logxy, + "log=s" => \$opt::log, "null|0" => \$opt::null, "nox|n" => \$opt::nox, "header|H" => \$opt::header, @@ -208,7 +217,7 @@ sub version() { print join ("\n", "$Global::progname $Global::version", - "Copyright (C) 2020 Ole Tange, http://ole.tange.dk and Free Software", + "Copyright (C) 2020-2021 Ole Tange, http://ole.tange.dk and Free Software", "Foundation, Inc.", "License GPLv3+: GNU GPL version 3 or later ", "This is free software: you are free to change and redistribute it.", @@ -219,6 +228,19 @@ sub version() { ); } +sub status(@) { + my @w = @_; + my $fh = $Global::status_fd || *STDERR; + print $fh map { ($_, "\n") } @w; + flush $fh; +} + +sub error(@) { + my @w = @_; + my $prog = $Global::progname || "plotpipe"; + status(map { ($prog.": Error: ". $_); } @w); +} + sub help() { # Returns: N/A print join @@ -231,7 +253,7 @@ sub help() { '-0 Records separated by \0 instead of \n', '-C str Columns separator', '-V Show version', - '--logx/logy/logxy Log x/y/x&y', + '--log A Log axis A (x y xy)', '-n No X value', '-s num Smooth num Y-values', "", @@ -341,9 +363,12 @@ sub find_sep(@) { Getopt::Long::Configure("bundling","require_order"); -my $retval = GetOptions(options_hash()); +if(not GetOptions(options_hash())) { + exit(255); +} + $Global::progname = "plotpipe"; -$Global::version = 20201222; +$Global::version = 20210222; if($opt::version) { version(); exit 0; } if($opt::help) { help(); exit 0; } if($opt::null) { $/ = "\0"; } @@ -409,8 +434,7 @@ if($ncols >= 2 and not $opt::nox) { if($opt::smooth) { my (@sum,@new); if($#tbl < $opt::smooth) { - print STDERR "plotpipe: --smooth must be lower than the ", - "number of rows (",1+$#tbl,")\n"; + error("--smooth must be lower than the number of rows (".(1+$#tbl).")"); exit(255); } my $smooth = $opt::smooth-1; @@ -445,16 +469,23 @@ for(my $col = 2; $col <= $ncols; $col++) { if($opt::header) { $legend = qq( title "$header[$col-1]"); } - push @plotscript, qq("$filename" using 1:$col with lines $legend,); + push @legend, qq("$filename" using 1:$col with lines $legend,); } -# Add --logx/--logy/--logxy to Gnuplot script +# Add --log axis to Gnuplot script my @logscale; -if($opt::logx or $opt::logxy) { - push @logscale, "set logscale x 10;"; -} -if($opt::logy or $opt::logxy) { - push @logscale, "set logscale y 10;"; +if($opt::log) { + if($opt::log eq "x") { + push @logscale, "set logscale x 10;"; + } elsif($opt::log eq "y") { + push @logscale, "set logscale y 10;"; + } elsif($opt::log eq "xy" or $opt::log eq "yx") { + push @logscale, "set logscale x 10;"; + push @logscale, "set logscale y 10;"; + } else { + error("--log $opt::log is not supported. Only x y xy are supported"); + exit(255); + } } # Make full Gnuplot script @@ -467,7 +498,7 @@ set xlabel "$header[0]"; set grid; set key right center; set datafile separator "\001"; -plot @plotscript +plot @legend _EOS open GNUPLOT,"|-", "gnuplot -p -e ".Q($plotscript) or die;