DOKK / manpages / debian 10 / pdl / PDL::Prima.3pm.en
Prima(3pm) User Contributed Perl Documentation Prima(3pm)

PDL::Demos::Prima - PDL demo for PDL::Graphics::Prima

You can enjoy this demo in any number of ways. First, you can invoke the demo from the command line by saying

 perl -MPDL::Demos::Prima

Second, you can invoke the demo from with the pdl shell by saying

 pdl> demo prima

Finally, all of the content is in the pod documentation, so you can simply read this, though it won't be quite so interactive. :-)

 perldoc PDL::Demos::Prima
 podview PDL::Demos::Prima

The documentation in this module is meant to give a short, hands-on introduction to PDL::Graphics::Prima, a plotting library written on top of the Prima GUI toolkit.

To get started, you will want to use PDL::Graphics::Prima::Simple. This module provides a set of friendly wrappers for simple, first-cut data visualization. PDL::Graphics::Prima, the underlying library, is a general-purpose 2D plotting library built as a widget in the Prima GUI toolkit, but we don't need the full functionality for the purposes of this demo.

 use PDL::Graphics::Prima::Simple;
 my $x = sequence(100)/10;
 line_plot($x, $x->sin);

In addition to numerous ways to plot x/y data, you can also plot distributions and images. The best run-down of the simple plotting routines can be found in the Synopsis for PDL::Graphics::Prima::Simple.

 $distribution = grandom(100);
 hist_plot($distribution);
 
 $x = sequence(100)/10;
 cross_plot($x, $x->sin);
 
 $image = rvals(100, 100);
 matrix_plot($image);

Plots allow for mouse interaction, herein referred to as twiddling. You can resize the window, zoom with the scroll wheel, or click and drag the canvas around. There is also a right-click zoom-rectangle, and a right-click context menu.

 hist_plot(grandom(100));
 
 # Run this, then try using your mouse

In your Perl scripts, and in the PDL shell for some operating systems and some versions of Term::ReadLine, twiddling will cause your script to pause when you create a new plot. To resume your script or return execution to the shell, either close the window or press 'q'.

 # If your PDL shell supports simultaneous
 # input and plot interaction, running this
 # should display both plots simultaneously:
 
 $x = sequence(100)/10;
 cross_plot($x, $x->sin);
 line_plot($x, $x->cos);

The blocking behavior just discussed is due to what is called autotwiddling. To turn this off, simply send a boolean false value to auto_twiddle. Then, be sure to invoke twiddling when you're done creating your plots.

 auto_twiddle(0);
 hist_plot(grandom(100));
 matrix_plot(rvals(100, 100));
 twiddle();

Once turned off, autotwiddling will remain off until you turn it back on.

 # autotwiddling still off
 hist_plot(grandom(100));
 matrix_plot(rvals(100, 100));
 twiddle();

Functions like hist_plot, cross_plot, and matrix_plot actually create and return plot objects which you can subsequently modify. For example, adding a title and axis labels are pretty easy. For titles, you call the title method on the plot object. For axis labels, you call the label method on the axis objects.

 # Make sure autotwiddling is off in your script
 auto_twiddle(0);
 
 # Build the plot
 my $x = sequence(100)/10;
 my $plot = line_plot($x, $x->sin);
 
 # Add the title and labels
 $plot->title('Harmonic Oscillator');
 $plot->x->label('Time [s]');
 $plot->y->label('Displacement [cm]');
 
 # Manually twiddle once everything is finished
 twiddle();

PDL::Graphics::Prima::Simple excels at user interaction, but you can save your plots to a file using save_to_file or save_to_postscript methods, or by right-clicking and selecting the appropriate menu option.

 auto_twiddle(0);
 $x = sequence(100)/10;
 line_plot($x, $x->sin)->save_to_postscript;
 
 # You can supply a filename to the method if you like.
 # Also available is save_to_file, which saves to raster
 # file formats. Expect save_to_postscript to be merged
 # into save_to_file in the future.

Once you have created a plot, you can add additional data to it. You achieve this by adding a new DataSet with the data you want displayed.

 auto_twiddle(0);
 my $plot = hist_plot(grandom(100));
 
 # Add a Gaussian curve that "fits" the data
 use PDL::Constants qw(PI);
 my $fit_xs = zeroes(100)->xlinvals(-2, 2);
 my $fit_ys = exp(-$fit_xs**2 / 2) / sqrt(2*PI);
 $plot->dataSets->{fit_curve} = ds::Pair($fit_xs, $fit_ys);
 
 twiddle();

The default plot type for pairwise data is Diamonds. You can choose a different pairwise plot type, or even mix and match multiple pairwise plot types.

 auto_twiddle(0);
 my $plot = hist_plot(grandom(100));
 
 # Add a Gaussian curve that "fits" the data
 use PDL::Constants qw(PI);
 my $fit_xs = zeroes(200)->xlinvals(-5, 5);
 my $fit_ys = exp(-$fit_xs**2 / 2) / sqrt(2*PI);
 $plot->dataSets->{fit_curve} = ds::Pair($fit_xs, $fit_ys,
     # Use lines
     plotTypes => [
         ppair::Lines(
             # with a thickness of three pixels
             lineWidth => 3,
             # And the color red
             color => cl::LightRed,
         ),
         ppair::Diamonds,
     ],
 );
 
 twiddle();

If you want to specify everything in one command, you can use the plot function. This lets you put everything together that we've already discussed, including multiple DataSets in a single command, title specification, and x and y axis options.

 # Generate some data:
 my $xs = sequence(100)/10 + 0.1;
 my $ys = $xs->sin + $xs->grandom / 10;
 my $y_err = $ys->grandom/10;
 
 # Plot the data and the fit
 plot(
     -data => ds::Pair($xs, $ys,
         plotTypes => [
             ppair::Triangles(filled => 1),
             ppair::ErrorBars(y_err => $y_err),
         ],
     ),
     -fit  => ds::Func(\&PDL::sin,
         lineWidth => 3,
         color => cl::LightRed,
     ),
     -note => ds::Note(
         pnote::Text('Incoming Signal',
             x => 0.2,
             y => sin(0.2) . '-3em',
         ),
     ),
     title => 'Noisey Sine Wave',
     x => {
         label => 'Time [s]',
         scaling => sc::Log,
     },
     y => { label => 'Measurement [Amp]' },
 );

I hope you've enjoyed the tour, and I hope you find PDL::Graphics::Prima to be a useful plotting tool!

 # Thanks!

David Mertens "dcmertens.perl@gmail.com"

Copyright (c) 2013, David Mertens. All righs reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See perlartistic.

2018-11-02 perl v5.28.0