mirror of
https://github.com/dkogan/feedgnuplot.git
synced 2025-05-06 06:21:16 +08:00
packaged the script for CPAN
This commit is contained in:
parent
4d77d6dcdc
commit
3c52be3284
18
Build.PL
Normal file
18
Build.PL
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Module::Build;
|
||||||
|
|
||||||
|
my $builder = Module::Build->new(
|
||||||
|
module_name => 'feedGnuplot',
|
||||||
|
license => 'perl',
|
||||||
|
dist_author => q{Dima Kogan <dkogan@cds.caltech.edu>},
|
||||||
|
dist_version_from => 'bin/feedGnuplot',
|
||||||
|
build_requires => {
|
||||||
|
'Test::Script::Run' => 0,
|
||||||
|
},
|
||||||
|
add_to_cleanup => [ 'feedGnuplot-*' ],
|
||||||
|
create_makefile_pl => 'traditional',
|
||||||
|
script_files => ['bin/feedGnuplot'],
|
||||||
|
);
|
||||||
|
|
||||||
|
$builder->create_build_script();
|
4
Changes
Normal file
4
Changes
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
Revision history for feedGnuplot
|
||||||
|
|
||||||
|
1.00 2011/01/23
|
||||||
|
Initial version uploaded to CPAN
|
11
MANIFEST
Normal file
11
MANIFEST
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
Build.PL
|
||||||
|
Changes
|
||||||
|
MANIFEST
|
||||||
|
README
|
||||||
|
bin/feedGnuplot
|
||||||
|
t/00-load.t
|
||||||
|
t/manifest.t
|
||||||
|
t/pod-coverage.t
|
||||||
|
t/pod.t
|
||||||
|
Makefile.PL
|
||||||
|
META.yml
|
@ -10,6 +10,8 @@ use threads::shared;
|
|||||||
use Thread::Queue;
|
use Thread::Queue;
|
||||||
use Text::ParseWords;
|
use Text::ParseWords;
|
||||||
|
|
||||||
|
our $VERSION = '1.00';
|
||||||
|
|
||||||
open(GNUPLOT_VERSION, 'gnuplot --version |');
|
open(GNUPLOT_VERSION, 'gnuplot --version |');
|
||||||
my ($gnuplotVersion) = <GNUPLOT_VERSION> =~ /gnuplot\s*(\d*\.\d*)/;
|
my ($gnuplotVersion) = <GNUPLOT_VERSION> =~ /gnuplot\s*(\d*\.\d*)/;
|
||||||
if(!$gnuplotVersion)
|
if(!$gnuplotVersion)
|
||||||
@ -674,3 +676,177 @@ sub pushPoint
|
|||||||
|
|
||||||
push @$curve, $xy;
|
push @$curve, $xy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
__END__
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
feedGnuplot - A pipe-oriented frontend to Gnuplot
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
Simple plotting of stored data:
|
||||||
|
|
||||||
|
$ seq 5 | awk '{print 2*$1, $1*$1}'
|
||||||
|
2 1
|
||||||
|
4 4
|
||||||
|
6 9
|
||||||
|
8 16
|
||||||
|
10 25
|
||||||
|
|
||||||
|
$ seq 5 | awk '{print 2*$1, $1*$1}' |
|
||||||
|
feedGnuplot --lines --points --legend "data 0" --title "Test plot" --y2 1
|
||||||
|
|
||||||
|
Simple real-time plotting example: plot how much data is received on the wlan0
|
||||||
|
network interface in bytes/second (uses bash, awk and Linux):
|
||||||
|
|
||||||
|
$ while true; do sleep 1; cat /proc/net/dev; done |
|
||||||
|
awk '/wlan0/ {if(b) {print $2-b; fflush()} b=$2}' |
|
||||||
|
feedGnuplot --lines --stream --xlen 10 --ylabel 'Bytes/sec' --xlabel seconds
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
This is a flexible, command-line-oriented frontend to Gnuplot. It creates
|
||||||
|
plots from data coming in on STDIN or given in a filename passed on the
|
||||||
|
commandline. Various data representations are supported, as is hardcopy
|
||||||
|
output and streaming display of live data. A simple example:
|
||||||
|
|
||||||
|
$ seq 5 | awk '{print 2*$1, $1*$1}' | feedGnuplot
|
||||||
|
|
||||||
|
You should see a plot with two curves: one on the y1 axis (left) and the other
|
||||||
|
on the y2 axis (right). The plots should have a legend and a title. The C<awk>
|
||||||
|
command generates some data to plot and the C<feedGnuplot> reads it in from
|
||||||
|
STDIN and generates the plot. The <awk> invocation is just an example; more
|
||||||
|
interesting things would be plotted in normal usage. None of the
|
||||||
|
commandline-options are required for the most basic plotting. Input parsing is
|
||||||
|
flexible; every line need not have the same number of points. New curves will be
|
||||||
|
created as needed.
|
||||||
|
|
||||||
|
The most commonly used functionality of gnuplot is supported directly by the
|
||||||
|
script. Anything not directly supported can still be done with the
|
||||||
|
C<--extracmds> and C<--curvestyle> options.
|
||||||
|
|
||||||
|
=head2 Data formats
|
||||||
|
|
||||||
|
=head3 Domain selection
|
||||||
|
|
||||||
|
There are 2 main commandline options to control the interpretation of the input
|
||||||
|
data. If C<--domain> is passed in, the first value on each line of input is
|
||||||
|
interpreted as the I<X>-value for the rest of the data on that line. Without
|
||||||
|
C<--domain> the I<X>-value is the line number, and the first value on a line is
|
||||||
|
a plain data point like the others. Default is C<--nodomain>. Thus the example
|
||||||
|
above produced 2 curves, with B<1,2,3,4,5> as the I<X>-values. If we run the
|
||||||
|
same command with --domain:
|
||||||
|
|
||||||
|
$ seq 5 | awk '{print 2*$1, $1*$1}' | feedGnuplot --domain
|
||||||
|
|
||||||
|
we get only 1 curve, with B<2,4,6,8,10> as the I<X>-values. As many points as
|
||||||
|
desired can appear on a single line, but all points on a line are associated
|
||||||
|
with the I<X>-value at the start of that line.
|
||||||
|
|
||||||
|
=head3 Curve indexing
|
||||||
|
|
||||||
|
By default, each column represents a separate curve. This works unless sparse
|
||||||
|
data is to be plotted. With the C<--dataid> option, each point is represented by
|
||||||
|
2 values: a string identifying the curve, and the value itself. If we add
|
||||||
|
C<--dataid> to the original example:
|
||||||
|
|
||||||
|
$ seq 5 | awk '{print 2*$1, $1*$1}' | feedGnuplot --dataid --autolegend
|
||||||
|
|
||||||
|
we get 5 different curves with one point in each. The first column, as produced
|
||||||
|
by awk, is B<2,4,6,8,10>. These are interpreted as the IDs of the curves to be
|
||||||
|
plotted. The C<--autolegend> option adds a legend using the given IDs to label
|
||||||
|
the curves. The IDs need not be numbers; generic strings are accepted. As many
|
||||||
|
points as desired can appear on a single line. C<--domain> can be used in
|
||||||
|
conjunction with C<--dataid>.
|
||||||
|
|
||||||
|
=head3 3D data
|
||||||
|
|
||||||
|
To plot 3D data, pass in C<--3d> (for 3D curves) or C<--colormap> (top-down
|
||||||
|
view, color encoding I<Z>). C<--domain> MUST be given when plotting 3D data to
|
||||||
|
avoid domain ambiguity. If 3D data is being plotted, there are by definition 2
|
||||||
|
domain values instead of one (I<Z> as a function of I<X> and I<Y> instead of
|
||||||
|
I<Y> as a function of I<X>). Thus the first 2 values on each line are
|
||||||
|
interpreted as the domain instead of just 1. The rest of the processing happens
|
||||||
|
the same way as before.
|
||||||
|
|
||||||
|
=head2 Real-time streaming data
|
||||||
|
|
||||||
|
To plot display realtime data, pass in the C<--stream> option. Data will then be
|
||||||
|
plotted as it is received, with the refresh rate limited to 1Hz (currently
|
||||||
|
hard-coded). To plot only the most recent data (instead of I<all> the data),
|
||||||
|
C<--xlen windowsize> can be given. This will create an constantly-updating,
|
||||||
|
scrolling view of the recent past. The windowsize is given in domain units
|
||||||
|
(passed-in values if C<--domain> or line numbers otherwise).
|
||||||
|
|
||||||
|
=head2 Hardcopy output
|
||||||
|
|
||||||
|
The script is able to produce hardcopy output with C<--hardcopy outputfile>. The
|
||||||
|
output type is inferred from the filename with B<.ps>, B<.eps>, B<.pdf> and
|
||||||
|
B<.png> currently supported.
|
||||||
|
|
||||||
|
=head2 Self-plotting data files
|
||||||
|
|
||||||
|
This script can be used to create self-plotting data files. A self-plotting,
|
||||||
|
executable data file C<data> is formatted as
|
||||||
|
|
||||||
|
$ cat data
|
||||||
|
#!/usr/bin/feedGnuplot --lines --points
|
||||||
|
2 1
|
||||||
|
4 4
|
||||||
|
6 9
|
||||||
|
8 16
|
||||||
|
10 25
|
||||||
|
12 36
|
||||||
|
14 49
|
||||||
|
16 64
|
||||||
|
18 81
|
||||||
|
20 100
|
||||||
|
22 121
|
||||||
|
24 144
|
||||||
|
26 169
|
||||||
|
28 196
|
||||||
|
30 225
|
||||||
|
|
||||||
|
This is the shebang (#!) line followed by the data, formatted as before. The
|
||||||
|
data file can be plotted simply with
|
||||||
|
|
||||||
|
$ ./data
|
||||||
|
|
||||||
|
The caveats here are that on Linux the whole #! line is limited to 127 charaters
|
||||||
|
and that the full path to feedGnuplot must be given. The 127 character limit is
|
||||||
|
a serious limitation, but this can likely be resolved with a kernel patch. I
|
||||||
|
have only tried on Linux 2.6.
|
||||||
|
|
||||||
|
=head2 Further help
|
||||||
|
|
||||||
|
All the options are described with
|
||||||
|
|
||||||
|
$ feedGnuplot --help
|
||||||
|
|
||||||
|
=head1 ACKNOWLEDGEMENT
|
||||||
|
|
||||||
|
This program is originally based on the driveGnuPlots.pl script from
|
||||||
|
Thanassis Tsiodras. It is available from his site at
|
||||||
|
L<http://users.softlab.ece.ntua.gr/~ttsiod/gnuplotStreaming.html>
|
||||||
|
|
||||||
|
=head1 REPOSITORY
|
||||||
|
|
||||||
|
L<https://github.com/dkogan/feedgnuplot>
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Dima Kogan, C<< <dkogan at cds.caltech.edu> >>
|
||||||
|
|
||||||
|
=head1 LICENSE AND COPYRIGHT
|
||||||
|
|
||||||
|
Copyright 2011 Dima Kogan.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of either: the GNU General Public License as published
|
||||||
|
by the Free Software Foundation; or the Artistic License.
|
||||||
|
|
||||||
|
See http://dev.perl.org/licenses/ for more information.
|
||||||
|
|
||||||
|
=cut
|
12
ignore.txt
Normal file
12
ignore.txt
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
blib*
|
||||||
|
Makefile
|
||||||
|
Makefile.old
|
||||||
|
Build
|
||||||
|
Build.bat
|
||||||
|
_build*
|
||||||
|
pm_to_blib*
|
||||||
|
*.tar.gz
|
||||||
|
.lwpcookies
|
||||||
|
cover_db
|
||||||
|
pod2htm*.tmp
|
||||||
|
feedGnuplot-*
|
Loading…
Reference in New Issue
Block a user