[prev in list] [next in list] [prev in thread] [next in thread]
List: postgresql-general
Subject: Re: [GENERAL] Creating web images from postgres data
From: "Michael A. Koerber SR" <mak () ll ! mit ! edu>
Date: 1998-10-29 19:58:31
[Download RAW message or body]
Opps...
#!/usr/bin/perl -w
# $Source: /home/mak/CVS/misc_util/pp,v $
# $Author: mak $
# $Date: 1998/08/12 19:01:55 $
# $Revision: 1.5 $
# ----------------------------------------------------------------------
# Parse command line options
use Getopt::Std;
%opts = ();
getopts('t:x:y:l:f:q',\%opts);
# If the 'l' (legend) option exists, parse it based on the ':' character
@legend = split(':',$opts{l}) if exists($opts{l});
if (exists($opts{f})) {
$out_base = $opts{f};
}
else {
$out_base = 'gnuplot';
}
# ----------------------------------------------------------------------
# Begin parsing input
while (<>) {
# --------------------------------------------------
# strip out | characters
s/\|/ /g;
# --------------------------------------------------
# work only on strings which are purely numeric. This is a bit tricky
# but we allow the columns of numbers to contain unit specifier and
# just suck out the numeric data
@line = ();
while (m/\G[^-\d\s]*\s*([-+]*\d+\.?\d*[-+eE]*\d*)[\s\n]*[^-\d\s]*/g) {
push @line, $1;}
if (@line) {
$cols = @line unless $cols;
# Testing line
# print join(' : ',@line), "\n";
# Open an output file for pairs of columns ($line[0,1],
$line[0,2], etc)
unless (@filenames) {
# This will only happen the first time through
@filenames = map { "A$_" } (1..$#line);
foreach $fn (@filenames) {
$cmd = "open $fn, \">\$fn\" or die \"Unable to open file
\$fn\\n\"";
eval($cmd);
}
}
# Begin output of this line of data
if (@line == $cols) {
# Only output if the number of lines is consistant with the
first valid row
@cmds = map { "$filenames[$_] \"$line[0] $line[$_+1] \n\"" }
(0..$#filenames);
foreach (@cmds) {
# print "$_\n";
eval("print $_ \n");
}
}
else {
warn "Number of columns changed. Trashing this line:\n";
warn "$_";
}
}
}
# ----------------------------------------------------------------------
# Close all the files
foreach $fn (@filenames) {
$cmd = "close $fn";
eval($cmd);
}
# ----------------------------------------------------------------------
# set up the gnuplot command file
$cmd = "plot ";
foreach (@filenames) {
if (@legend) {
$this_legend = shift @legend;
$cmd .= qq('$_' using 1:2 title '$this_legend' with linespoints,
);
}
else {
$cmd .= "'$_' using 1:2 with linespoints, ";
}
}
chop $cmd;
chop $cmd;
open( OUT, ">$out_base.cmd") or die "Unable to open $out_base.cmd\n";
push @cmd_opts, qq(set title '$opts{"t"}') if exists($opts{"t"});
push @cmd_opts, qq(set xlabel '$opts{"x"}') if exists($opts{"x"});
push @cmd_opts, qq(set ylabel '$opts{"y"}') if exists($opts{"y"});
$cmd_list = join(';',@cmd_opts);
if (exists $opts{'q'}) {
# Then quiet mode was selected. Only output to a postscript file
print OUT <<END;
set terminal postscript landscape color
set output \'$out_base.ps\'
set grid
$cmd_list
$cmd
END
close OUT;
}
else {
# Output to screen and to postscript file
print OUT <<END;
set grid
$cmd_list
$cmd
pause 5
set terminal postscript landscape color
set output \'$out_base.ps\'
replot
END
close OUT;
}
system(qq(gnuplot $out_base.cmd));
print "See $out_base.ps in current directory for last plot\n";
__END__
=head1 NAME
pp - Postgres Plotting Script
=head1 SYNOPSIS
C<pp [-t -x -y -l -f -q]>
=head1 DESCRIPTION
This script will take the tabular output of a Postgres Query and generate
a B<gnuplot> command file (F<gnuplot.cmd>) which is then used to generate
a
plot of the data.
The follow command line options are available
=over 4
=item B<-t title> places a title on the plot
=item B<-x xlabel> places a label on the x-axis
=item B<-y ylabel> places a label on the y-axis
=item B<-l legend_1:legend_2:...> places legends on the plot. Note the
use
of the ':' for delimiting legends. Extra legend will be ignored. If
there are
not enough legends, the ones specified will be used. The remaining
legends are
then F<gnuplot> defaults.
=item B<-f out_file_base_name> creates output files
F<out_file_base_name.cmd> and
F<out_file_base_name.ps>. By default, F<gnuplot.[cmd|ps]> are used.
=item B<-q> is quiet mode. If specified, then the postscript files are
generated
but no screen output is shown. If not specified, then a screen output is
displayed
for 5 seconds, then the postscript file written.
=back
=head1 NOTES
$Source: /home/mak/CVS/misc_util/pp,v $
$Author: mak $
$Date: 1998/08/12 19:01:55 $
$Revision: 1.5 $
Dr Michael A. Koerber
MIT/LL
Radar Imaging Techniques
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic