--- loncom/xml/lonplot.pm 2008/09/02 19:55:23 1.148 +++ loncom/xml/lonplot.pm 2014/07/09 15:17:32 1.152.6.1 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.148 2008/09/02 19:55:23 raeburn Exp $ +# $Id: lonplot.pm,v 1.152.6.1 2014/07/09 15:17:32 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,6 +26,9 @@ # http://www.lon-capa.org/ # + + + package Apache::lonplot; use strict; @@ -57,6 +60,8 @@ BEGIN { } +=pod + ## ## Description of data structures: ## @@ -88,6 +93,8 @@ BEGIN { ## ## ################################################################### +=cut + my $max_str_len = 50; # if a label, title, xlabel, or ylabel text # is longer than this, it will be truncated. @@ -448,7 +455,7 @@ my %tic_defaults = }, ); -my @axis_edit_order = ('color','xmin','xmax','ymin','ymax','xformat', 'yformat'); +my @axis_edit_order = ('color','xmin','xmax','ymin','ymax','xformat', 'yformat', 'xzero', 'yzero'); my %axis_defaults = ( color => { @@ -496,11 +503,26 @@ my %axis_defaults = yformat => { default => 'on', test => sub {$_[0]=~/^(on|off|\d+(f|F|e|E))$/}, - description => 'X-axis number formatting', + description => 'Y-axis number formatting', edit_type => 'choice', choices => ['on', 'off', '2e', '2f'], }, - + + xzero => { + default => 'off', + test => sub {$_[0]=~/^(off|line|thick-line|dotted)$/}, + description => 'Show x-zero (y=0) axis', + edit_type => 'choice', + choices => ['off', 'line', 'thick-line', 'dotted'], + }, + + yzero => { + default => 'off', + test => sub {$_[0]=~/^(off|line|thick-line|dotted)$/}, + description => 'Show y-zero (x=0) axis', + edit_type => 'choice', + choices => ['off', 'line', 'thick-line', 'dotted'], + }, ); my @curve_edit_order = ('color','name','linestyle','linewidth','linetype','pointtype','pointsize','limit'); @@ -1433,7 +1455,7 @@ sub start_data { } # 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]}})){ + 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'); @@ -1659,8 +1681,12 @@ sub write_gnuplot_file { $gnuplot_input .= "set samples $Apache::lonplot::plot{'samples'}\n"; # title, xlabel, ylabel # titles - my $extra_space_x = ($xtics{'location'} eq 'axis') ? ' 0, -0.5 ' : ''; - my $extra_space_y = ($ytics{'location'} eq 'axis') ? ' -0.5, 0 ' : ''; + my $offset; + if ($version >= 4.4) { + $offset = 'offset '; + } + my $extra_space_x = ($xtics{'location'} eq 'axis') ? ' '.$offset.'0, -0.5 ' : ''; + my $extra_space_y = ($ytics{'location'} eq 'axis') ? ' '.$offset.'-0.5, 0 ' : ''; if ($target eq 'tex') { $gnuplot_input .= "set title \"$title\" font \"".$font_properties->{'printname'}.",".$fontsize."pt\"\n" if (defined($title)) ; @@ -1728,6 +1754,26 @@ sub write_gnuplot_file { } $gnuplot_input .= "set xrange \[$axis{'xmin'}:$axis{'xmax'}\]\n"; $gnuplot_input .= "set yrange \[$axis{'ymin'}:$axis{'ymax'}\]\n"; + if ($axis{'xzero'} ne 'off') { + $gnuplot_input .= "set xzeroaxis "; + if ($axis{'xzero'} eq 'line' || $axis{'xzero'} eq 'thick-line') { + $gnuplot_input .= "lt -1 "; + if ($axis{'xzero'} eq 'thick-line') { + $gnuplot_input .= "lw 3 "; + } + } + $gnuplot_input .= "\n"; + } + if ($axis{'yzero'} ne 'off') { + $gnuplot_input .= "set yzeroaxis "; + if ($axis{'yzero'} eq 'line' || $axis{'yzero'} eq 'thick-line') { + $gnuplot_input .= "lt -1 "; + if ($axis{'yzero'} eq 'thick-line') { + $gnuplot_input .= "lw 3 "; + } + } + $gnuplot_input .= "\n"; + } } # Key if (%key) { @@ -2016,3 +2062,118 @@ sub insert_data { __END__ +=head1 NAME + +Apache::lonplot.pm + +=head1 SYNOPSIS + +XML-based plotter of graphs + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + + +=head1 SUBROUTINES (parsing and edit rendering) + +=over + +=item start_gnuplot() + +=item end_gnuplot() + +=item start_xtics() + +=item end_xtics() + +=item start_ytics() + +=item end_ytics() + +=item get_font() + +=item start_key() + +=item end_key() + +=item parse_label() + +=item replace_entities() + +=item start_title() + +=item end_title() + +=item start_xlabel() + +=item end_xlabel() + +=item start_ylabel() + +=item end_label() + +=item start_curve() + +=item end_curve() + +=item start_function() + +=item end_function() + +=item start_data() + +=item end_data() + +=item start_axis() + +=item end_axis + +=back + +=head1 SUBROUTINES (Utility) + +=over + +=item set_defaults() + +=item get_attributes() + +=item write_gnuplot_file() + +=item check_inputs() + +=item edit_attributes() + +=back + +=head1 SUBROUTINES (Insertion functions for editing plots) + +=over + +=item insert_gnuplot() + +=item insert_tics() + +=item insert_xtics() + +=item insert_key() + +=item insert_axis() + +=item insert_title() + +=item insert_xlabel() + +=item insert_ylabel() + +=item insert_label() + +=item insert_curve() + +=item insert_function() + +=item insert_data() + +=back + +=cut