--- loncom/xml/lonplot.pm 2005/06/07 22:30:42 1.109 +++ loncom/xml/lonplot.pm 2005/06/09 02:16:04 1.110 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.109 2005/06/07 22:30:42 foxr Exp $ +# $Id: lonplot.pm,v 1.110 2005/06/09 02:16:04 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -102,6 +102,7 @@ my %linestyles = yerrorbars => [3,4], xyerrorbars => [4,6], boxes => 3, + filledcurves => 2, vector => 4 ); @@ -125,7 +126,8 @@ my $words_test = sub {$_[0]=~s/\s+/ my @gnuplot_edit_order = qw/alttag bgcolor fgcolor height width font transparent grid samples border align texwidth texfont plotcolor plottype lmargin rmargin tmargin - bmargin major_ticscale minor_ticscale/; + bmargin major_ticscale minor_ticscale boxwidth gridlayer fillstyle + pattern solid/; my $margin_choices = ['default',0..20]; @@ -178,6 +180,19 @@ my %gnuplot_defaults = description => 'Display grid', edit_type => 'onoff' }, + gridlayer => { + default => 'off', + test => $onoff_test, + description => 'Display grid front layer over filled boxes or filled curves', + edit_type => 'onoff' + }, + box_border => { + default => 'noborder', + test => sub {$_[0]=~/^(noborder|border)$/}, + description => 'Draw border for boxes', + edit_type => 'choice', + choices => ['border','noborder'] + }, border => { default => 'on', test => $onoff_test, @@ -191,7 +206,7 @@ my %gnuplot_defaults = edit_type => 'choice', choices => ['small','medium','large'] }, - samples => { + samples => { default => '100', test => $int_test, description => 'Number of samples for non-data plots', @@ -212,55 +227,83 @@ my %gnuplot_defaults = edit_type => 'entry', size => '5' }, - texfont => { + texfont => { default => '22', test => $int_test, description => 'Font size to use in TeX output (pts):', edit_type => 'choice', choices => [qw/8 10 12 14 16 18 20 22 24 26 28 30 32 34 36/], }, - plotcolor => { + plotcolor => { default => 'monochrome', test => sub {$_[0]=~/^(monochrome|color|colour)$/}, description => 'Color setting for printing:', edit_type => 'choice', choices => [qw/monochrome color colour/], }, - plottype => { + pattern => { + default => '', + test => $int_test, + description => 'pattern value for boxes:', + edit_type => 'choice', + choices => [0,1,2,3,4,5,6] + }, + solid => { + default => 0, + test => $real_test, + description => 'The density of fill style for boxes', + edit_type => 'entry', + size => '5' + }, + fillstyle => { + default => 'empty', + test => sub {$_[0]=~/^(empty|solid|pattern)$/}, + description => 'Filled style for boxes:', + edit_type => 'choice', + choices => ['empty','solid','pattern'] + }, + plottype => { default => 'Cartesian', test => sub {$_[0]=~/^(Polar|Cartesian)$/}, description => 'Plot type:', edit_type => 'choice', choices => ['Cartesian','Polar'] }, - lmargin => { + lmargin => { default => 'default', test => sub {$_[0]=~/^(default|\d+)$/}, description => 'Left margin width (pts):', edit_type => 'choice', choices => $margin_choices, }, - rmargin => { + rmargin => { default => 'default', test => sub {$_[0]=~/^(default|\d+)$/}, description => 'Right margin width (pts):', edit_type => 'choice', choices => $margin_choices, }, - tmargin => { + tmargin => { default => 'default', test => sub {$_[0]=~/^(default|\d+)$/}, description => 'Top margin width (pts):', edit_type => 'choice', choices => $margin_choices, }, - bmargin => { + bmargin => { default => 'default', test => sub {$_[0]=~/^(default|\d+)$/}, description => 'Bottom margin width (pts):', edit_type => 'choice', choices => $margin_choices, }, + boxwidth => { + default => '', + test => $real_test, + description => 'width of boxes default auto', + edit_type => 'entry', + size => '5' + }, major_ticscale => { default => '1', test => $real_test, @@ -414,7 +457,7 @@ my %axis_defaults = } ); -my @curve_edit_order = ('color','name','linestyle','pointtype','pointsize'); +my @curve_edit_order = ('color','name','linestyle','pointtype','pointsize','limit'); my %curve_defaults = ( @@ -460,7 +503,14 @@ my %curve_defaults = description => 'point type (may not apply to all line styles)', edit_type => 'choice', choices => [0,1,2,3,4,5,6] - } + }, + limit => { + default => 'closed', + test => sub {$_[0]=~/^(closed|x1|x2|y1|y2)$/}, + description => 'point to fill -- for filledcurves', + edit_type => 'choice', + choices => ['closed','x1','x2','y1','y2'] + }, ); ################################################################### @@ -1065,6 +1115,14 @@ sub write_gnuplot_file { } else { # Assume Cartesian } + # solid or pattern for boxes? + if (lc($Apache::lonplot::plot{'fillstyle'}) eq 'solid') { + $gnuplot_input .= 'set style fill solid '. + $Apache::lonplot::plot{'solid'}.$Apache::lonplot::plot{'box_border'}.$/; + } elsif (lc($Apache::lonplot::plot{'fillstyle'}) eq 'pattern') { + $gnuplot_input .= 'set style fill pattern '.$Apache::lonplot::plot{'pattern'}.$Apache::lonplot::plot{'box_border'}.$/; + } elsif (lc($Apache::lonplot::plot{'fillstyle'}) eq 'empty') { + } # margin if (lc($Apache::lonplot::plot{'lmargin'}) ne 'default') { $gnuplot_input .= 'set lmargin '.$Apache::lonplot::plot{'lmargin'}.$/; @@ -1081,6 +1139,14 @@ sub write_gnuplot_file { # tic scales $gnuplot_input .= 'set ticscale '. $Apache::lonplot::plot{'major_ticscale'}.' '.$Apache::lonplot::plot{'minor_ticscale'}.$/; + #boxwidth + if (lc($Apache::lonplot::plot{'boxwidth'}) ne '') { + $gnuplot_input .= 'set boxwidth '.$Apache::lonplot::plot{'boxwidth'}.$/; + } + # gridlayer + $gnuplot_input .= 'set grid noxtics noytics front '.$/ + if ($Apache::lonplot::plot{'gridlayer'} eq 'on'); + # grid $gnuplot_input .= 'set grid'.$/ if ($Apache::lonplot::plot{'grid'} eq 'on'); # border @@ -1169,6 +1235,8 @@ sub write_gnuplot_file { ($curve->{'linestyle'} eq 'xyerrorbars')) { $gnuplot_input.=' pointtype '.$curve->{'pointtype'}; $gnuplot_input.=' pointsize '.$curve->{'pointsize'}; + } elsif ($curve->{'linestyle'} eq 'filledcurves') { + $gnuplot_input.= ' '.$curve->{'limit'}; } } elsif (exists($curve->{'data'})) { # Store data values in $datatext @@ -1202,6 +1270,8 @@ sub write_gnuplot_file { ($curve->{'linestyle'} eq 'xyerrorbars')) { $gnuplot_input.=' pointtype '.$curve->{'pointtype'}; $gnuplot_input.=' pointsize '.$curve->{'pointsize'}; + } elsif ($curve->{'linestyle'} eq 'filledcurves') { + $gnuplot_input.= ' '.$curve->{'limit'}; } } }