package PDL::Demos::PGPLOT_OO_demo;
# show how to use the new OO PGPLOT interface
use PDL;
use PDL::Graphics::PGPLOT::Window;
PDL::Demos::Routines->import();
sub comment($);
sub act($);
sub output;
sub run {
$ENV{PGPLOT_XW_WIDTH}=0.3;
$ENV{PGPLOT_DEV}=$^O =~ /MSWin32/ ? '/GW' : "/XSERVE";
comment q|
The PGPLOT demo showed you how to use the old interface to PGPLOT.
As this is perl, TIMTOWTDI, and this demo shows you how to use the
new, object-orientated PGPLOT interface. For the simple examples
shown here, the new method appears overkill; however, it really
comes into its own when you wish to deal with multiple plots
or windows.
Enough prattle, on with the show...
|;
act q|
# we start with a different module to the traditional interface
use PDL::Graphics::PGPLOT::Window;
# create a window "object"
$dev = $^O =~ /MSWin32/ ? '/GW' : '/XSERVE';
$win = PDL::Graphics::PGPLOT::Window->new( { Dev => $dev } );
|;
act q|
# First we define some variables to use for the rest of the demo.
$x=sequence(10);
$y=2*$x**2;
# Now a simple plot with points
$win->points( $x, $y );
|;
act q|
# Here is the same with lines
$win->line( $x, $y );
# if you're beginning to think its the same as the old calls,
# just with "$win->" at the beginning then you're not far wrong!
|;
act q|
# You can do all the things you did before ...
$win->points( $x, $y, {Symbol=>4} );
$win->hold;
$win->line( $x, $y );
$yerr=sqrt($y);
$win->errb( $x, $y, $yerr );
$win->release;
|;
act q|
# and it acts the same way
$gradient=sequence(40,40);
$win->imag( $gradient );
$win->hold;
$win->cont( $gradient );
$win->release;
# add labels to the plot
$win->label_axes( "An axis", "Another axis", "Title" );
|;
act q|
# let's try and read the cursor
use PDL::Complex;
$c = zeroes(300)->xlinvals(0,12)+i*zeroes(300)->xlinvals(2,10);
$sin = sin $c;
$win->line( $sin->im, $sin->re );
print "Select a point in the graph (mouse button or key press):\n";
( $x, $y, $ch ) = $win->cursor( { Type=>'CrossHair' } );
print "\nYou selected: $x + $y i (key = $ch)\n";
|;
# should really do something related to the selected points...
act q|
# how about another window?
$win2 = PDL::Graphics::PGPLOT::Window->new( { Dev => $dev } );
$win2->env( 0, 4, -2, 0, { Axis => 'logy' } );
$x = sequence(101) / 25;
$win2->points( $x, $x->sin->abs()->log10 );
|;
act q|
# switch back to the original window (we don't want to hurt
# its feelings)
$win->line( $x, { Border => 1 } );
|;
act q|
# free up the windows, after finding their names
print "You've been watching " . $win->name();
print " and " . $win2->name() . "\n";
$win->close();
$win2->close();
|;
}
1;