--- loncom/xml/lonplot.pm 2002/01/08 21:41:20 1.34 +++ loncom/xml/lonplot.pm 2002/01/11 16:34:06 1.39 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.34 2002/01/08 21:41:20 matthew Exp $ +# $Id: lonplot.pm,v 1.39 2002/01/11 16:34:06 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -28,7 +28,14 @@ # 12/15/01 Matthew # 12/17 12/18 12/19 12/20 12/21 12/27 12/28 12/30 12/31 Matthew # 01/01/02 Matthew -# 01/02 01/03 01/04 Matthew +# 01/02 01/03 01/04 01/07 01/08 01/09 Matthew + +# Current issues +# 1. Gnuplot is unable to vary the color or linestyle of plots. +# The key does not know this so it is misleading for the user. +# Multiple s can be plotted with varying line styles and +# colors. +# package Apache::lonplot; use strict; @@ -87,13 +94,13 @@ my %linestyles = errorbars => 3, xerrorbars => [3,4], yerrorbars => [3,4], - xyerrorbars => [4,6,7], + xyerrorbars => [4,6], boxes => 3, - boxerrorbars => [3,4,5], - boxxyerrorbars => [4,6,7], - financebars => 5, - candlesticks => 5, - vector => 2 +# boxerrorbars => [3,4,5], +# boxxyerrorbars => [4,6,7], +# financebars => 5, +# candlesticks => 5, + vector => 4 ); my $int_test = sub {$_[0]=~s/\s+//g;$_[0]=~/^\d+$/}; @@ -112,32 +119,36 @@ my $words_test = sub {$_[0]=~s/\s+/ ## ## ################################################################### my @plot_edit_order = - qw/bgcolor fgcolor height width font transparent grid border/; + qw/bgcolor fgcolor height width font transparent grid border align/; my %plot_defaults = ( height => { default => 200, test => $int_test, description => 'height of image (pixels)', - edit_type => 'entry' + edit_type => 'entry', + size => '10' }, width => { default => 200, test => $int_test, description => 'width of image (pixels)', - edit_type => 'entry' + edit_type => 'entry', + size => '10' }, bgcolor => { default => 'xffffff', test => $color_test, description => 'background color of image (xffffff)', - edit_type => 'entry' + edit_type => 'entry', + size => '10' }, fgcolor => { default => 'x000000', test => $color_test, description => 'foreground color of image (x000000)', - edit_type => 'entry' + edit_type => 'entry', + size => '10' }, transparent => { default => 'off', @@ -179,7 +190,8 @@ my %key_defaults = default => '', test => $words_test, description => 'Title of key', - edit_type => 'entry' + edit_type => 'entry', + size => '40' }, box => { default => 'off', @@ -203,13 +215,15 @@ my %label_defaults = default => 0, test => $real_test, description => 'x position of label (graph coordinates)', - edit_type => 'entry' + edit_type => 'entry', + size => '10' }, ypos => { default => 0, test => $real_test, description => 'y position of label (graph coordinates)', - edit_type => 'entry' + edit_type => 'entry', + size => '10' }, justify => { default => 'left', @@ -226,31 +240,36 @@ my %axis_defaults = default => 'x000000', test => $color_test, description => 'color of axes (x000000)', - edit_type => 'entry' + edit_type => 'entry', + size => '10' }, xmin => { default => '-10.0', test => $real_test, description => 'minimum x-value shown in plot', - edit_type => 'entry' + edit_type => 'entry', + size => '10' }, xmax => { default => ' 10.0', test => $real_test, description => 'maximum x-value shown in plot', - edit_type => 'entry' + edit_type => 'entry', + size => '10' }, ymin => { default => '-10.0', test => $real_test, description => 'minimum y-value shown in plot', - edit_type => 'entry' + edit_type => 'entry', + size => '10' }, ymax => { default => ' 10.0', test => $real_test, description => 'maximum y-value shown in plot', - edit_type => 'entry' + edit_type => 'entry', + size => '10' } ); @@ -260,24 +279,22 @@ my %curve_defaults = default => 'x000000', test => $color_test, description => 'color of curve (x000000)', - edit_type => 'entry' + edit_type => 'entry', + size => '10' }, name => { default => '', test => $words_test, description => 'name of curve to appear in key', - edit_type => 'entry' + edit_type => 'entry', + size => '20' }, linestyle => { default => 'lines', test => $linestyle_test, - description => 'Style of the axis lines', + description => 'Line style', edit_type => 'choice', - choices => ['lines','linespoints','dots','points','steps', - 'fsteps','histeps','errorbars','xerrorbars', - 'yerrorbars','xyerrorbars','boxes','boxerrorbars', - 'boxxyerrorbars','financebars','candlesticks', - 'vector'] + choices => [keys(%linestyles)] } ); @@ -313,7 +330,6 @@ sub start_plot { ($token,$parstack,$safeeval,keys(%plot_defaults)); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); -# $result.= &Apache::edit::handle_insert(); } } return $result; @@ -394,7 +410,8 @@ sub start_title { } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_start($target,$token,'Plot Title'); my $text=&Apache::lonxml::get_all_text("/title",$$parser[-1]); - $result.=''. + $result.=&Apache::edit::end_row(). + &Apache::edit::start_spanning_row(). &Apache::edit::editfield('',$text,'',60,1); } elsif ($target eq 'modified') { my $text=$$parser[-1]->get_text("/title"); @@ -424,7 +441,8 @@ sub start_xlabel { } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_start($target,$token,'Plot Xlabel'); my $text=&Apache::lonxml::get_all_text("/xlabel",$$parser[-1]); - $result.=''. + $result.=&Apache::edit::end_row(). + &Apache::edit::start_spanning_row(). &Apache::edit::editfield('',$text,'',60,1); } elsif ($target eq 'modified') { my $text=$$parser[-1]->get_text("/xlabel"); @@ -455,7 +473,8 @@ sub start_ylabel { } elsif ($target eq 'edit') { $result .= &Apache::edit::tag_start($target,$token,'Plot Ylabel'); my $text = &Apache::lonxml::get_all_text("/ylabel",$$parser[-1]); - $result .= ''. + $result .= &Apache::edit::end_row(). + &Apache::edit::start_spanning_row(). &Apache::edit::editfield('',$text,'',60,1); } elsif ($target eq 'modified') { my $text=$$parser[-1]->get_text("/ylabel"); @@ -490,7 +509,8 @@ sub start_label { $result .= &Apache::edit::tag_start($target,$token,'Plot Label'); $result .= &edit_attributes($target,$token,\%label_defaults); my $text = &Apache::lonxml::get_all_text("/label",$$parser[-1]); - $result .= ''. + $result .= &Apache::edit::end_row(). + &Apache::edit::start_spanning_row(). &Apache::edit::editfield('',$text,'',60,1); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args @@ -531,7 +551,7 @@ sub start_curve { $result .= &edit_attributes($target,$token,\%curve_defaults); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args - ($token,$parstack,$safeeval,keys(%label_defaults)); + ($token,$parstack,$safeeval,keys(%curve_defaults)); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); $result.= &Apache::edit::handle_insert(); @@ -564,9 +584,10 @@ sub start_function { $curves[-1]->{'function'} = &Apache::lonxml::get_all_text("/function",$$parser[-1]); } elsif ($target eq 'edit') { - $result .= &Apache::edit::tag_start($target,$token,'Curve Function'); + $result .= &Apache::edit::tag_start($target,$token,'Gnuplot compatible curve function'); my $text = &Apache::lonxml::get_all_text("/function",$$parser[-1]); - $result .= ''. + $result .= &Apache::edit::end_row(). + &Apache::edit::start_spanning_row(). &Apache::edit::editfield('',$text,'',60,1); } elsif ($target eq 'modified') { # Why do I do this? @@ -603,7 +624,7 @@ sub start_data { # make sure it's all numbers and make sure each array # is of the same length. my @data; - if ($datatext =~ /,/) { + if ($datatext =~ /,/) { # comma deliminated @data = split /,/,$datatext; } else { # Assume it's space seperated. @data = split / /,$datatext; @@ -624,11 +645,19 @@ sub start_data { $data[$i] = 1.15572734979092; } } + # complain if the number of data points is not the same as + # in previous sets of data. + if (($curves[-1]->{'data'}) && ($#data != $#{@{$curves[-1]->{'data'}->[0]}})){ + &Apache::lonxml::warning + ('Number of data points is not consistent with previous '. + 'number of data points'); + } push @{$curves[-1]->{'data'}},\@data; } elsif ($target eq 'edit') { - $result .= &Apache::edit::tag_start($target,$token,'Curve Data'); + $result .= &Apache::edit::tag_start($target,$token,'Comma or space deliminated curve data'); my $text = &Apache::lonxml::get_all_text("/data",$$parser[-1]); - $result .= ''. + $result .= &Apache::edit::end_row(). + &Apache::edit::start_spanning_row(). &Apache::edit::editfield('',$text,'',60,1); } elsif ($target eq 'modified') { my $text=$$parser[-1]->get_text("/data"); @@ -829,23 +858,19 @@ sub edit_attributes { @keys = sort(keys(%$defaults)); } foreach my $attr (@keys) { + # append a ' ' to the description if it doesn't have one already. + my $description = $defaults->{$attr}->{'description'}; + $description .= ' ' if ($description !~ / $/); if ($defaults->{$attr}->{'edit_type'} eq 'entry') { - $result .= &Apache::edit::text_arg( - $defaults->{$attr}->{'description'}, - $attr, - $token); + $result .= &Apache::edit::text_arg + ($description,$attr,$token, + $defaults->{$attr}->{'size'}); } elsif ($defaults->{$attr}->{'edit_type'} eq 'choice') { - $result .= &Apache::edit::select_arg( - $defaults->{$attr}->{'description'}, - $attr, - $defaults->{$attr}->{'choices'}, - $token); + $result .= &Apache::edit::select_arg + ($description,$attr,$defaults->{$attr}->{'choices'},$token); } elsif ($defaults->{$attr}->{'edit_type'} eq 'on_off') { - $result .= &Apache::edit::select_arg( - $defaults->{$attr}->{'description'}, - $attr, - ['on','off'], - $token); + $result .= &Apache::edit::select_arg + ($description,$attr,['on','off'],$token); } $result .= '
'; }