version 1.33, 2002/01/06 02:19:25
|
version 1.38, 2002/01/10 19:45:51
|
Line 28
|
Line 28
|
# 12/15/01 Matthew |
# 12/15/01 Matthew |
# 12/17 12/18 12/19 12/20 12/21 12/27 12/28 12/30 12/31 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/01/02 Matthew |
# 01/02 01/03 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 <data> plots. |
|
# The key does not know this so it is misleading for the user. |
|
# Multiple <function>s can be plotted with varying line styles and |
|
# colors. |
|
# |
package Apache::lonplot; |
package Apache::lonplot; |
|
|
use strict; |
use strict; |
Line 84 my %linestyles =
|
Line 91 my %linestyles =
|
steps => 2, # now there are more important things |
steps => 2, # now there are more important things |
fsteps => 2, # for me to deal with. |
fsteps => 2, # for me to deal with. |
histeps => 2, |
histeps => 2, |
errorbars => 2, |
errorbars => 3, |
xerrorbars => 2, |
xerrorbars => [3,4], |
yerrorbars => 2, |
yerrorbars => [3,4], |
xyerrorbars => 2, |
xyerrorbars => [4,6], |
boxes => 2, |
boxes => 3, |
boxerrorbars => 2, |
# boxerrorbars => [3,4,5], |
boxxyerrorbars => 2, |
# boxxyerrorbars => [4,6,7], |
financebars => 2, |
# financebars => 5, |
candlesticks => 2, |
# candlesticks => 5, |
vector => 2 |
vector => 4 |
); |
); |
|
|
my $int_test = sub {$_[0]=~s/\s+//g;$_[0]=~/^\d+$/}; |
my $int_test = sub {$_[0]=~s/\s+//g;$_[0]=~/^\d+$/}; |
Line 111 my $words_test = sub {$_[0]=~s/\s+/
|
Line 118 my $words_test = sub {$_[0]=~s/\s+/
|
## Attribute metadata ## |
## Attribute metadata ## |
## ## |
## ## |
################################################################### |
################################################################### |
|
my @plot_edit_order = |
|
qw/bgcolor fgcolor height width font transparent grid border align/; |
my %plot_defaults = |
my %plot_defaults = |
( |
( |
height => { |
height => { |
default => 200, |
default => 200, |
test => $int_test, |
test => $int_test, |
description => 'height of image (pixels)', |
description => 'height of image (pixels)', |
edit_type => 'entry' |
edit_type => 'entry', |
|
size => '10' |
}, |
}, |
width => { |
width => { |
default => 200, |
default => 200, |
test => $int_test, |
test => $int_test, |
description => 'width of image (pixels)', |
description => 'width of image (pixels)', |
edit_type => 'entry' |
edit_type => 'entry', |
|
size => '10' |
}, |
}, |
bgcolor => { |
bgcolor => { |
default => 'xffffff', |
default => 'xffffff', |
test => $color_test, |
test => $color_test, |
description => 'background color of image (xffffff)', |
description => 'background color of image (xffffff)', |
edit_type => 'entry' |
edit_type => 'entry', |
|
size => '10' |
}, |
}, |
fgcolor => { |
fgcolor => { |
default => 'x000000', |
default => 'x000000', |
test => $color_test, |
test => $color_test, |
description => 'foreground color of image (x000000)', |
description => 'foreground color of image (x000000)', |
edit_type => 'entry' |
edit_type => 'entry', |
|
size => '10' |
}, |
}, |
transparent => { |
transparent => { |
default => 'off', |
default => 'off', |
test => $onoff_test, |
test => $onoff_test, |
description => '', |
description => 'Transparent image', |
edit_type => 'on_off' |
edit_type => 'on_off' |
}, |
}, |
grid => { |
grid => { |
default => 'off', |
default => 'off', |
test => $onoff_test, |
test => $onoff_test, |
description => '', |
description => 'Display grid', |
edit_type => 'on_off' |
edit_type => 'on_off' |
}, |
}, |
border => { |
border => { |
default => 'on', |
default => 'on', |
test => $onoff_test, |
test => $onoff_test, |
description => '', |
description => 'Draw border around plot', |
edit_type => 'on_off' |
edit_type => 'on_off' |
}, |
}, |
font => { |
font => { |
Line 177 my %key_defaults =
|
Line 190 my %key_defaults =
|
default => '', |
default => '', |
test => $words_test, |
test => $words_test, |
description => 'Title of key', |
description => 'Title of key', |
edit_type => 'entry' |
edit_type => 'entry', |
|
size => '40' |
}, |
}, |
box => { |
box => { |
default => 'off', |
default => 'off', |
Line 201 my %label_defaults =
|
Line 215 my %label_defaults =
|
default => 0, |
default => 0, |
test => $real_test, |
test => $real_test, |
description => 'x position of label (graph coordinates)', |
description => 'x position of label (graph coordinates)', |
edit_type => 'entry' |
edit_type => 'entry', |
|
size => '10' |
}, |
}, |
ypos => { |
ypos => { |
default => 0, |
default => 0, |
test => $real_test, |
test => $real_test, |
description => 'y position of label (graph coordinates)', |
description => 'y position of label (graph coordinates)', |
edit_type => 'entry' |
edit_type => 'entry', |
|
size => '10' |
}, |
}, |
justify => { |
justify => { |
default => 'left', |
default => 'left', |
Line 224 my %axis_defaults =
|
Line 240 my %axis_defaults =
|
default => 'x000000', |
default => 'x000000', |
test => $color_test, |
test => $color_test, |
description => 'color of axes (x000000)', |
description => 'color of axes (x000000)', |
edit_type => 'entry' |
edit_type => 'entry', |
|
size => '10' |
}, |
}, |
xmin => { |
xmin => { |
default => '-10.0', |
default => '-10.0', |
test => $real_test, |
test => $real_test, |
description => 'minimum x-value shown in plot', |
description => 'minimum x-value shown in plot', |
edit_type => 'entry' |
edit_type => 'entry', |
|
size => '10' |
}, |
}, |
xmax => { |
xmax => { |
default => ' 10.0', |
default => ' 10.0', |
test => $real_test, |
test => $real_test, |
description => 'maximum x-value shown in plot', |
description => 'maximum x-value shown in plot', |
edit_type => 'entry' |
edit_type => 'entry', |
|
size => '10' |
}, |
}, |
ymin => { |
ymin => { |
default => '-10.0', |
default => '-10.0', |
test => $real_test, |
test => $real_test, |
description => 'minimum y-value shown in plot', |
description => 'minimum y-value shown in plot', |
edit_type => 'entry' |
edit_type => 'entry', |
|
size => '10' |
}, |
}, |
ymax => { |
ymax => { |
default => ' 10.0', |
default => ' 10.0', |
test => $real_test, |
test => $real_test, |
description => 'maximum y-value shown in plot', |
description => 'maximum y-value shown in plot', |
edit_type => 'entry' |
edit_type => 'entry', |
|
size => '10' |
} |
} |
); |
); |
|
|
Line 258 my %curve_defaults =
|
Line 279 my %curve_defaults =
|
default => 'x000000', |
default => 'x000000', |
test => $color_test, |
test => $color_test, |
description => 'color of curve (x000000)', |
description => 'color of curve (x000000)', |
edit_type => 'entry' |
edit_type => 'entry', |
|
size => '10' |
}, |
}, |
name => { |
name => { |
default => '', |
default => '', |
test => $words_test, |
test => $words_test, |
description => 'name of curve to appear in key', |
description => 'name of curve to appear in key', |
edit_type => 'entry' |
edit_type => 'entry', |
|
size => '20' |
}, |
}, |
linestyle => { |
linestyle => { |
default => 'lines', |
default => 'lines', |
test => $linestyle_test, |
test => $linestyle_test, |
description => 'Style of the axis lines', |
description => 'Line style', |
edit_type => 'choice', |
edit_type => 'choice', |
choices => ['lines','linespoints','dots','points','steps', |
choices => [keys(%linestyles)] |
'fsteps','histeps','errorbars','xerrorbars', |
|
'yerrorbars','xyerrorbars','boxes','boxerrorbars', |
|
'boxxyerrorbars','financebars','candlesticks', |
|
'vector'] |
|
} |
} |
); |
); |
|
|
Line 304 sub start_plot {
|
Line 323 sub start_plot {
|
$tagstack->[-1]); |
$tagstack->[-1]); |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result .= &Apache::edit::tag_start($target,$token,'Plot'); |
$result .= &Apache::edit::tag_start($target,$token,'Plot'); |
$result .= &edit_attributes($target,$token,\%plot_defaults); |
$result .= &edit_attributes($target,$token,\%plot_defaults, |
|
\@plot_edit_order); |
} elsif ($target eq 'modified') { |
} elsif ($target eq 'modified') { |
my $constructtag=&Apache::edit::get_new_args |
my $constructtag=&Apache::edit::get_new_args |
($token,$parstack,$safeeval,keys(%plot_defaults)); |
($token,$parstack,$safeeval,keys(%plot_defaults)); |
Line 528 sub start_curve {
|
Line 548 sub start_curve {
|
$result .= &edit_attributes($target,$token,\%curve_defaults); |
$result .= &edit_attributes($target,$token,\%curve_defaults); |
} elsif ($target eq 'modified') { |
} elsif ($target eq 'modified') { |
my $constructtag=&Apache::edit::get_new_args |
my $constructtag=&Apache::edit::get_new_args |
($token,$parstack,$safeeval,keys(%label_defaults)); |
($token,$parstack,$safeeval,keys(%curve_defaults)); |
if ($constructtag) { |
if ($constructtag) { |
$result = &Apache::edit::rebuild_tag($token); |
$result = &Apache::edit::rebuild_tag($token); |
$result.= &Apache::edit::handle_insert(); |
$result.= &Apache::edit::handle_insert(); |
Line 561 sub start_function {
|
Line 581 sub start_function {
|
$curves[-1]->{'function'} = |
$curves[-1]->{'function'} = |
&Apache::lonxml::get_all_text("/function",$$parser[-1]); |
&Apache::lonxml::get_all_text("/function",$$parser[-1]); |
} elsif ($target eq 'edit') { |
} 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]); |
my $text = &Apache::lonxml::get_all_text("/function",$$parser[-1]); |
$result .= '</td></tr><tr><td colspan="3">'. |
$result .= '</td></tr><tr><td colspan="3">'. |
&Apache::edit::editfield('',$text,'',60,1); |
&Apache::edit::editfield('',$text,'',60,1); |
Line 600 sub start_data {
|
Line 620 sub start_data {
|
# make sure it's all numbers and make sure each array |
# make sure it's all numbers and make sure each array |
# is of the same length. |
# is of the same length. |
my @data; |
my @data; |
if ($datatext =~ /,/) { |
if ($datatext =~ /,/) { # comma deliminated |
@data = split /,/,$datatext; |
@data = split /,/,$datatext; |
} else { # Assume it's space seperated. |
} else { # Assume it's space seperated. |
@data = split / /,$datatext; |
@data = split / /,$datatext; |
Line 621 sub start_data {
|
Line 641 sub start_data {
|
$data[$i] = 1.15572734979092; |
$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; |
push @{$curves[-1]->{'data'}},\@data; |
} elsif ($target eq 'edit') { |
} 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]); |
my $text = &Apache::lonxml::get_all_text("/data",$$parser[-1]); |
$result .= '</td></tr><tr><td colspan="3">'. |
$result .= '</td></tr><tr><td colspan="3">'. |
&Apache::edit::editfield('',$text,'',60,1); |
&Apache::edit::editfield('',$text,'',60,1); |
Line 798 sub check_inputs {
|
Line 825 sub check_inputs {
|
## Make sure we have all the input we need: |
## Make sure we have all the input we need: |
if (! %plot) { &set_defaults(\%plot,\%plot_defaults); } |
if (! %plot) { &set_defaults(\%plot,\%plot_defaults); } |
if (! %key ) {} # No key for this plot, thats okay |
if (! %key ) {} # No key for this plot, thats okay |
if (! %axis) { &set_defaults(\%axis,\%axis_defaults); } |
# if (! %axis) { &set_defaults(\%axis,\%axis_defaults); } |
if (! defined($title )) {} # No title for this plot, thats okay |
if (! defined($title )) {} # No title for this plot, thats okay |
if (! defined($xlabel)) {} # No xlabel for this plot, thats okay |
if (! defined($xlabel)) {} # No xlabel for this plot, thats okay |
if (! defined($ylabel)) {} # No ylabel for this plot, thats okay |
if (! defined($ylabel)) {} # No ylabel for this plot, thats okay |
Line 818 sub check_inputs {
|
Line 845 sub check_inputs {
|
|
|
#------------------------------------------------ make_edit |
#------------------------------------------------ make_edit |
sub edit_attributes { |
sub edit_attributes { |
my ($target,$token,$defaults) = @_; |
my ($target,$token,$defaults,$keys) = @_; |
my $result; |
my ($result,@keys); |
foreach my $attr (sort keys(%$defaults)) { |
if ($keys && ref($keys) eq 'ARRAY') { |
|
@keys = @$keys; |
|
} else { |
|
@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') { |
if ($defaults->{$attr}->{'edit_type'} eq 'entry') { |
$result .= &Apache::edit::text_arg( |
$result .= &Apache::edit::text_arg |
$defaults->{$attr}->{'description'}, |
($description,$attr,$token, |
$attr, |
$defaults->{$attr}->{'size'}); |
$token); |
|
} elsif ($defaults->{$attr}->{'edit_type'} eq 'choice') { |
} elsif ($defaults->{$attr}->{'edit_type'} eq 'choice') { |
$result .= &Apache::edit::select_arg( |
$result .= &Apache::edit::select_arg |
$defaults->{$attr}->{'description'}, |
($description,$attr,$defaults->{$attr}->{'choices'},$token); |
$attr, |
} elsif ($defaults->{$attr}->{'edit_type'} eq 'on_off') { |
$defaults->{$attr}->{'choices'}, |
$result .= &Apache::edit::select_arg |
$token); |
($description,$attr,['on','off'],$token); |
} |
} |
$result .= '<br />'; |
$result .= '<br />'; |
} |
} |