Follow-up posts
I did much more work on this: Gnuplot for numpy. For real this time
I've been using PDL for numerical computation. It works ok, but is crufty and incomplete in many ways. I'm thus starting to look at numpy as an alternative, as much as I hate switching languages. Such transitions are full of dealing with people's NIH ambitions, and one has to pick one's battles. One battle I refuse to concede is switching away to numpy's preferred NIH plotting system: matplotlib. I've been using gnuplot for something like 20 years at this point, and I'm not moving.
Python land appears to have a reasonably functional gnuplot interface:
gnuplot.py
. It works, but is very clunky to use with numpy. So I wrote
python_gplot
, a wrapper around gnuplot.py
that provides an interface very
similar to my original design for PDL::Graphics::Gnuplot. Examples (ASCII plots
just as a demo):
dima@shorty:~/projects/python_gplot$ cat test.py #!/usr/bin/python2 from numpy import * from gplot import * x = arange(100) y = x ** 2 gplot( x,y, cmd="set terminal dumb" ) g2 = python_gplot("set terminal dumb") g2.plot({'with': 'lines'}, y, x) g2.plot( (x-100, y), ({'with': 'lines'}, -x,y) ) dima@shorty:~/projects/python_gplot$ ./test.py 100.000 +-+----+-----+------+-----+------+------+-----+------+-----+----+-+ + + + + + + + + + ++++++ + 90.000 +-+ ++++-++ +-+ | ++-+++ | 80.000 +-+ +++++ +-+ | +++++ | 70.000 +-+ +++++ +-+ | ++++ | 60.000 +-+ ++++ +-+ 50.000 +-+ ++++ +-+ | ++++ | 40.000 +-+ +++ +-+ | +++ | 30.000 +-+ +++ +-+ | ++ | 20.000 +-++ +-+ |++ | 10.000 +-+ +-+ + + + + + + + + + + + 0.000 +-+----+-----+------+-----+------+------+-----+------+-----+----+-+ 0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 10000.000 +-+----------+------------+-----------+------------+----------+A+ ++++ + + + + AAA+ 9000.000 +-+++ AA+-+ | +++ AAA | 8000.000 +-+ +++ AAA +-+ | +++ AAA | 7000.000 +-+ +++ AAA +-+ | +++ AAA | 6000.000 +-+ ++ AA +-+ 5000.000 +-+ +++ AAA +-+ | +++ AAA | 4000.000 +-+ +++ AAA +-+ | +++ AAA | 3000.000 +-+ +++ AAA +-+ | +AAAA | 2000.000 +-+ AAAA ++++ +-+ | AAAA ++++ | 1000.000 +-+ AAAAA +++++ +-+ + AAAAAAAA + + ++++++++ + 0.000 AAAAAAAAAAA--+------------+-----------+------------+----------+-+ -100 -80 -60 -40 -20 0 10000.000 +-+---+------+-----+------+-----+-----+------+-----+------+---+A+ + + + + + + + + + + AAA+ 9000.000 +-+ AA+-+ | AAA | 8000.000 +-+ AAA +-+ | AAA | 7000.000 +-+ AAA +-+ | AAA | 6000.000 +-+ AA +-+ 5000.000 +-+ AAA +-+ | AAA | 4000.000 +-+ AAA +-+ | AAA | 3000.000 +-+ AAA +-+ | AAAA | 2000.000 +-+ AAAA +-+ | AAAA | 1000.000 +-+ AAAAA +-+ + + AAAAAAAA+ + + + + + + + 0.000 AAAAAAAAAAA--+-----+------+-----+-----+------+-----+------+---+-+ 0 10 20 30 40 50 60 70 80 90 100
Brief description
Here you can plot into a global gnuplot
instance using the gplot()
function.
Or you can create a new instance by instantiating class python_gplot
. In
either case, you can pass in plot parameters for a single set of data or a
tuple of such parameters if we want to plot multiple pieces of data on the same
plot.
Each set of plot parameters is a list that's an ndarray
of y
values or x
,
y
. Optionally, the first element of this list can be a dict
that's passed to
gnuplot.py
unmodified.
Lastly, arbitrary gnuplot
commands can be given with
gplot( ...., cmd="gnuplot command!!!")
or in a constructor:
g = python_gplot("gnuplot command!!!")
Explained examples
Let's say you have two ndarray
objects: x
and y
.
In its most simple form you can plot y
versus x
:
gplot( x,y )
If you want to pick a different terminal, say:
gplot( x,y, cmd="set terminal dumb" )
If you just want to plot y
against integers, it's even simpler:
gplot( y )
If you want to make such a plot but with points and lines:
gplot( {'with': 'linespoints'}, y )
If you want to plot two curves on the same plot:
gplot( (x,y), ({'with': 'linespoints'}, y,x) )
Bugs
This is an extremely early alpha. I think it works, but haven't used it very much yet. I'll improve this as I need features. 3D plotting will happen at some point (maybe it works already). Also, this is my first python effort, and the code quality will improve. Documentation is extremely lacking right now. This will likewise improve as I use this.
License
Copyright 2015, Dima Kogan. Distributed under the terms of GNU LGPL, like
gnuplot.py