#!/usr/bin/perl # # Figure out which low-level commands are necessary to refresh an # interactive PLplot device use strict; use PDL::Graphics::PLplot; sub refresh{ my $x = sequence(10); my $y = $x**2; # my $w=PDL::Graphics::PLplot->new(DEV=>'psc',FILE=>'plplottest.ps',JUST=>0); my $w = PDL::Graphics::PLplot->new(DEV=>'xwin',FILE=>':0',JUST=>1); plspause(0); ## Either use this chunk of lines # # print "before first plot BOX is ",@{$w->{BOX}},"\n"; # $w->xyplot2(10*$x,$y); # print "after first plot BOX is ",@{$w->{BOX}},"\n"; # $w->hold; # $w->xyplot2(10*$x,$y*2,COLOR=>'RED'); # print "after second plot BOX is ",@{$w->{BOX}},"\n"; # $w->release; # $w->close; ## or use this chunk of lines # my $size = 50; $w->imag(sequence($size,$size),PALETTE=>'GREYSCALE'); # sleep 3; $w->imag(random($size,2*$size)); $w->close; } sub PDL::Graphics::PLplot::imag { my $self = shift; my $img = shift; my %opts = @_; # Set PLplot to right output stream plsstrm($self->{STREAMNUMBER}); # Advance the (sub)page unless we're being held or the window is brand new pladv(0) unless $self->held or !exists($self->{BOX}); # Only process COLORMAP entries once my $z = $opts{COLORMAP}; delete ($opts{COLORMAP}); # Set ticks to be external $self->{XBOX} = $self->{XBOX} . 'i' unless exists($opts{XBOX});# =~ /i/i; $self->{YBOX} = $self->{YBOX} . 'i' unless exists($opts{YBOX});# =~ /i/i; $self->setparm(%opts); my @borders = (-0.5,$img->dim(0)-0.5,-0.5,$img->dim(1)-0.5); unless ( $self->held ) { $self->{BOX} = \@borders; } $self->_setwindow; $self->_drawlabels; # Draw the image plimage($img,@borders,0,0,@borders); # Plot box plcol0(1); # set to frame color plbox($self->{XTICK}, $self->{NXSUB}, $self->{YTICK}, $self->{NYSUB}, $self->{XBOX}, $self->{YBOX}); # !!! note out of order call plflush(); } sub PDL::Graphics::PLplot::held{ my $self = shift; return $self->{HELD}; } sub PDL::Graphics::PLplot::hold{ my $self = shift; $self->{HELD} = 1; } sub PDL::Graphics::PLplot::release{ my $self = shift; $self->{HELD} = 0; } sub PDL::Graphics::PLplot::xyplot2 { my $self = shift; my $x = shift; my $y = shift; my %opts = @_; # Set PLplot to right output stream plsstrm($self->{STREAMNUMBER}); # Only process COLORMAP entries once my $z = $opts{COLORMAP}; delete ($opts{COLORMAP}); # Handle ERRORBAR options my $xeb = $opts{XERRORBAR}; my $yeb = $opts{YERRORBAR}; delete ($opts{XERRORBAR}); delete ($opts{YERRORBAR}); # Advance the (sub)page unless we're being held or the window is brand new pladv(0) unless $self->held or !exists($self->{BOX}); # Apply options $self->setparm(%opts); unless ($self->held) { # unless (exists($self->{BOX})) { $self->{BOX} = [$x->minmax, $y->minmax]; } # Set up viewport, subpage, world coordinates $self->_setwindow; # Draw labels $self->_drawlabels; # Plot box plcol0(1); # set to frame color plbox($self->{XTICK}, $self->{NXSUB}, $self->{YTICK}, $self->{NYSUB}, $self->{XBOX}, $self->{YBOX}); # !!! note out of order call # Set the color according to the color specified in the object # (we don't do this as an option, because then the frame might # get the color requested for the line/points plcol0($self->{CURRENT_COLOR_IDX}); # Set line style for plot only (not box) pllsty($self->{LINESTYLE}); # Set line width for plot only (not box) plwid($self->{LINEWIDTH}); # Plot lines if requested if ($self->{PLOTTYPE} =~ /LINE/) { plline($x, $y); } # Set line width back plwid(0); # Plot points if requested if ($self->{PLOTTYPE} =~ /POINTS/) { my $c = $self->{SYMBOL}; unless (defined($c)) { # The default for $c is a PDL of ones with shape # equal to $x with the first dimension removed # my $z = PDL->zeroes($x->nelem); $c = PDL->ones($z->zcover) unless defined($c); } plssym(0, $self->{SYMBOLSIZE}) if (defined($self->{SYMBOLSIZE})); if (defined($z)) { # If a color range plot requested my ($min, $max) = exists ($self->{ZRANGE}) ? @{$self->{ZRANGE}} : $z->minmax; plcolorpoints($x, $y, $z, $c, $min, $max); } else { plsym($x, $y, $c); } } # Plot error bars, if requested if (defined($xeb)) { # Horizontal (X) error bars plerrx($x->nelem, $x - $xeb/2, $x + $xeb/2, $y); } if (defined($yeb)) { # Vertical (Y) error bars plerry($y->nelem, $x, $y - $yeb/2, $y + $yeb/2); } # Flush the PLplot stream. plflush(); }