$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: pbristow_at_[hidden]
Date: 2008-01-28 06:04:32
Author: pbristow
Date: 2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
New Revision: 42996
URL: http://svn.boost.org/trac/boost/changeset/42996
Log:
Tests suggest axis labels now OK for most combinations, but legend placing left & bottom still wrong. Warnings in SVG still.
Text files modified: 
   sandbox/SOC/2007/visualization/boost/svg_plot/detail/axis_plot_frame.hpp                            |   303 ++++++++++++++++++-------------         
   sandbox/SOC/2007/visualization/boost/svg_plot/show_2d_settings.hpp                                  |    10                                         
   sandbox/SOC/2007/visualization/boost/svg_plot/svg.hpp                                               |     7                                         
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_1d_plot.hpp                                       |    23 +                                       
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp                                       |   382 +++++++++++++++++++++++++++------------ 
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_boxplot.hpp                                       |    19 -                                       
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_style.hpp                                         |    27 +-                                      
   sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/index.html                                    |     2                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/svg_plot/interface/svg_2d_plot_interface.html |    67 +++++-                                  
   sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/svg_plot/interface/svg_boxplot_interface.html |    40 ++--                                    
   sandbox/SOC/2007/visualization/libs/svg_plot/doc/interface.qbk                                      |    14                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/doc/rationale.qbk                                      |    11                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/doc/svg_interface.qbk                                  |     2                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/example/1d_full_layout.cpp                             |     2                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_area_fill.cpp                               |     4                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_bezier.cpp                                  |     2                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_full.cpp                                    |     2                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_limit.cpp                                   |     4                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/example/demo_2d_plot.cpp                               |    92 ++++++--                                
   sandbox/SOC/2007/visualization/libs/svg_plot/example/math_special_functions.cpp                     |     4                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/test/1d_color_consistency.cpp                          |     6                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/test/1d_tests.cpp                                      |    21 +                                       
   22 files changed, 666 insertions(+), 378 deletions(-)
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/detail/axis_plot_frame.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/detail/axis_plot_frame.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/detail/axis_plot_frame.hpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -113,10 +113,10 @@
         void draw_x_minor_ticks(double value, path_element& tick_path, path_element& grid_path)
         { // Draw X-axis minor ticks, and optional grid.
           // Value is NOT (yet) shown beside the minor tick.
-          double x1(value);
-          transform_x(x1);
-          double y1(0.); // Start on the horizontal X-axis line.
-          double y2(derived().image.y_size());
+          double x(value); // Tick position and value label,
+          transform_x(x); // convert to svg.
+          double y_bottom(0.); // Start on the horizontal X-axis line.
+          double y_top(derived().image.y_size()); // Image top.
 
           // Draw the minor grid, if wanted.
           if(derived().x_ticks_.minor_grid_on_)
@@ -126,92 +126,82 @@
               // Make space for title and X-axis labels.
               if(derived().title_on_)
               { // Allow text_margin_ * font_size around text (pixels).
-                y1 += derived().title_info_.style().font_size() * derived().text_margin_;
+                y_bottom += derived().title_info_.style().font_size() * derived().text_margin_;
               }
               if(derived().x_axis_.label_on_)
               {
-                y2 -= derived().x_label_info_.style().font_size() * derived().text_margin_;
+                y_top -= derived().x_label_info_.style().font_size() * derived().text_margin_;
               }
             }
             else
             { // plot_window_on_ == true.
-              y1 = derived().plot_top_ + 1; // Top. Why +1 and -1?
-              y2 = derived().plot_bottom_ - 1; // Bottom. Ensure *inside* window?
+              y_bottom = derived().plot_top_ + derived().plot_window_border_.width_; // Top.
+              y_top = derived().plot_bottom_ - derived().plot_window_border_.width_; // Bottom. Ensure *inside* window.
             }
             // Make sure that we are drawing inside the allowed window.
-            if((x1 >= derived().plot_left_) && (x1 <= derived().plot_right_)) // allow = too?
+            if((x >= derived().plot_left_) && (x <= derived().plot_right_)) // allow = too?
             {
-              //std::cerr << "Writing draw_x_minor_ticks grid inside plot window: x1 = "
-              //  << x1 << ", plot_left_ = " << derived().plot_left_ << ", plot_right_ = " << derived().plot_right_ << std::endl;
-              grid_path.M(x1, y1).L(x1, y2);
+              //std::cerr << "Writing draw_x_minor_ticks grid inside plot window: x = "
+              //  << x << ", plot_left_ = " << derived().plot_left_ << ", plot_right_ = " << derived().plot_right_ << std::endl;
+              grid_path.M(x, y_bottom).L(x, y_top); // Draw grid line.
             }
             else
             { // This will happen but is designed to be ignored!
-              // TODO check this is best. See comment in draw_x_axis
-              //std::cerr << "Writing draw_x_minor_ticks grid OUTside plot window: x1 = "
-              //  << x1 << ", plot_left_ = " << derived().plot_left_ << ", plot_right_ = " << derived().plot_right_ << std::endl;
+              // See comment in draw_x_axis
+              // std::cerr << "Writing draw_x_minor_ticks grid OUTside plot window: x = "
+              //  << x << ", plot_left_ = " << derived().plot_left_ << ", plot_right_ = " << derived().plot_right_ << std::endl;
             }
-          } // use_x_minor_grid
+          } // x_minor_grid
 
-          double x_tick_length = derived().x_ticks_.minor_tick_length_;
-          if (derived().x_ticks_.ticks_on_plot_window_on_ < 0)
+          // Draw x minor ticks.
+          if (derived().x_ticks_.ticks_on_window_or_axis_ < 0)
           { // Put minor ticks on the plot window border bottom.
-            y1 = derived().plot_bottom_; // on the window line.
-            y2 = derived().plot_bottom_; // y1 = upper, y2 = lower end of tick.
-            if(derived().x_ticks_.up_ticks_on_)
-            { //
-              y1 -= x_tick_length; // up.
-            }
-            if (derived().x_ticks_.down_ticks_on_)
-            {
-              y2 += x_tick_length; // down.
-            }
+            y_bottom = derived().plot_bottom_; // on the window line.
+            y_top = derived().plot_bottom_; // y_bottom = upper, y_top = lower end of tick.
           }
-          else if  (derived().x_ticks_.ticks_on_plot_window_on_ < 0)
+          else if (derived().x_ticks_.ticks_on_window_or_axis_ > 0)
           { // Put minor ticks on the plot window border top.
-            y1 = derived().plot_top_; // on the window line.
-            y2 = derived().plot_top_; // y1 = upper, y2 = lower end of tick.
-            if(derived().x_ticks_.up_ticks_on_)
-            { //
-              y1 -= x_tick_length; // up.
-            }
-            if (derived().x_ticks_.down_ticks_on_)
-            {
-              y2 += x_tick_length; // down.
-            }
+            y_bottom = derived().plot_top_; // on the window line.
+            y_top = derived().plot_top_; // y_bottom = upper, y_top = lower end of tick.
           }
-          else
+          else // derived().x_ticks_.ticks_on_window_or_axis_ == 0
           { // Internal style, draw tick up and/or down from the X-axis line.
-            y1 = derived().x_axis_.axis_; // X-axis horizontal line.
-            y2 = derived().x_axis_.axis_;
-            if(derived().x_ticks_.up_ticks_on_)
-            {
-              y1 -=  x_tick_length; // up
-            }
-            if (derived().x_ticks_.down_ticks_on_)
-            {
-              y2 += x_tick_length; // down.
-            }
+            y_bottom = derived().x_axis_.axis_; // ON X-axis horizontal line.
+            y_top = derived().x_axis_.axis_;
           }
-          // Make sure that we are drawing inside the allowed window.
-          if((x1 >= derived().plot_left_) && (x1 <= derived().plot_right_)) // TODO allow < or <=
+          if(derived().x_ticks_.up_ticks_on_)
           {
-            tick_path.M(x1, y1).L(x1, y2);
+            y_bottom -= derived().x_ticks_.minor_tick_length_; // up
+          }
+          if (derived().x_ticks_.down_ticks_on_)
+          {
+            y_top += derived().x_ticks_.minor_tick_length_; // down.
+          }
+         // Make sure that we are drawing inside the allowed window.
+          if((x >= derived().plot_left_) && (x <= derived().plot_right_)) // TODO allow < or <=
+          {
+            tick_path.M(x, y_bottom).L(x, y_top);
             // No value labels on minor ticks, at present.
           }
           else
           { // This will happen but is designed to be ignored!
-            //  TODO check this is best. See comment in draw_x_axis
-            //std::cerr << "Writing draw_x_minor_ticks OUTside plot window: x1 = "
-            // << x1 << ", plot_left_ = " << derived().plot_left_ << ", plot_right_ = " << derived().plot_right_ << std::endl;
+            // See comment in draw_x_axis
+            //std::cerr << "Writing draw_x_minor_ticks OUTside plot window: x = "
+            // << x << ", plot_left_ = " << derived().plot_left_ << ", plot_right_ = " << derived().plot_right_ << std::endl;
           }
         } // void draw_x_minor_ticks
 
         void draw_x_major_ticks(double value, path_element& tick_path, path_element& grid_path)
         { // draw ticks - and grid too if wanted.
-          // If major_value_labels_on then value shown beside the major tick.
+          // If major_value_labels_side then value shown beside the major tick.
           double x(value); //
           transform_x(x); // x value in svg.
+          if((x < derived().plot_left_ - 0.01) || (x > derived().plot_right_ + 0.01))
+          // Allow a bit extra to allow for round-off errors.
+          { // tick value is way outside plot window, so nothing to do.
+            std::cout << derived().plot_left_ << ' '<< x << std::endl;
+            return;
+          }
           double y_up(0.); // upper end of tick.
           double y_down(derived().image.x_size()); // y_down = lower end of tick.
           if(derived().x_ticks_.major_grid_on_)
@@ -222,8 +212,8 @@
               {
                 y_up += derived().title_info_.style().font_size() * derived().text_margin_;
               }
-              if(derived().x_ticks_.major_value_labels_on_ != 0)
-              { // If use_x_major_labels then value may be shown beside the major tick.
+              if(derived().x_ticks_.major_value_labels_side_ != 0)
+              { // Value may be shown either side the major tick.
                 y_down -= derived().x_label_info_.style().font_size() * derived().text_margin_;
               }
             }
@@ -232,18 +222,18 @@
               y_up = derived().plot_top_; // Bottom of plot window.
               y_down = derived().plot_bottom_; // Top of plot window.
             }
-            if((y_down <= derived().plot_bottom_) && (y_up >= derived().plot_top_) && (x >= derived().plot_left_) && (x <= derived().plot_right_))
-            { // Make sure that we are drawing inside the allowed window.
+            //if((y_down <= derived().plot_bottom_) && (y_up >= derived().plot_top_) && (x >= derived().plot_left_) && (x <= derived().plot_right_))
+            //{ // Make sure that we are drawing inside the allowed window.
               grid_path.M(x, y_up).L(x, y_down); // Vertical grid line.
-            }
+            //}
           } // use_x_major_grid
 
           // Draw major tick (perhaps as well as grid - ticks might be wider than grid).
           // Make sure that we are drawing inside the allowed plot window.
-          if((x >= derived().plot_left_) && (x <= derived().plot_right_)) // now <= 
-          {
+          //if((x >= derived().plot_left_) && (x <= derived().plot_right_)) // now <= 
+          //{ Removed these checks as round off causes trouble.
             double x_tick_length = derived().x_ticks_.major_tick_length_;
-            if(derived().x_ticks_.ticks_on_plot_window_on_ < 0)
+            if(derived().x_ticks_.ticks_on_window_or_axis_ < 0)
             { // Put the ticks on the plot window border (was external).
               y_up = derived().plot_bottom_; // on the window line.
               y_down = derived().plot_bottom_; // y_up = upper, y_down = lower.
@@ -256,7 +246,7 @@
                 y_down += x_tick_length; // down.
               }
             }
-            else if(derived().x_ticks_.ticks_on_plot_window_on_ > 0)
+            else if(derived().x_ticks_.ticks_on_window_or_axis_ > 0)
             { // Put the ticks on the plot window border (was external).
               y_up = derived().plot_top_; // on the window line.
               y_down = derived().plot_top_; // y_up = upper, y_down = lower.
@@ -284,69 +274,133 @@
             }
             tick_path.M(x, y_up).L(x, y_down);
             // Leaving current position at the bottom end of the tick.
+            // y_up and y-down are the ends of the tick.
+            // These may be on the axis line, or the plot window.
 
-            if(derived().x_ticks_.major_value_labels_on_ != 0)
-            { // Show value by the tick as "1.2" or "3.4e+000"...
+            if(derived().x_ticks_.major_value_labels_side_ != 0)
+            { // Show a value by the horizontal X-axis tick as "1.2" or "3.4e+000"...
               std::stringstream label;
               label.precision(derived().x_ticks_.value_precision_);
               label.flags(derived().x_ticks_.value_ioflags_);
               label << value; // "1.2" or "3.4e+000"...
               if (derived().x_ticks_.strip_e0s_)
-              { // remove unecessary e, +, leadings 0s
+              { // Remove unecessary e, +, leadings 0s.
                 std::string v = strip_e0s(label.str());
                 label.str(v);
               }
-              double y = (derived().x_ticks_.major_value_labels_on_ < 0) ? y_down : y_up; // bottom or top end of the tick.
+
+              double y = 0; // Where to start writing from, at end of bottom or top tick, if any.
+              // = 0 is only to avoid unitialised warning.
               align_style alignment = center_align;
-              if(derived().x_ticks_.down_ticks_on_)
-              {  // No need to shift if derived().up_ticks_on_ as labels are below the X-axis.
-                // y += derived().x_label_value_.font_size();
-              }
-              if (derived().x_ticks_.label_rotation_ == upward)
-              { // 
-                alignment = right_align;
-                x -= derived().x_label_info_.style().font_size() * 0.3;  // To centre digit and minus (or plus) sign - on tick.
-                //y += label.str().size() * derived().x_label_info_.font_size()  * 0.5;  // Part digit space.
-                // so the last digit will be by the tick.
-              }
-              else if((derived().x_ticks_.label_rotation_ == downward)
-                || (derived().x_ticks_.label_rotation_ == downhill))
-              { // start from tick and write down.
-                y += derived().x_label_value_.style().font_size() * 0.5; // Part digit space.
-                x -= derived().x_label_info_.style().font_size() * 0.3;  // To centre digit and - on tick.
-                alignment = left_align;
+              // rotate_style rot = derived().x_ticks_.label_rotation_;  // TODO for debug only.
+              // Adjustments to provide space from end of tick before or after writing label.
+              if (derived().x_ticks_.label_rotation_ == upward) // vertical writing up.
+              {  // Shift to center value digits and minus sign on tick.
+                x += derived().x_value_label_style_.font_size() * 0.2;
+                if (derived().x_ticks_.major_value_labels_side_ < 0)
+                { // labels to bottom, so start a little below y_down.
+                  y = y_down + derived().x_value_label_style_.font_size() * 0.6;
+                  alignment = right_align;
+                }
+                else if(derived().x_ticks_.major_value_labels_side_ > 0)
+                { // labels to top, so start a little above y_up.
+                  y = y_up - derived().x_value_label_style_.font_size() * 0.5;
+                  alignment = left_align;
+                }
               }
-              else if(derived().x_ticks_.label_rotation_ == horizontal)
+              else if (derived().x_ticks_.label_rotation_ == downward)
               {
-                y += derived().x_label_value_.style().font_size() * 1.5;
-                alignment = center_align; // center on the tick.
+                x -= derived().x_value_label_style_.font_size() * 0.3;
+                if (derived().x_ticks_.major_value_labels_side_ < 0)
+                { // labels to bottom, so start a little below y_down.
+                  y = y_down + derived().x_value_label_style_.font_size() * 0.5;
+                  alignment = left_align;
+                }
+                else if(derived().x_ticks_.major_value_labels_side_ > 0)
+                { // labels to top, so start a little above y_up.
+                  y = y_up - derived().x_value_label_style_.font_size() * 0.5;
+                  alignment = right_align;
+                }
+              }
+              else if (derived().x_ticks_.label_rotation_ == uphill)
+              { // Assume some 45 slope, so need about sqrt(2) less space.
+                x += derived().x_value_label_style_.font_size() * 0.5;
+                if (derived().x_ticks_.major_value_labels_side_ < 0)
+                { // labels to bottom, so start a little to bottom of y_bottom.
+                  y = y_down + derived().x_value_label_style_.font_size() * 0.7;
+                  // Seems to need a bit more space for top than bottom if rotated.
+                  alignment = right_align;
+                }
+                else if(derived().x_ticks_.major_value_labels_side_ > 0)
+                { // labels to top, so start a little to top of y_top.
+                  y = y_up - derived().x_value_label_style_.font_size() * 0.2;
+                  alignment = left_align;
+                }
+              }
+              else if (derived().x_ticks_.label_rotation_ == downhill)
+              { // Assume some 45 slope, so need about sqrt(2) less space.
+                x -= derived().x_value_label_style_.font_size() * 0.3;
+                if (derived().x_ticks_.major_value_labels_side_ < 0)
+                { // labels to bottom, so start a little to bottom of y_down.
+                  y = y_down + derived().x_value_label_style_.font_size() * 0.7;
+                  // Seems to need a bit more space for top than bottom if rotated.
+                  alignment = left_align;
+                }
+                else if(derived().x_ticks_.major_value_labels_side_ > 0)
+                { // labels to top, so start a little to top of y_up.
+                 y = y_up - derived().x_value_label_style_.font_size() * 0.3;
+                  alignment = right_align;
+                }
               }
-              else if(derived().x_ticks_.label_rotation_ == uphill)
-              { // 45 slope up,
-                alignment = left_align; // Uphill to end at tick.
-                y += label.str().size() * derived().x_label_info_.style().font_size() * 0.7;
-                // sloping up so need about sin(45) = 0.707 less space,
-                // so the last digit is by the tick.
+              else if (derived().x_ticks_.label_rotation_ == horizontal)
+              { // Tick value label on x axis.
+                if (derived().x_ticks_.major_value_labels_side_ < 0)
+                { // labels to bottom, so start a little to bottom of y_down.
+                  y = y_down + derived().x_value_label_style_.font_size() * 1.2;
+                  alignment = center_align; // on the tick.
+                }
+                else if(derived().x_ticks_.major_value_labels_side_ > 0)
+                { // labels to top, so start a little to top of y_up.
+                 y = y_up - derived().x_value_label_style_.font_size() * 0.7;
+                  alignment = center_align;
+                }
               }
               else
-              { // 45 slope down.
-                alignment = left_align; // Assume downhill from tick,
-                // so no need for y adjustment.
+              { // upsidedown, backup... - can't see any conceivable use for these.
+                return; // Others not yet implemented.
+              } // rotations
+              if (x <= 0)
+              { // Sanity checks on svg coordinates.
+                throw std::runtime_error("X-tick X value wrong!");
               }
+              if (y <= 0)
+              {
+                throw std::runtime_error("X-tick Y value wrong!");
+              }
+
 
-              { // ! use_x_ticks_on_plot_window_ = Internal - value labels just below horizontal X-axis.
-                if ((derived().x_ticks_.ticks_on_plot_window_on_ != 0) || ((value != 0) && derived().x_axis_.axis_line_on_))
+              if(derived().x_ticks_.ticks_on_window_or_axis_ != 0)
+              { // External to plot window style bottom or top.
+                // Always want all values including "0", if labeling external to plot window.
+                // x_ticks_.ticks_on_window_or_axis_ == true != 0
+                derived().image.g(detail::PLOT_VALUE_LABELS).text(
+                  x,
+                  y,
+                  label.str(), derived().x_value_label_style_, alignment, derived().x_ticks_.label_rotation_);
+              }
+              else
+              {
+                if ((value != 0) && derived().x_axis_.axis_line_on_)
                 { // Avoid a "0" below the X-axis if it would be cut through by any internal vertical Y-axis line.
                   derived().image.g(detail::PLOT_VALUE_LABELS).text(
-                    x, // to centre on tick
+                    x,
                     y,
                     label.str(),
-                    derived().x_label_value_.style(),
-                    alignment, // center label on the tick.
+                    derived().x_value_label_style_,
+                    alignment,
                     derived().x_ticks_.label_rotation_);
                 }
-              }
-            } // use_x_major_labels
+              } // on plot window or 'on axis'.
           }
           else
           { // Outside plot window - so do nothing?  Warning?
@@ -364,17 +418,17 @@
             if (derived().x_axis_position_ == x_intersects_y)
             { // Draw the horizontal X-axis line the full width of the plot window,
               // perhaps including an addition in lieu of a major tick.
-              if (derived().y_ticks_.left_ticks_on_ && (derived().x_ticks_.ticks_on_plot_window_on_ != 0))
+              if (derived().y_ticks_.left_ticks_on_ && (derived().x_ticks_.ticks_on_window_or_axis_ != 0))
               { // Extend the horizontal line left in lieu of longest tick.
                 xleft -= (std::max)(derived().y_ticks_.minor_tick_length_, derived().y_ticks_.major_tick_length_);
               }
               double y = derived().x_axis_.axis_; // y = 0, (provided y range includes zero).
               derived().image.g(PLOT_X_AXIS).line(xleft, y, xright, y);
-              if (derived().x_ticks_.ticks_on_plot_window_on_ < 0) 
+              if (derived().x_ticks_.ticks_on_window_or_axis_ < 0) 
               { // Draw a vertical line holding the ticks on the top of plot window.
                 derived().image.g(PLOT_X_AXIS).line(xleft, derived().plot_bottom_, xright, derived().plot_bottom_);
               }
-              else if (derived().x_ticks_.ticks_on_plot_window_on_ > 0) 
+              else if (derived().x_ticks_.ticks_on_window_or_axis_ > 0) 
               {// Draw a vertical line holding the ticks on the bottom of plot window.
                 derived().image.g(PLOT_X_AXIS).line(xleft, derived().plot_top_, xright, derived().plot_top_);
               }
@@ -418,7 +472,7 @@
               // TODO this seems ugly - as does the negative ones below.
               draw_x_minor_ticks(j, minor_tick_path, minor_grid_path);
             } // for j
-            if ((x != 0. || !derived().y_axis_.axis_line_on_) || (derived().x_ticks_.ticks_on_plot_window_on_ != 0))
+            if ((x != 0. || !derived().y_axis_.axis_line_on_) || (derived().x_ticks_.ticks_on_window_or_axis_ != 0))
             { // Avoid a major tick at x == 0 where there *is* a vertical Y-axis line.
               // (won't be Y-axis line for 1-D where the zero tick is always wanted).
               draw_x_major_ticks(x, major_tick_path, major_grid_path);
@@ -426,24 +480,24 @@
           }
 
           // Draw the ticks on the negative side (left of zero).
-          for(double x = 0.; x >= derived().x_axis_.min_; x -= derived().x_ticks_.major_interval_)
+          for(double x = 0.; x >= derived().x_axis_.min_; // ?? * (1. + 2 * std::numeric_limits<double>::epsilon());
+            x -= derived().x_ticks_.major_interval_) // Want a close to test here?
           {
             // Draw minor ticks.
             for(double j = x - x_minor_jump; 
               j > (x - derived().x_ticks_.major_interval_ + x_minor_jump) * (1. + 2 * std::numeric_limits<double>::epsilon());
               // Increase test value by a few bits to avoid accumulated rounding error 
               // that intermittently puts minor ticks *at same value as* major ticks.
-
               j -= x_minor_jump)
             {
-              if ((j != 0. || !derived().y_axis_.axis_line_on_)  || (derived().x_ticks_.ticks_on_plot_window_on_ != 0))
+              if ((j != 0. || !derived().y_axis_.axis_line_on_)  || (derived().x_ticks_.ticks_on_window_or_axis_ != 0))
               { // Avoid a minor tick at x == 0 where there *is* a vertical Y-axis line.
                 // (won't be Y-axis line for 1-D where the zero tick is always wanted).
                 // But no tick means no value label 0 either unless on_plot_window.
                 draw_x_minor_ticks(j, minor_tick_path, minor_grid_path);
               }
             }
-            if ((x != 0. || !derived().y_axis_.axis_line_on_) || (derived().x_ticks_.ticks_on_plot_window_on_ != 0))
+            if ((x != 0. || !derived().y_axis_.axis_line_on_) || (derived().x_ticks_.ticks_on_window_or_axis_ != 0))
             { // Avoid a major tick at x == 0 where there *is* a vertical Y-axis line.
               // (won't be Y-axis line for 1-D where the zero tick is always wanted).
               // But no tick means no value label 0 either unless on_plot_window.
@@ -1047,7 +1101,7 @@
           // std::string x_label()
           // bool x_label_units_on() //
           // std::string x_label_units() // Show X-axis units text.
-          // int x_major_labels_on()
+          // int x_major_labels_side()
           // svg_color x_label_color()
           // bool axes_on()
           // svg_color x_axis_color()
@@ -1087,7 +1141,7 @@
           //Derived& x_ticks_down_on(bool cmd)
           //Derived& x_label_on(bool cmd)
           //Derived& x_label_units_on(bool cmd)
-          //Derived& x_major_labels_on(int cmd)
+          //Derived& x_major_labels_side(int cmd)
           //Derived& title_on(bool cmd)
           //Derived& x_major_grid_on(bool is)
           //Derived& x_minor_grid_on(bool is)
@@ -1805,15 +1859,15 @@
             return derived().image.g(detail::PLOT_VALUE_LABELS).style().stroke_color();
           }
 
-          Derived& x_ticks_on_plot_window_on(int cmd)
+          Derived& x_ticks_on_window_or_axis(int cmd)
           { // External style, top = +1, bottom = -1 (default).
-            derived().x_ticks_.ticks_on_plot_window_on_ = cmd;
+            derived().x_ticks_.ticks_on_window_or_axis_ = cmd;
             return derived();
           }
 
-          int x_ticks_on_plot_window_on()
+          int x_ticks_on_window_or_axis()
           { // External style = true.
-            return derived().x_ticks_.ticks_on_plot_window_on_;
+            return derived().x_ticks_.ticks_on_window_or_axis_;
           }
 
           Derived& x_label_units_on(bool cmd)
@@ -1827,15 +1881,15 @@
             return derived().x_axis_.label_units_on_;
           }
 
-          Derived& x_major_labels_on(int cmd)
+          Derived& x_major_value_labels_side(int cmd)
           {
-            derived().x_ticks_.major_value_labels_on_ = cmd;
+            derived().x_ticks_.major_value_labels_side_ = cmd;
             return derived();
           }
 
-          int x_major_labels_on()
+          int x_major_value_labels_side()
           {
-            return derived().x_ticks_.major_value_labels_on_;
+            return derived().x_ticks_.major_value_labels_side_;
           }
 
           Derived& x_major_label_rotation(rotate_style rot)
@@ -2059,7 +2113,6 @@
 
           double x_label_width()
           {
-            //return x_label_width_;
             return derived().image.g(PLOT_X_LABEL).style().stroke_width();
           }
 
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/show_2d_settings.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/show_2d_settings.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/show_2d_settings.hpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -227,7 +227,6 @@
   cout << "x_axis_label_color " << plot.x_axis_label_color() << endl;
   cout << "x_axis_value_color " << plot.x_axis_value_color() << endl;
   cout << "x_axis_width " << plot.x_axis_width() << endl;
-
   cout << "x_label_on " << plot.x_label_on() << endl;
   cout << "x_label " << plot.x_label() << endl;
   cout << "x_label_color " << plot.x_label_color() << endl;
@@ -236,7 +235,7 @@
   cout << "x_label_units " << plot.x_label_units() << endl;
   cout << "x_label_units_on " << plot.x_label_units_on() << endl;
   cout << "x_label_width " << plot.x_label_width() << endl;
-  cout << "x_major_labels_on " << l_or_r(plot.x_major_labels_on()) << endl;
+  cout << "x_major_value_labels_side " << l_or_r(plot.x_major_value_labels_side()) << endl;
   cout << "x_major_label_rotation " << plot.x_major_label_rotation() << endl;
   cout << "x_major_grid_color " << plot.x_major_grid_color() << endl;
   cout << "x_major_grid_on " << plot.x_major_grid_on() << endl;
@@ -257,8 +256,7 @@
   cout << "x_num_minor_ticks " << plot.x_num_minor_ticks() << endl;
   cout << "x_ticks_down_on " << plot.x_ticks_down_on() << endl;
   cout << "x_ticks_up_on " << plot.x_ticks_up_on() << endl;
-  cout << "x_ticks_on_plot_window_on " << plot.x_ticks_on_plot_window_on() << endl;
-  cout << "y_ticks_on_plot_window_on " << plot.y_ticks_on_plot_window_on() << endl;
+  cout << "x_ticks_on_window_or_axis " << t_or_b(plot.x_ticks_on_window_or_axis()) << endl;
   cout << "y_axis_position " << plot.y_axis_position() << endl;
   cout << "x_axis_position " << plot.x_axis_position() << endl;
   cout << "y_label_on " << plot.y_label_on() << endl;
@@ -281,7 +279,7 @@
   cout << "y_major_grid_color " << plot.y_major_grid_color() << endl;
   cout << "y_major_grid_width " << plot.y_major_grid_width() << endl;
   cout << "y_major_interval " << plot.y_major_interval() << endl;
-  cout << "y_major_labels_on " << t_or_b(plot.y_major_labels_on()) << endl;
+  cout << "y_major_value_labels_side " << t_or_b(plot.y_major_value_labels_side()) << endl;
   cout << "y_major_label_rotation " << plot.y_major_label_rotation() << endl;
   cout << "y_major_tick_color " << plot.y_major_tick_color() << endl;
   cout << "y_major_tick_length  " << plot.y_major_tick_length() << endl;
@@ -298,7 +296,7 @@
   cout << "y_num_minor_ticks " << endl;
   cout << "y_ticks_left_on " << plot.y_ticks_left_on() << endl;
   cout << "y_ticks_right_on " << plot.y_ticks_right_on() << endl;
-  cout << "y_ticks_on_plot_window_on " << plot.y_ticks_on_plot_window_on() << endl;
+  cout << "y_ticks_on_window_or_axis " << l_or_r(plot.y_ticks_on_window_or_axis()) << endl;
   cout << "y_max " << plot.y_max() << endl;
   cout << "y_min " << plot.y_min() << endl;
   cout << "data lines width " << plot.data_lines_width() << endl;
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg.hpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -288,8 +288,13 @@
   // recommends MUST have  correct Content-Encoding headers.
   // --------------------------------------------------------------------------------
 
-  void write(const std::string& file)
+  void write(const std::string& filename)
   {// Write whole .svg 'file' contents to file.
+    std::string file(filename); // Copy to avoid problems with const if need to append.
+    if (file.find('.') == std::string::npos)
+    { // No file type suffix, so provide the default .svg.
+      file.append(".svg");
+    }
     std::ofstream f_out(file.c_str());
     if(f_out.fail())
     {
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg_1d_plot.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg_1d_plot.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg_1d_plot.hpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -406,22 +406,22 @@
           x_label_length_+= x_ticks_.label_max_width_ * x_value_label_style_.font_size() * wh * sin45; // SVG 'chars'.
       }
 
-      if (x_ticks_.major_value_labels_on_ != 0)
+      if (x_ticks_.major_value_labels_side_ != 0)
       { // Some value labels.
-        if ((x_ticks_.ticks_on_plot_window_on_ < 0) // on bottom of plot window.
-           && (x_ticks_.major_value_labels_on_ < 0) ) // & labels on bottom.
+        if ((x_ticks_.ticks_on_window_or_axis_ < 0) // on bottom of plot window.
+           && (x_ticks_.major_value_labels_side_ < 0) ) // & labels on bottom.
         {  // Contract plot window bottom edge up to make space for x value labels on bottom.
           plot_bottom_ -= x_label_length_; // Move up.
         }
-        else if ((x_ticks_.ticks_on_plot_window_on_ > 0) // 
-           && (x_ticks_.major_value_labels_on_ > 0) ) // & x labels to top.
+        else if ((x_ticks_.ticks_on_window_or_axis_ > 0) // 
+           && (x_ticks_.major_value_labels_side_ > 0) ) // & x labels to top.
         { // Move top of plot window down to give space for x value labels.
           plot_top_ += x_label_length_; // Move down.
         }
         else
         { // no labels on plot window (may be on mid-plot X-axis).
         }
-      } // x_ticks_. major_value_labels_on
+      } // x_ticks_. major_value_labels_side
 
       // Make space for any ticks.
       if(x_ticks_.down_ticks_on_)
@@ -433,13 +433,13 @@
         // and x_axis_ is svg coordinate of Y-axis (usually y = 0).
         // If not fix axis to bottom of the plot window.
         if ((x_axis_position_ == bottom) // All definitely > zero.
-          && !(x_ticks_.ticks_on_plot_window_on_ < 0) ) // & not already at bottom.
+          && !(x_ticks_.ticks_on_window_or_axis_ < 0) ) // & not already at bottom.
         { // y_min_ > 0 so X-axis will not intersect Y-axis, so use plot window.
           plot_bottom_ -= x_label_length_; // Move up for the value labels.
           x_axis_.axis_ = plot_bottom_; // Put X-axis on bottom.
         }
         else if ((x_axis_position_ == top)  // definitely < zero.
-          && !(x_ticks_.ticks_on_plot_window_on_ > 0) ) // & not already at top.
+          && !(x_ticks_.ticks_on_window_or_axis_ > 0) ) // & not already at top.
         { // // y_max_ < 0 so X-axis will not intersect Y-axis, so use plot window.
            plot_top_ += x_label_length_; // Move down for labels.
            x_axis_.axis_ = plot_top_; // Put X-axis on top.
@@ -565,8 +565,13 @@
   // document node, which calls all other nodes through the Visitor pattern.
   // ------------------------------------------------------------------------
 
-  svg_1d_plot& write(const std::string& filename)
+  svg_1d_plot& write(std::string& file)
   {
+    std::string filename(file); // Copy to avoid problems with const if need to append.
+    if (filename.find(".svg") == std::string::npos)
+    { // No file type suffix, so provide the default .svg.
+      filename.append(".svg");
+    }
     std::ofstream fout(filename.c_str());
     if(fout.fail())
     {
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -182,7 +182,7 @@
       text_style y_value_label_style_;
       text_style point_symbols_style_; // Used for data point marking.
 
-      double x_label_width_;
+      //double x_label_width_;
 
       text_element title_info_; // Plot title.
       text_element legend_header_; // legend box header or title (if any).
@@ -216,7 +216,7 @@
       double legend_bottom_; // bottom of legend box.
       size_t legend_longest_; // longest (both header & data) string in legend box,
 
-      axis_line_style x_axis_; 
+      axis_line_style x_axis_;
       axis_line_style y_axis_;
 
       ticks_labels_style x_ticks_;
@@ -259,7 +259,6 @@
         y_axis_label_style_(14, "Verdana", "", ""),
         y_value_label_style_(12, "Verdana", "", ""),
         point_symbols_style_(12, "Lucida Sans Unicode"), // Used for data point marking.
-        x_label_width_(5),
         title_info_(0, 0, "Plot of data", title_style_, center_align, horizontal),
         x_label_info_(0, 0, "X Axis", x_axis_label_style_, center_align, horizontal),
         x_units_info_(0, 0, " (units)", x_value_label_style_, center_align, horizontal),
@@ -267,6 +266,7 @@
         x_axis_(X, -10., +10., black, 1, 0, true, false, true),
         y_axis_(Y, -10., +10., black, 1, 0, true, false, true),
         // Might fill in all values, but there are rather many for ticks_labels_style,
+        // And this would separate any changes in styles defaults from plot default.  TODO?
         x_ticks_(X, x_value_label_style_),// so for other defaults see ticks_labels_style.
         y_ticks_(Y, y_value_label_style_),
         y_label_info_(0, 0, "Y Axis", y_axis_label_style_, center_align, upward),
@@ -394,11 +394,11 @@
        // Assume that axis labels are always at bottom and left.
        if(x_axis_.label_on_)
        { // Leave space at bottom for X axis label.
-          plot_bottom_ -= x_axis_label_style_.font_size() * (text_margin_);
+          plot_bottom_ -= x_axis_label_style_.font_size() * text_margin_;
        }
         if(y_axis_.label_on_)
         { // Leave space at left for Y axis label.
-          plot_left_ += x_axis_label_style_.font_size() * (text_margin_ - 0.5);
+          plot_left_ += x_axis_label_style_.font_size() * text_margin_;
         }
         if(plot_window_on_)
         { // Needed to allow any plot window border rectangle to show OK.
@@ -419,28 +419,31 @@
         if (y_axis_.min_ > std::numeric_limits<double>::min()) // all Y values definitely > zero.
         { // y_min_ > 0, so X-axis will not intersect Y-axis, so use bottom plot window.
           x_axis_position_ = bottom; // X-axis to bottom of plot window.
-          x_ticks_.ticks_on_plot_window_on_ = -1; // bottom = true;
+          x_ticks_.ticks_on_window_or_axis_ = -1; // bottom = true;
         }
         else if(y_axis_.max_ < -std::numeric_limits<double>::min())  // all Y values definitely < zero.
         { // // y_max_ < 0, so X-axis will not intersect Y-axis, so use top plot window.
           x_axis_position_ = top; // X-axis to top of plot window.
-          x_ticks_.ticks_on_plot_window_on_ = +1; // top = true;
+          x_ticks_.ticks_on_window_or_axis_ = +1; // top = true;
         }
         // Y axis position is determined by the range of X values.
         y_axis_position_ = y_intersects_x;  // Assume Y-axis will intersect X-axis (X range includes zero).
         if (x_axis_.min_ > std::numeric_limits<double>::min()) // X values all definitely > zero.
         { // Y-axis > 0, so will not intersect X-axis.
           y_axis_position_ = left; // Y-axis free to left of end of X-axis.
-          y_ticks_.ticks_on_plot_window_on_ = -1; // left true; // because floating off end of X-axis.
+          y_ticks_.ticks_on_window_or_axis_ = -1; // left true; // because floating off end of X-axis.
           // so need to put the labels on the plot window instead of the X-axis.
         }
         else if (x_axis_.max_ < -std::numeric_limits<double>::min()) // Y all definitely < zero.
         { // Y-axis < 0, so will not intersect X-axis.
           y_axis_position_ = right;
-          y_ticks_.ticks_on_plot_window_on_ = +1; // right = true;
+          y_ticks_.ticks_on_window_or_axis_ = +1; // right = true;
         }
 
-        // Ensure both axis and ticks have the same range.
+        // Ensure both axis and ticks have the *same* range.
+        // (To use the separation, made to give the potential for different ranges,
+        // one would have to *not* do this,
+        // but to make sure they are both assigned correctly).
         x_ticks_.max_ = x_axis_.max_;
         x_ticks_.min_ = x_axis_.min_;
         y_ticks_.max_ = y_axis_.max_;
@@ -468,29 +471,29 @@
           y_label_length_ = y_ticks_.label_max_width_  * sin45;
         }
 
-        if (y_ticks_.major_value_labels_on_ != 0)
-        { // Some value labels.
-          if ((y_ticks_.ticks_on_plot_window_on_ < 0) // On left of plot window.
-            && (y_ticks_.major_value_labels_on_ < 0) ) // & labels on left.
+        if (y_ticks_.major_value_labels_side_ != 0)
+        { // Some major tick value labels wanted.
+          if ((y_ticks_.ticks_on_window_or_axis_ < 0) // On left of plot window.
+            && (y_ticks_.major_value_labels_side_ < 0) ) // & labels on left.
           {  // Contract plot window left edge to right to make space for value labels on left.
             plot_left_ += y_label_length_;
           }
-          else if ((y_ticks_.ticks_on_plot_window_on_ > 0) // On right of plot window.
-            && (y_ticks_.major_value_labels_on_ > 0) ) // & labels to right.
+          else if ((y_ticks_.ticks_on_window_or_axis_ > 0) // On right of plot window.
+            && (y_ticks_.major_value_labels_side_ > 0) ) // & labels to right.
           {  // Contract plot window right to left to make space for value labels on right.
            plot_right_ -= y_label_length_;
           }
           else
-          { // y_ticks_.ticks_on_plot_window_on_ == 0
-            // no labels on plot window (may be on mid-plot Y-axis line).
+          { // y_ticks_.ticks_on_window_or_axis_ == 0
+            // no value labels on plot window (may be on mid-plot Y-axis line).
             // Ignore the unusual case of Y-axis line too close to the axis label.
             // In this case the value labels may overflow the plot window
             // and collide with the axis label!
             // User must change to put value label downward, or on other side of the axis line.
-            // using major_value_labels_on(int d)
+            // using major_value_labels_side(int d)
             // to set tick value labels to left (<0), none (==0) or right (>0).
           }
-        } // y_ticks_. major_value_labels_on
+        } // y_ticks_. major_value_labels_side
 
         double x_label_length_ = 0; // Work out the longest value label for X-Axis.
         if (x_ticks_.label_rotation_ == horizontal)
@@ -506,15 +509,15 @@
             x_label_length_+= x_ticks_.label_max_width_ * sin45; // SVG 'chars'.
         }
 
-        if (x_ticks_.major_value_labels_on_ != 0)
+        if (x_ticks_.major_value_labels_side_ != 0)
         { // Some value labels.
-          if ((x_ticks_.ticks_on_plot_window_on_ < 0) // on bottom of plot window.
-             && (x_ticks_.major_value_labels_on_ < 0) ) // & labels on bottom.
+          if ((x_ticks_.ticks_on_window_or_axis_ < 0) // on bottom of plot window.
+             && (x_ticks_.major_value_labels_side_ < 0) ) // & labels on bottom.
           {  // Contract plot window bottom edge up to make space for x value labels on bottom.
             plot_bottom_ -= x_label_length_; // Move up.
           }
-          else if ((x_ticks_.ticks_on_plot_window_on_ > 0) //
-             && (x_ticks_.major_value_labels_on_ > 0) ) // & x labels to top.
+          else if ((x_ticks_.ticks_on_window_or_axis_ > 0) //
+             && (x_ticks_.major_value_labels_side_ > 0) ) // & x labels to top.
           { // Move top of plot window down to give space for x value labels.
             plot_top_ += x_label_length_; // Move down.
           }
@@ -522,7 +525,7 @@
           { // no labels on plot window (may be on mid-plot X-axis).
             // See also notes above on case where labels can overwrite axis.
           }
-        } // x_ticks_. major_value_labels_on
+        } // x_ticks_. major_value_labels_side
 
         // Make space for any ticks.
         if(y_ticks_.left_ticks_on_)
@@ -539,13 +542,13 @@
           // and x_axis_ is svg coordinate of Y-axis (usually y = 0).
           // If not fix axis to bottom (or top) of the plot window.
           if ((x_axis_position_ == bottom) // All Y values definitely > zero.
-            && !(x_ticks_.ticks_on_plot_window_on_ < 0) ) // & not already at bottom.
+            && !(x_ticks_.ticks_on_window_or_axis_ < 0) ) // & not already at bottom.
           { // y_min_ > 0 so X-axis will not intersect Y-axis, so use plot window.
             plot_bottom_ -= x_label_length_; // Move up for the value labels.
             x_axis_.axis_ = plot_bottom_; // Put X-axis on bottom.
           }
           else if ((x_axis_position_ == top)  // All Y values definitely < zero.
-            && !(x_ticks_.ticks_on_plot_window_on_ > 0) ) // & not already at top.
+            && !(x_ticks_.ticks_on_window_or_axis_ > 0) ) // & not already at top.
           { // // y_max_ < 0 so X-axis will not intersect Y-axis, so use plot window.
              plot_top_ += x_label_length_; // Move down for labels.
              x_axis_.axis_ = plot_top_; // Put X-axis on top.
@@ -560,16 +563,18 @@
         { // Want a Y-axis line, so check if range includes zero, so axes intersect,
           // and y_axis_ is svg coordinate of X-axis (usually x = 0).
           // If not fix axis to left (or right) of the plot window.
-// TODO more logic here as X???
-          if (y_axis_position_ == left) // All X values definitely > zero.
+          if ((y_axis_position_ == left) // All X values definitely > zero.
+             //&& !(y_ticks_.ticks_on_window_or_axis_ < 0) // & not already at left.
+             )
           { // Y-axis will not intersect X -axis, so put Y-axis line on plot window.
             y_axis_.axis_ = plot_left_; // Y-axis to left,
             //plot_left_ += 2 * y_label_info_.font_size(); // with a space.
           }
-          else if(y_axis_position_ == right) // All X values definitely < zero.
+          else if ((y_axis_position_ == right) // All X values definitely < zero.
+            //&& !(y_ticks_.ticks_on_window_or_axis_ > 0) // & not already at right.
+            )
           {
             y_axis_.axis_ = plot_right_; // Y-axis to right of plot window,
-            //plot_right_ -= 2 * y_label_info_.font_size(); // with a space.
           }
           else
           { // x_axis_position_ == x_intersects_y
@@ -634,13 +639,13 @@
           if (y_axis_position_ == y_intersects_x)
           { // Draw the vertical Y-axis line at cartesian x = 0).
             double ybottom = plot_bottom_;
-            if (x_ticks_.down_ticks_on_ && (y_ticks_.ticks_on_plot_window_on_ != 0) && (x_axis_position_ == x_intersects_y) )
+            if (x_ticks_.down_ticks_on_ && (y_ticks_.ticks_on_window_or_axis_ != 0) && (x_axis_position_ == x_intersects_y) )
             { // Extend the vertical line down in lieu of longest tick.
               ybottom += (std::max)(x_ticks_.minor_tick_length_, x_ticks_.major_tick_length_);// Avoid macro max trap!
             }
             image.g(detail::PLOT_Y_AXIS).line(x, plot_top_, x, ybottom);
             // <g id="yAxis" stroke="rgb(0,0,0)"><line x1="70.5" y1="53" x2="70.5" y2="357"/>
-            if (y_ticks_.ticks_on_plot_window_on_ < 0) //(y_axis_position_ == left)
+            if (y_ticks_.ticks_on_window_or_axis_ < 0) //(y_axis_position_ == left)
             { // Draw vertical line holding the ticks on the left of plot window.
               image.g(detail::PLOT_Y_AXIS).line(plot_left_, plot_top_, plot_left_, plot_bottom_);
             }
@@ -680,7 +685,7 @@
           for(double j = y + y_minor_jump;
             j < (y + y_ticks_.major_interval_) * (1. - 2 * std::numeric_limits<double>::epsilon());
             j += y_minor_jump)
-          { // Draw minor ticks.
+          { // Draw minor tick.
             // This will output 'orphaned' minor ticks that are beyond the plot window,
             // if the last major tick does not coincide with the plot window.
             // These are just ignored in draw_x_minor_ticks.
@@ -693,11 +698,17 @@
               draw_y_minor_tick(j, minor_tick_path, minor_grid_path);
             }
           }
-          if ((y != 0. || ! x_axis_.axis_line_on_) || (y_ticks_.ticks_on_plot_window_on_ != 0))
+          // Draw major tick.
+          if ((y != 0. || ! x_axis_.axis_line_on_) // axis line requested.
+            || (y_ticks_.ticks_on_window_or_axis_ != 0)) // ticks & labels on plot window.
           { // Avoid a major tick at y == 0 where there *is* a horizontal X-axis line.
             // (won't be X-axis line for 1-D where the zero tick is always wanted).
             draw_y_major_tick(y, major_tick_path, major_grid_path);
           }
+          else
+          {
+            // std::cout << "Missed y " << y << std::endl; // Only miss 0s
+          }
         }
 
         // Draw the ticks on the negative side.
@@ -705,13 +716,16 @@
         {
           for(double j = y; j > y - y_ticks_.major_interval_; j-= y_ticks_.major_interval_ / (y_ticks_.num_minor_ticks_ + 1))
           { // Draw minor ticks.
-            if ((j != 0. || ! y_axis_.axis_line_on_) || (y_ticks_.ticks_on_plot_window_on_ != 0))
+            if ( (j != 0. || ! y_axis_.axis_line_on_)
+              || (y_ticks_.ticks_on_window_or_axis_ != 0) // ticks & labels on plot window.
+              )
             { // Avoid a major tick at y == 0 where there *is* a horizontal X-axis line.
               // (won't be X-axis line for 1-D where the zero tick is always wanted).
               draw_y_minor_tick(j, minor_tick_path, minor_grid_path);
             }
           }
-          if ((y != 0. || ! x_axis_.axis_line_on_) || (y_ticks_.ticks_on_plot_window_on_ != 0))
+          if ((y != 0. || ! x_axis_.axis_line_on_)
+            || (y_ticks_.ticks_on_window_or_axis_ != 0) ) // ticks & labels on plot window.
           { // Avoid a major tick at y == 0 where there *is* a horizontal X-axis line.
             // (won't be X-axis line for 1-D where the zero tick is always wanted).
             draw_y_major_tick(y, major_tick_path, major_grid_path);
@@ -742,17 +756,19 @@
       { // Draw a Y axis major tick, tick value labels & grids.
         double y(value); // for tick and/or grid.
         transform_y(y); // Cartesian to SVG coordinates.
-        if((y < plot_top_) || (y > plot_bottom_))
-        { // tick value is outside plot window, so nothing to do.
+        if((y < plot_top_ - 0.01) || (y > plot_bottom_ + 0.01))
+          // Allow a bit extra to allow for round-off errors.
+        { // tick value is way outside plot window, so nothing to do.
+          // std::cout << y << std::endl;
           return;
         }
         double x_left(0.); // Left end of tick.
-        double x_right(image.y_size());
+        double x_right(image.y_size()); // Right end of tick.
         if(y_ticks_.major_grid_on_)
         { // Draw horizontal major grid line.
           if(!plot_window_on_ != 0)
-          {
-            if(y_ticks_.major_value_labels_on_ < 0)
+          { 
+            if(y_ticks_.major_value_labels_side_ < 0)
             { // Start further right to give space for y axis value label.
               y -= y_value_label_style_.font_size() * text_margin_;
             }
@@ -768,104 +784,195 @@
             x_right = plot_right_ - plot_window_border_.width_;
             grid_path.M(x_left, y).L(x_right, y); // Horizontal grid line.
           }
-        } // use_y_major_grid_
+        } // y_major_grid_on
 
-        if ((y <= plot_bottom_) && (y >= plot_top_))
-        { // Make sure that we are drawing inside the allowed window.
-          double y_tick_length = y_ticks_.major_tick_length_;
-          if (y_ticks_.ticks_on_plot_window_on_ < 0)
-          { // Start ticks on the plot window border left.
-            x_left = plot_left_; // x_left = left,
-            x_right = plot_left_; //  x_right = right.
-          }
-          else if (y_ticks_.ticks_on_plot_window_on_ > 0)
-          { // Start ticks on the plot window border right.
-            x_left = plot_right_;
-            x_right = plot_right_;
-          }
-          else
-          { // Internal style ticks on vertical Y-axis.
-            x_left = y_axis_.axis_; // Y-axis line.
-            x_right = y_axis_.axis_;
-          }
-          if(y_ticks_.left_ticks_on_)
-          {
-            x_left -= y_tick_length; // left
-          }
-          if (y_ticks_.right_ticks_on_)
-          {
-            x_right += y_tick_length; // right.
-          }
-          tick_path.M(x_left, y).L(x_right, y); // Draw the major tick.
-          // leaving x_left at the left most end of any tick.
+        // Draw major ticks & value label, if necessary.
+        double y_tick_length = y_ticks_.major_tick_length_;
+        if (y_ticks_.ticks_on_window_or_axis_ < 0)
+        { // Start ticks on the plot window border left.
+          x_left = plot_left_; // x_left = left,
+          x_right = plot_left_; //  x_right = right.
         }
+        else if (y_ticks_.ticks_on_window_or_axis_ > 0)
+        { // Start ticks on the plot window border right.
+          x_left = plot_right_;
+          x_right = plot_right_;
+        }
+        else // y_ticks_.ticks_on_window_or_axis_== 0
+        { // Internal style ticks on vertical Y-axis.
+          x_left = y_axis_.axis_; // Y-axis line.
+          x_right = y_axis_.axis_;
+        }
+        if(y_ticks_.left_ticks_on_)
+        {
+          x_left -= y_tick_length; // left
+        }
+        if (y_ticks_.right_ticks_on_)
+        {
+          x_right += y_tick_length; // right.
+        }
+        //if ((y <= (plot_bottom_ - 0.01)) && (y >= (plot_top_ + 0.01)))
+        //{ // Make sure that we are drawing inside the allowed window.
+        // TODO remove this completely.  Should not be necessary.
+        tick_path.M(x_left, y).L(x_right, y); // Draw the major tick.
+        // leaving x_left at the left most end of any tick,
+        // and x_right at the rightmost end of any tick.
+        // These may be on the axis line.
+        // y is the vertical tick position.
+        //} // in plot window
 
-        if(y_ticks_.major_value_labels_on_ != 0)
-        { // Label the tick with value, for example "1.2"
+        if(y_ticks_.major_value_labels_side_ != 0)
+        { // Label the tick with a value, for example "1.2"
           std::stringstream label;
           label.precision(y_ticks_.value_precision_);
           label.flags(y_ticks_.value_ioflags_); // set ALL IOflags.
           label << value; // Example: label.str() == "20" or "0.25" or "1.2e+015"
-          if(y_ticks_.left_ticks_on_)
-          {
-            // In case some joker has made the minor ticks longer than the major,
-              // we might need to move left more for the longer tick.
-            x_left -= (std::max)(y_ticks_.major_tick_length_, y_ticks_.minor_tick_length_);// Avoid macro max trap!
-            // x_left -= y_value_label_style_.font_size() * wh; // move left by a font width.
+					if (y_ticks_.strip_e0s_)
+					{ // Remove unecessary e, +, leadings 0s.
+						std::string v = strip_e0s(label.str());
+						label.str(v);
+					}
+
+          double x = 0; // Where to start writing from, at end of left or right tick, if any.
+          // = 0 is only to avoid unitialised warning.
+          align_style alignment = center_align;
+          // Adjustments to provide space from end of tick before or after writing label.
+          if (y_ticks_.label_rotation_ == horizontal)
+          {  // Just shift up to center value digits on tick.
+            if (y_ticks_.major_value_labels_side_ < 0)
+            { // labels to left, so start a little to left of x_left.
+              y += y_value_label_style_.font_size() * 0.2;
+              x = x_left - y_value_label_style_.font_size() * 0.5;
+              alignment = right_align;
+            }
+            else if(y_ticks_.major_value_labels_side_ > 0)
+            { // labels to right, so start a little to right of x_right.
+             y += y_value_label_style_.font_size() * 0.2;
+             x = x_right + y_value_label_style_.font_size() * 0.5;
+              alignment = left_align;
+            }
           }
-          else
-          { // No need to move if right tick, or none.
+          else if (y_ticks_.label_rotation_ == upsidedown)
+           {  // Just shift up to center value digits on tick.
+            if (y_ticks_.major_value_labels_side_ < 0)
+            { // labels to left, so start a little to left of x_left.
+              y -= y_value_label_style_.font_size() * 0.1;
+              x = x_left - y_value_label_style_.font_size() * 0.5;
+              alignment = left_align;
+            }
+            else if(y_ticks_.major_value_labels_side_ > 0)
+            { // labels to right, so start a little to right of x_right.
+              y -= y_value_label_style_.font_size() * 0.1;
+              x = x_right + y_value_label_style_.font_size() * 0.5;
+              alignment = right_align;
+            }
           }
-          // Need to work out how much space value labels will need.
-          align_style alignment = center_align;
-          if(y_ticks_.ticks_on_plot_window_on_ != 0)
-          { // External to plot window style left or right.
-            if(y_ticks_.label_rotation_ == horizontal)
-            {  // Just shift down third a digit to center value digits on tick.
+          else if (y_ticks_.label_rotation_ == uphill)
+          { // Assume some 45 slope, so need about sqrt(2) less space.
+            if (y_ticks_.major_value_labels_side_ < 0)
+            { // labels to left, so start a little to left of x_left.
+              y -= y_value_label_style_.font_size() * 0.2;
+              x = x_left - y_value_label_style_.font_size() * 0.2;
+              // Seems to need a bit more space for right than left if rotated.
               alignment = right_align;
+            }
+            else if(y_ticks_.major_value_labels_side_ > 0)
+            { // labels to right, so start a little to right of x_right.
+              y += y_value_label_style_.font_size() * 0.2;
+              x = x_right + y_value_label_style_.font_size() * 0.7;
+              alignment = left_align;
+            }
+          }
+          else if (y_ticks_.label_rotation_ == downhill)
+          { // Assume some 45 slope, so need about sqrt(2) less space.
+            if (y_ticks_.major_value_labels_side_ < 0)
+            { // labels to left, so start a little to left of x_left.
               y += y_value_label_style_.font_size() * 0.3;
+              x = x_left - y_value_label_style_.font_size() * 0.7;
+              // Seems to need a bit more space for right than left if rotated.
+              alignment = right_align;
+            }
+            else if(y_ticks_.major_value_labels_side_ > 0)
+            { // labels to right, so start a little to right of x_right.
+              y -= y_value_label_style_.font_size() * 0.3;
+              x = x_right + y_value_label_style_.font_size() * 0.1;
+              alignment = left_align;
             }
-            else if ((y_ticks_.label_rotation_ == upward) || (y_ticks_.label_rotation_ == downward))
-            {// Tick value label straight up or down vertically on y axis.
-              // No shift y down to center.
+          }
+          else if (y_ticks_.label_rotation_ == upward)
+          { // Tick value label straight up vertically on Y-axis.
+            y -= y_value_label_style_.font_size() * 0.1;
+            if (y_ticks_.major_value_labels_side_ < 0)
+            { // labels to left, so start a little to left of x_left.
+              x = x_left - y_value_label_style_.font_size() * 0.7;
+              // Seems to need a bit more space for right than left if rotated.
               alignment = center_align;
             }
-            else
-            { // Assume some 45 slope, so need about sqrt(2) less space?
-              x_left += y_value_label_style_.font_size() * 0.5; // move left by half a font width.
-              // no y shift needed.
-              alignment = right_align;
+            else if(y_ticks_.major_value_labels_side_ > 0)
+            { // labels to right, so start a little to right of x_right.
+              x = x_right + y_value_label_style_.font_size() * 1.5;
+              alignment = center_align;
+            }
+					}
+					else if (y_ticks_.label_rotation_ == downward)
+					{ // Tick value label straight down vertically on Y-axis.
+            y -= y_value_label_style_.font_size() * 0.1;
+            if (y_ticks_.major_value_labels_side_ < 0)
+            { // labels to left, so start a little to left of x_left.
+              x = x_left - y_value_label_style_.font_size() * 1.2;
+              // Seems to need a bit more space for right than left if rotated.
+              alignment = center_align;
             }
+            else if(y_ticks_.major_value_labels_side_ > 0)
+            { // labels to right, so start a little to right of x_right.
+              x = x_right + y_value_label_style_.font_size() * 0.7;
+              alignment = center_align;
+            }
+					}
+					else
+					{ // Others not yet implemented.
+            return; // Without any value label.
+         } // All rotations.
+
+        if (x <= 0)
+        { // Sanity checks on svg coordinates.
+          throw std::runtime_error("Y-tick X value wrong!");
+        }
+        if (y <= 0)
+        {
+          throw std::runtime_error("Y-tick Y value wrong!");
+        }
+        if(y_ticks_.ticks_on_window_or_axis_ != 0)
+          { // External to plot window style left or right.
             // Always want all values including "0", if labeling external to plot window.
-            // y_ticks_.ticks_on_plot_window_on_ == true != 0
+            // y_ticks_.ticks_on_window_or_axis_ == true != 0
             image.g(detail::PLOT_VALUE_LABELS).text(
-              x_left,
+              x,
               y,
               label.str(), y_value_label_style_, alignment, y_ticks_.label_rotation_);
           }
           else
-          { // ! y_ticks_.y_ticks_on_plot_window_ == 0 Internal - value labels close to left of vertical Y-axis.
+          { // ! y_ticks_.y_ticks_on_plot_window_ == 0 'Internal' - value labels either side of vertical Y-axis.
             if ((value != 0) && y_axis_.axis_line_on_)
             { // Avoid a zero ON the Y-axis if it would be cut through by any horizontal X-axis line.
-              y += y_value_label_style_.font_size() / 2;
               image.g(detail::PLOT_VALUE_LABELS).text(
-                x_left ,
-                y, // Just shift down half a digit to center value digits on tick.
+                x,
+                y,
                 label.str(),
                 y_value_label_style_,
-                alignment, // on the tick ???
+                alignment,
                 y_ticks_.label_rotation_);
             }
-          }
-        } // if(use_y_major_labels)
+          } // either on plot window or 'on axis'.
+        } // want value label on tick
       } // draw_y_major_tick
 
       void draw_y_minor_tick(double value, path_element& tick_path, path_element& grid_path)
       { // Draw a Y-axis minor tick and optional grid.
-        double x_left(0.);
-        double y(value); // tick position and value label.
-        transform_y(y); // to svg.
+        double x_left(0.); // Start on vertical Y axis line.
         double x_right(image.y_size()); // right edge of image.
+        double y(value); // Tick position and value label,
+        transform_y(y); // convert to svg.
 
         if(y_ticks_.minor_grid_on_)
         { // Draw the minor grid, if wanted.
@@ -888,20 +995,21 @@
             grid_path.M(x_left, y).L(x_right, y); // Draw grid line.
           }
           // TODO else just ignore outside plot window?
-        }
+        } // y_minor_grid
 
-        if(y_ticks_.ticks_on_plot_window_on_ < 0)
+        // Draw y minor ticks.
+        if(y_ticks_.ticks_on_window_or_axis_ < 0)
         { // Put y minor ticks on the plot window border left.
           x_left = plot_left_;
           x_right = plot_left_;
         }
-        else if (y_ticks_.ticks_on_plot_window_on_ > 0)
+        else if (y_ticks_.ticks_on_window_or_axis_ > 0)
         { // Put y minor ticks on the plot window border left.
           x_left = plot_right_;
           x_right = plot_right_;
         }
         else
-        { // Internal style,
+        { // Internal style, y_ticks_.ticks_on_window_or_axis_ == 0
           x_left = y_axis_.axis_; // On the Y-axis line itself.
           x_right = y_axis_.axis_;
         }
@@ -1180,8 +1288,14 @@
       // document node, which calls all other nodes through the Visitor pattern.
       // -----------------------------------------------------------------
 
-      svg_2d_plot& write(const std::string& filename)
+      svg_2d_plot& write(const std::string& file)
       { // Write the plot image to a named file.
+        std::string filename(file); // Copy to avoid problem with const if try to append.
+        if (filename.find(".svg") == std::string::npos)
+        { // No file type suffix, so provide the default .svg.
+          filename.append(".svg");
+        }
+
         std::ofstream fout(filename.c_str());
         if(fout.fail())
         {
@@ -1249,13 +1363,13 @@
 
       svg_2d_plot& y_major_labels_on(int cmd)
       { //< 0 means to left or down (default), 0 (false) means none, > 0 means to right (or top).
-        y_ticks_.major_value_labels_on_ = cmd;
+        y_ticks_.major_value_labels_side_ = cmd;
         return *this;
       }
 
       int y_major_labels_on()
       {
-        return y_ticks_.major_value_labels_on_;
+        return y_ticks_.major_value_labels_side_;
       }
 
       svg_2d_plot& y_major_label_rotation(rotate_style rot)
@@ -1540,26 +1654,48 @@
         return y_ticks_.minor_tick_width_;
       }
 
-      svg_2d_plot& x_ticks_on_plot_window_on(int is)
+      svg_2d_plot& x_ticks_on_window_or_axis(int is)
       {
-        x_ticks_.ticks_on_plot_window_on_ = is;
+        x_ticks_.ticks_on_window_or_axis_ = is;
         return *this;
       }
 
-      bool x_ticks_on_plot_window_on()
+      int x_ticks_on_window_or_axis()
       {
-        return x_ticks_.ticks_on_plot_window_on_;
+        return x_ticks_.ticks_on_window_or_axis_;
+      }
+
+      svg_2d_plot& x_major_value_labels_side(int is)
+      { // Label values side for major ticks left -1, (right +1 or none 0).
+        x_ticks_.major_value_labels_side_ = is;
+        return *this;
+      }
+
+      int x_major_value_labels_side()
+      { // Label values side for major ticks left -1, (right +1 or none 0).
+        return x_ticks_.major_value_labels_side_;
       }
 
-      svg_2d_plot& y_ticks_on_plot_window_on(int is)
+      svg_2d_plot& y_ticks_on_window_or_axis(int is)
       {
-        y_ticks_.ticks_on_plot_window_on_ = is;
+        y_ticks_.ticks_on_window_or_axis_ = is;
         return *this;
       }
 
-      bool y_ticks_on_plot_window_on()
+      int y_ticks_on_window_or_axis()
       {
-        return y_ticks_.ticks_on_plot_window_on_;
+        return y_ticks_.ticks_on_window_or_axis_;
+      }
+
+      svg_2d_plot& y_major_value_labels_side(int is)
+      {  // Label values side for major ticks left -1, (right +1 or none 0).
+        y_ticks_.major_value_labels_side_ = is;
+        return *this;
+      }
+
+      int y_major_value_labels_side()
+      { // Label values side for major ticks left -1, (right +1 or none 0).
+        return y_ticks_.major_value_labels_side_;
       }
 
       svg_2d_plot& y_ticks_left_on(bool cmd)
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg_boxplot.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg_boxplot.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg_boxplot.hpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -646,26 +646,25 @@
     return *this;
 }
 
-svg_boxplot& write(const std::string& str)
+svg_boxplot& write(std::string& file)
 {
-    std::ofstream fout(str.c_str());
-
+    std::string filename(file); // Copy to avoid problems with const if need to append.
+    if (filename.find(".svg") == std::string::npos)
+    { // No file type suffix, so provide the default .svg.
+      filename.append(".svg");
+    }
+    std::ofstream fout(filename.c_str());
     if(fout.fail())
     {
-        throw std::runtime_error("Unable to open "+str);
+        throw std::runtime_error("Unable to open "+ filename);
     }
-
-    write(fout);
-
     return *this;
 }
 
 svg_boxplot& write(std::ostream& s_out)
 {
     update_image();
-
     image.write(s_out);
-
     return *this;
 }
 
@@ -687,7 +686,7 @@
     return *this;
 }
 
-svg_boxplot& y_major_labels_on(int cmd)
+svg_boxplot& y_major_value_labels_side(int cmd)
 {
     use_y_major_labels = cmd;
     return *this;
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg_style.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg_style.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg_style.hpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -733,7 +733,7 @@
     bool right_ticks_on_; // Draw ticks right from vertical Y-axis line.
     // Simplest to have all of these although only one pair like up or down is used.
     // Unused are always false.
-    int major_value_labels_on_; // Label values for major ticks.
+    int major_value_labels_side_; // Label values for major ticks, and direction.
     // < 0 means to left or down (default), 0 (false) means none, > 0 means to right (or top)/
     rotate_style label_rotation_; // Direction axis value labels written.
     bool major_grid_on_;  // Draw X grid at major ticks.
@@ -742,10 +742,10 @@
     std::ios_base::fmtflags value_ioflags_;  // IO formatting flags for the axis default std::ios::dec.
     bool strip_e0s_; // If redundant zero, + and e are to be stripped.
     double label_max_width_;  // width (in SVG units) of longest label on axis.
-    int ticks_on_plot_window_on_; // Value labels & ticks on the plot window border 
+    int ticks_on_window_or_axis_; // Value labels & ticks on the plot window border 
     // (rather than on X or Y-axis).
-    // For X-axis -1 = left, 0 = false, +1 = right. Default -1 left of plot window.
-    // For Y-axis -1 = bottom, 0 = false, +1 = top. Default -1 bottom of plot window.
+    // For X-axis -1 = left, 0 = false, +1 = right. Default -1 to left of plot window.
+    // For Y-axis -1 = bottom, 0 = false, +1 = top. Default -1 below bottom of plot window.
     const text_style& value_label_style_;
 
     ticks_labels_style(dim d = X,
@@ -783,7 +783,7 @@
     right_ticks_on_(false), // Draw ticks right from vertical Y-axis line.
     // Simplest to have all of these although only one pair like up or down is used.
     // Unused are always false.
-    major_value_labels_on_(-1), // Label values side for major ticks left (right or none).
+    major_value_labels_side_(-1), // Label values side for major ticks left (right or none).
     label_rotation_(horizontal), // Direction axis value labels written.
     major_grid_on_(false),  // Draw grid at major ticks.
     minor_grid_on_(false),// Draw grid at minor ticks.
@@ -792,7 +792,8 @@
     // Note that ALL the flags are set, overwriting any defaults, so std::dec is wise.
     strip_e0s_(true), // strip superflous zeros and signs.
     label_max_width_(0.), // width (estimated in SVG units) of longest label on axis.
-    ticks_on_plot_window_on_(-1) // Value labels & ticks on the plot window rather than on X or Y-axis.
+    ticks_on_window_or_axis_(-1) // Value labels & ticks on the plot window
+    // rather than on X or Y-axis.
     // Default -1 means left or bottom.
   {
       if(max_ <= min_)
@@ -829,7 +830,7 @@
   double longest_label()
   { // Update label_max_width_ with the longest value label as pixels,
     // return the count of digits etc.
-    if(major_value_labels_on_ != 0) // ! none
+    if(major_value_labels_side_ != 0) // ! none
     { // Show values by the tick as "1.2" or "3.4e+000"...
       double longest = 0;
       
@@ -842,7 +843,7 @@
       // Check length of label for the ticks on the positive side (right or above zero).
       for(double v = 0.; v <= max_; v += major_interval_)
       {
-        if (v != 0. || ticks_on_plot_window_on_)
+        if (v != 0. || ticks_on_window_or_axis_)
         { // Avoid a major tick at x == 0 where there *is* a vertical Y-axis line,
           // or avoid a major tick at y == 0 where there *is* a horizontal X-axis line.
           // (won't be a Y-axis line for 1-D,
@@ -857,7 +858,7 @@
       // Check length of label of the ticks on the negative side (left of zero).
       for(double v = 0.; v >= min_; v -= major_interval_)
       {
-        if (v != 0. || ticks_on_plot_window_on_)
+        if (v != 0. || ticks_on_window_or_axis_)
         { // Avoid a major tick at x == 0 where there *is* a vertical Y-axis line.
           // (won't be Y-axis line for 1-D where the zero tick is always wanted).
           // But no tick means no value label 0 either unless on_plot_window.
@@ -901,14 +902,14 @@
     return *this; // Make chainable.
   }
 
-  int major_value_labels_on() const
+  int major_value_labels_side() const
   { // Get tick value labels to left (<0), none (==0) or right (>0).
-    return major_value_labels_on_;
+    return major_value_labels_side_;
   }
 
-  ticks_labels_style& major_value_labels_on(int is) 
+  ticks_labels_style& major_value_labels_side(int is) 
   { // Set tick value labels to left (<0), none (==0) or right (>0).
-    major_value_labels_on_ = is;
+    major_value_labels_side_ = is;
     return *this; // Make chainable.
   }
 
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/index.html
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/index.html	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/index.html	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -96,7 +96,7 @@
 </div>
 </div>
 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"><p><small>Last revised: January 23, 2008 at 19:43:00 GMT</small></p></td>
+<td align="left"><p><small>Last revised: January 24, 2008 at 13:17:20 GMT</small></p></td>
 <td align="right"><div class="copyright-footer"></div></td>
 </tr></table>
 <hr>
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/svg_plot/interface/svg_2d_plot_interface.html
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/svg_plot/interface/svg_2d_plot_interface.html	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/svg_plot/interface/svg_2d_plot_interface.html	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -359,12 +359,12 @@
 <td>
             <p>
               <code class="computeroutput"><span class="identifier">svg_2d_plot</span><span class="special">&</span>
-              <span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code>x_major_label_rotation
+              <span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code>y_major_label_rotation
             </p>
             </td>
 <td>
             <p>
-              Determines the direction of writing of value labels from the y axis
+              Determines the direction of writing of value labels from the Y axis
               ticks. <code class="computeroutput"><span class="keyword">enum</span> <span class="identifier">rotate_style</span></code>
               provides control is 45 degree steps. The default is horizontal.
             </p>
@@ -385,14 +385,55 @@
 <td>
             <p>
               <code class="computeroutput"><span class="identifier">svg_2d_plot</span><span class="special">&</span>
-              <span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code>x_major_label_rotation
+              <span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code>x_major_value_labels<span class="underline">on</span>
             </p>
             </td>
 <td>
             <p>
-              Determines the direction of writing of value labels from the X axis
-              ticks. <code class="computeroutput"><span class="keyword">enum</span> <span class="identifier">rotate_style</span></code>
-              provides control is 45 degree steps. The default is horizontal.
+              Determines if label values for X major ticks, and direction.: -1 =
+              bottom, 0 = no value labels, +1 = top. Default -1, bottom of plot window.
+            </p>
+            </td>
+</tr>
+<tr>
+<td>
+            <p>
+              <code class="computeroutput"><span class="identifier">svg_2d_plot</span><span class="special">&</span>
+              <span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code>y_major_value_labels<span class="underline">on</span>
+            </p>
+            </td>
+<td>
+            <p>
+              Determines if label values for Y major ticks, and direction.: -1 =
+              left, 0 = no value labels, +1 = right. Default -1, left of plot window.
+            </p>
+            </td>
+</tr>
+<tr>
+<td>
+            <p>
+              <code class="computeroutput"><span class="identifier">svg_2d_plot</span><span class="special">&</span>
+              <span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code>x_ticks_on_plot_window_on
+            </p>
+            </td>
+<td>
+            <p>
+              Determines the side of Y axis of value labels & ticks: -1 = left,
+              0 = on Y-axis, +1 = right. Default -1, left of plot window.
+            </p>
+            </td>
+</tr>
+<tr>
+<td>
+            <p>
+              <code class="computeroutput"><span class="identifier">svg_2d_plot</span><span class="special">&</span>
+              <span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code>y_ticks_on_plot_window_on
+            </p>
+            </td>
+<td>
+            <p>
+              Determines the side or X axis of value labels & ticks: -1 = bottom,
+              0 = on X-axis, +1 = top. Default -1, bottom of plot window.
             </p>
             </td>
 </tr>
@@ -432,7 +473,7 @@
 </table></div>
 </div>
 <br class="table-break"><div class="table">
-<a name="id703322"></a><p class="title"><b>Table 17. 2D_plot Colors</b></p>
+<a name="id703487"></a><p class="title"><b>Table 17. 2D_plot Colors</b></p>
 <div class="table-contents"><table class="table" summary="2D_plot Colors">
 <colgroup>
 <col>
@@ -683,7 +724,7 @@
 </table></div>
 </div>
 <br class="table-break"><div class="table">
-<a name="id704611"></a><p class="title"><b>Table 18. 2D_plot Axis Information</b></p>
+<a name="id704776"></a><p class="title"><b>Table 18. 2D_plot Axis Information</b></p>
 <div class="table-contents"><table class="table" summary="2D_plot Axis Information">
 <colgroup>
 <col>
@@ -973,7 +1014,7 @@
         preceeding code).
       </p>
 <a name="svg_plot.interface.svg_2d_plot_interface.the__code__phrase_role__identifier__plot__phrase__phrase_role__special______phrase___code__method"></a><h5>
-<a name="id706014"></a>
+<a name="id706181"></a>
         <a href="svg_2d_plot_interface.html#svg_plot.interface.svg_2d_plot_interface.the__code__phrase_role__identifier__plot__phrase__phrase_role__special______phrase___code__method">The
         <code class="computeroutput"><span class="identifier">plot</span><span class="special">()</span></code>
         Method</a>
@@ -984,7 +1025,7 @@
         named parameters, as well as a deduced parameter.
       </p>
 <div class="table">
-<a name="id706074"></a><p class="title"><b>Table 19. 2D_plot Required parameter</b></p>
+<a name="id706241"></a><p class="title"><b>Table 19. 2D_plot Required parameter</b></p>
 <div class="table-contents"><table class="table" summary="2D_plot Required parameter">
 <colgroup>
 <col>
@@ -1047,7 +1088,7 @@
 </table></div>
 </div>
 <br class="table-break"><div class="table">
-<a name="id706195"></a><p class="title"><b>Table 20. 2D_plot Deduced parameter</b></p>
+<a name="id706362"></a><p class="title"><b>Table 20. 2D_plot Deduced parameter</b></p>
 <div class="table-contents"><table class="table" summary="2D_plot Deduced parameter">
 <colgroup>
 <col>
@@ -1102,7 +1143,7 @@
 </table></div>
 </div>
 <br class="table-break"><div class="table">
-<a name="id706295"></a><p class="title"><b>Table 21. 2D_plot Optional Parameters</b></p>
+<a name="id706460"></a><p class="title"><b>Table 21. 2D_plot Optional Parameters</b></p>
 <div class="table-contents"><table class="table" summary="2D_plot Optional Parameters">
 <colgroup>
 <col>
@@ -1337,7 +1378,7 @@
         Here are some examples of correct uses:
       </p>
 <a name="svg_plot.interface.svg_2d_plot_interface.using_fill_and_stroke_colors"></a><h4>
-<a name="id707100"></a>
+<a name="id707265"></a>
         <a href="svg_2d_plot_interface.html#svg_plot.interface.svg_2d_plot_interface.using_fill_and_stroke_colors">Using
         fill and stroke colors</a>
       </h4>
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/svg_plot/interface/svg_boxplot_interface.html
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/svg_plot/interface/svg_boxplot_interface.html	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/svg_plot/interface/svg_boxplot_interface.html	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -27,7 +27,7 @@
 <a name="svg_plot.interface.svg_boxplot_interface"></a> svg_boxplot Public Interface
 </h3></div></div></div>
 <div class="table">
-<a name="id707244"></a><p class="title"><b>Table 22. Boxplot Miscellaneous</b></p>
+<a name="id707409"></a><p class="title"><b>Table 22. Boxplot Miscellaneous</b></p>
 <div class="table-contents"><table class="table" summary="Boxplot Miscellaneous">
 <colgroup>
 <col>
@@ -102,7 +102,7 @@
 </table></div>
 </div>
 <br class="table-break"><div class="table">
-<a name="id707538"></a><p class="title"><b>Table 23. Boxplot Commands</b></p>
+<a name="id707704"></a><p class="title"><b>Table 23. Boxplot Commands</b></p>
 <div class="table-contents"><table class="table" summary="Boxplot Commands">
 <colgroup>
 <col>
@@ -190,7 +190,7 @@
 </table></div>
 </div>
 <br class="table-break"><div class="table">
-<a name="id707868"></a><p class="title"><b>Table 24. Boxplot Colors</b></p>
+<a name="id708033"></a><p class="title"><b>Table 24. Boxplot Colors</b></p>
 <div class="table-contents"><table class="table" summary="Boxplot Colors">
 <colgroup>
 <col>
@@ -341,7 +341,7 @@
 </table></div>
 </div>
 <br class="table-break"><div class="table">
-<a name="id708600"></a><p class="title"><b>Table 25. Boxplot Axis Information</b></p>
+<a name="id708765"></a><p class="title"><b>Table 25. Boxplot Axis Information</b></p>
 <div class="table-contents"><table class="table" summary="Boxplot Axis Information">
 <colgroup>
 <col>
@@ -528,7 +528,7 @@
         preceeding code).
       </p>
 <a name="svg_plot.interface.svg_boxplot_interface.the__code__phrase_role__identifier__plot__phrase__phrase_role__special______phrase___code__function"></a><h5>
-<a name="id709504"></a>
+<a name="id709669"></a>
         <a href="svg_boxplot_interface.html#svg_plot.interface.svg_boxplot_interface.the__code__phrase_role__identifier__plot__phrase__phrase_role__special______phrase___code__function">The
         <code class="computeroutput"><span class="identifier">plot</span><span class="special">()</span></code>
         Function</a>
@@ -539,7 +539,7 @@
         control their display.
       </p>
 <div class="table">
-<a name="id709564"></a><p class="title"><b>Table 26. Required parameters</b></p>
+<a name="id709729"></a><p class="title"><b>Table 26. Required parameters</b></p>
 <div class="table-contents"><table class="table" summary="Required parameters">
 <colgroup>
 <col>
@@ -602,7 +602,7 @@
 </table></div>
 </div>
 <br class="table-break"><div class="table">
-<a name="id709685"></a><p class="title"><b>Table 27. Optional Functions</b></p>
+<a name="id709851"></a><p class="title"><b>Table 27. Optional Functions</b></p>
 <div class="table-contents"><table class="table" summary="Optional Functions">
 <colgroup>
 <col>
@@ -895,7 +895,7 @@
 </table></div>
 </div>
 <br class="table-break"><a name="svg_plot.interface.svg_boxplot_interface.styles_providing_addition_control"></a><h5>
-<a name="id710830"></a>
+<a name="id710995"></a>
         <a href="svg_boxplot_interface.html#svg_plot.interface.svg_boxplot_interface.styles_providing_addition_control">Styles
         providing addition control</a>
       </h5>
@@ -913,7 +913,7 @@
 </span><span class="keyword">class</span> <span class="identifier">ticks_labels_style</span><span class="special">;</span> <span class="comment">// Parameters of the axis, grids, & ticks and their value labels.
 </span></pre>
 <a name="svg_plot.interface.svg_boxplot_interface.box_style_defines_a_rectangular_box_"></a><h4>
-<a name="id711011"></a>
+<a name="id711176"></a>
         <a href="svg_boxplot_interface.html#svg_plot.interface.svg_boxplot_interface.box_style_defines_a_rectangular_box_">Box
         Style defines a rectangular box.</a>
       </h4>
@@ -948,7 +948,7 @@
 <span class="special">};</span> <span class="comment">// class box_style
 </span></pre>
 <div class="table">
-<a name="id711647"></a><p class="title"><b>Table 28. Box Style Constructor</b></p>
+<a name="id711812"></a><p class="title"><b>Table 28. Box Style Constructor</b></p>
 <div class="table-contents"><table class="table" summary="Box Style Constructor">
 <colgroup>
 <col>
@@ -1116,7 +1116,7 @@
 </table></div>
 </div>
 <br class="table-break"><div class="table">
-<a name="id711898"></a><p class="title"><b>Table 29. Box Style Accessor functions (all are chainable).</b></p>
+<a name="id712063"></a><p class="title"><b>Table 29. Box Style Accessor functions (all are chainable).</b></p>
 <div class="table-contents"><table class="table" summary="Box Style Accessor functions (all are chainable).">
 <colgroup>
 <col>
@@ -1319,7 +1319,7 @@
 </table></div>
 </div>
 <br class="table-break"><a name="svg_plot.interface.svg_boxplot_interface.text_style_defines_text_font__size_etc_"></a><h4>
-<a name="id712213"></a>
+<a name="id712378"></a>
         <a href="svg_boxplot_interface.html#svg_plot.interface.svg_boxplot_interface.text_style_defines_text_font__size_etc_">Text
         Style defines text Font, Size etc.</a>
       </h4>
@@ -1344,7 +1344,7 @@
 </span><span class="special">}</span>
 </pre>
 <div class="table">
-<a name="id712711"></a><p class="title"><b>Table 30. Text Style Constructor</b></p>
+<a name="id712876"></a><p class="title"><b>Table 30. Text Style Constructor</b></p>
 <div class="table-contents"><table class="table" summary="Text Style Constructor">
 <colgroup>
 <col>
@@ -1534,7 +1534,7 @@
         produces a Lucida Sans Unicode font of size of 14 svg units (usually pixels).
       </p>
 <div class="table">
-<a name="id713047"></a><p class="title"><b>Table 31. Text Style Accessor functions</b></p>
+<a name="id713212"></a><p class="title"><b>Table 31. Text Style Accessor functions</b></p>
 <div class="table-contents"><table class="table" summary="Text Style Accessor functions">
 <colgroup>
 <col>
@@ -1748,7 +1748,7 @@
 </table></div>
 </div>
 <br class="table-break"><a name="svg_plot.interface.svg_boxplot_interface.plot_point_style_defines_how_data_points_are_marked_"></a><h4>
-<a name="id713373"></a>
+<a name="id713538"></a>
         <a href="svg_boxplot_interface.html#svg_plot.interface.svg_boxplot_interface.plot_point_style_defines_how_data_points_are_marked_">plot_point_style
         defines how data points are marked.</a>
       </h4>
@@ -1775,7 +1775,7 @@
   <span class="special">}</span>
 </pre>
 <div class="table">
-<a name="id714005"></a><p class="title"><b>Table 32. Plot Point Style Constructor</b></p>
+<a name="id714170"></a><p class="title"><b>Table 32. Plot Point Style Constructor</b></p>
 <div class="table-contents"><table class="table" summary="Plot Point Style Constructor">
 <colgroup>
 <col>
@@ -1982,7 +1982,7 @@
 </span><span class="special">};</span> 
 </pre>
 <div class="table">
-<a name="id714878"></a><p class="title"><b>Table 33. Plot Point Style Accessor functions</b></p>
+<a name="id715043"></a><p class="title"><b>Table 33. Plot Point Style Accessor functions</b></p>
 <div class="table-contents"><table class="table" summary="Plot Point Style Accessor functions">
 <colgroup>
 <col>
@@ -2185,7 +2185,7 @@
 </table></div>
 </div>
 <br class="table-break"><a name="svg_plot.interface.svg_boxplot_interface.plot_line_style_defines_how_data_points_are_joined_"></a><h4>
-<a name="id715195"></a>
+<a name="id715359"></a>
         <a href="svg_boxplot_interface.html#svg_plot.interface.svg_boxplot_interface.plot_line_style_defines_how_data_points_are_joined_">plot_line_style
         defines how data points are joined.</a>
       </h4>
@@ -2206,7 +2206,7 @@
 </span>    <span class="special">}</span>
 </pre>
 <div class="table">
-<a name="id715705"></a><p class="title"><b>Table 34. Plot line Style Constructor</b></p>
+<a name="id715870"></a><p class="title"><b>Table 34. Plot line Style Constructor</b></p>
 <div class="table-contents"><table class="table" summary="Plot line Style Constructor">
 <colgroup>
 <col>
@@ -2383,7 +2383,7 @@
 <span class="identifier">my_plot</span><span class="special">.</span><span class="identifier">plot</span><span class="special">(</span><span class="identifier">data3</span><span class="special">,</span> <span class="string">"-1 + 2x"</span><span class="special">).</span><span class="identifier">bezier_on</span><span class="special">(</span><span class="keyword">true</span><span class="special">).</span><span class="identifier">line_color</span><span class="special">(</span><span class="identifier">blue</span><span class="special">);</span>
 </pre>
 <div class="table">
-<a name="id716109"></a><p class="title"><b>Table 35. Plot Line Style Accessor functions</b></p>
+<a name="id716273"></a><p class="title"><b>Table 35. Plot Line Style Accessor functions</b></p>
 <div class="table-contents"><table class="table" summary="Plot Line Style Accessor functions">
 <colgroup>
 <col>
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/doc/interface.qbk
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/doc/interface.qbk	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/doc/interface.qbk	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -147,9 +147,9 @@
   [[`svg_2d_plot& x_value_ioflags(int)`] [Determines the iostream flags for value labels on the X axis major ticks will be displayed. Default is std::ios::dec.  This allows fine control of the value labels using, for example (ios::dec | ios::scientific), or (ios::dec | ios::fixed), particularly in conjunction with precision.]]
   [[`svg_2d_plot& y_value_precision(int)`] [Determines the iostream precison for value labels on the Y axis major ticks will be displayed. Default is 3 (rather than the iostream default of 6).]]
   [[`svg_2d_plot& y_value_ioflags(int)`] [Determines the iostream flags for value labels on the Y axis major ticks will be displayed. Default is std::ios::dec.  This allows fine control of the value labels using, for example (ios::dec | ios::scientific), or (ios::dec | ios::fixed), particularly in conjunction with precision.]]
-  [[`svg_2d_plot& (int)`x_major_label_rotation] [Determines the direction of writing of value labels from the y axis ticks. `enum rotate_style` provides control is 45 degree steps. The default is horizontal. 
+  [[`svg_2d_plot& `y_major_label_rotation(int)] [Determines the direction of writing of value labels from the Y axis ticks. `enum rotate_style` provides control is 45 degree steps. The default is horizontal. 
   
-    `enum rotate_style { // Rotation in degrees from horizontal. horizontal = 0, // normal left to right.
+    ``enum rotate_style { // Rotation in degrees from horizontal. horizontal = 0, // normal left to right.
       uphill = -45, // slope up.
       upward = -90, // vertical writing up.
       backup = -135, // slope up backwards.
@@ -158,11 +158,15 @@
       backdown = 135, // slope down backwards.
       upsidedown = 180 // == -180
     };
+    ``
     
   ]]
-  [[`svg_2d_plot& (int)`x_major_label_rotation] [Determines the direction of writing of value labels from the X axis ticks. `enum rotate_style` provides control is 45 degree steps. The default is horizontal.]]
-  [[`svg_2d_plot& x_label_strip_e0s(bool)`] [Determines whether or not the X axis value labels for major ticks are stripped of redundant zero, e or E,, and + sign.  This can markedly reduce visual clutter, for example, reducing "1.2e+000" to "1.2".]]
-  [[`svg_2d_plot& y_label_strip_e0s(bool)`] [Determines whether or not the Y axis value labels for major ticks are stripped of redundant zero, e or E,, and + sign.  This can markedly reduce visual clutter, for example, reducing "1.2e+000" to "1.2".]]
+  [[`svg_2d_plot& `x_major_value_labels_on(int)`] [Determines if label values for X major ticks, and direction:  -1 = bottom, 0 = *no* value labels, +1 = top. Default -1, bottom of plot window.]]
+  [[`svg_2d_plot& `y_major_value_labels_on(int)`] [Determines if label values for Y major ticks, and direction:  -1 = left, 0 = *no* value labels, +1 = right. Default -1, left of plot window.]]
+  [[`svg_2d_plot& `x_ticks_on_plot_window_on(int)`] [Determines the position of Y axis of value labels & ticks:  -1 = left, 0 = on Y-axis, +1 = right. Default -1, left of plot window.]]
+  [[`svg_2d_plot& `y_ticks_on_plot_window_on(int)`] [Determines the position of X axis of value labels & ticks: -1 = bottom, 0 = on X-axis, +1 = top. Default -1, bottom of plot window.]]
+  [[`svg_2d_plot& `x_label_strip_e0s(bool)`] [Determines whether or not the X axis value labels for major ticks are stripped of redundant zero(s), e or E, and + sign.  This can markedly reduce visual clutter, for example, reducing "1.2e+000" to "1.2".]]
+  [[`svg_2d_plot& `y_label_strip_e0s(bool)`] [Determines whether or not the Y axis value labels for major ticks are stripped of redundant zero(s), e or E, and + sign.  This can markedly reduce visual clutter, for example, reducing "1.2e+000" to "1.2".]]
   
 ] [/ table 2D_plot Commands]
 
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/doc/rationale.qbk
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/doc/rationale.qbk	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/doc/rationale.qbk	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -20,10 +20,8 @@
  1 if major are even, major 0, minor 1, major 2 ...
  4 if major on 0, minor on 1,2,3,4, major on 5 ...
  9 if major on 0, minor on 1,2,3,4,5,6,7,8,9, major on 10
- 
- 
- [/h4 Minor ticks]
 
+ [/h4 Minor ticks]
 
 This section provide more information about this implementation
 and some of the rationale for desing decisions.
@@ -46,7 +44,8 @@
 
 If each element has its own style (fill, stroke etc)
 then the .svg file size would be increased.
-(This style is used by other packages that output svg).
+(This style is used by other packages that output svg
+and often leads to larger file sizes).
 
 So the [@http://www.w3.org/TR/SVG/struct.html#GElement group element]
 is used with each type given an id to allow reference back to it.
@@ -70,10 +69,6 @@
 and have the change reflected on every point in the series. It seems
 this is the most logical way to represent the data in memory.
 
-
-
-
-
 [h4 Economising on .svg File Size]
 
 Some of the factors affecting the file size are:
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/doc/svg_interface.qbk
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/doc/svg_interface.qbk	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/doc/svg_interface.qbk	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -124,7 +124,7 @@
 
   [[`void y_size(unsigned int)`] [Sets the height of the image (pixels).] []]
 
-  [[`void write(const std::string&)`] [Writes the document to the file represented by the argument.][Opens the file stream itself and tries to call `write(std::ostream&)`. Throws `std::runtime_exception` if it can not open the file.]]
+  [[`void write(const std::string&)`] [Writes the document to the file represented by the argument. (If not file type sufix is provided, the default file suffix `".svg"` is appended.][Opens the file stream itself and tries to call `write(std::ostream&)`. Throws `std::runtime_exception` if it can not open the file.]]
 
   [[`void write(std::ostream&)`] [Writes the document to the stream represented by the argument.][]] 
 ] [/table `svg` document settings and writing]
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/example/1d_full_layout.cpp
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/example/1d_full_layout.cpp	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/example/1d_full_layout.cpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -63,7 +63,7 @@
         my_plot.legend_on(true)
                .plot_window_on(true)
                .x_label_on(true)
-	       .x_major_labels_on(true);
+	       .x_major_value_labels_side(true);
         
         // Color settings.
         my_plot.background_color(svg_color(67, 111, 69))
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_area_fill.cpp
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_area_fill.cpp	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_area_fill.cpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -39,13 +39,13 @@
         my_plot.title("Plot of 50 * sin(x)")
                .title_font_size(29)
                .x_label("X Axis Units")
-           .y_major_labels_on(true)
+           .y_major_value_labels_side(true)
            .y_major_grid_on(true);
         
         // Commands.
         my_plot.plot_window_on(true)
                .x_label_on(true)
-	       .x_major_labels_on(true);
+	       .x_major_value_labels_side(true);
         
         // Color settings.
         my_plot.background_color(svg_color(67, 111, 69))
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_bezier.cpp
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_bezier.cpp	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_bezier.cpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -45,7 +45,7 @@
         my_plot.title("Plot of trig functions")
                .title_font_size(29)
                .x_label("X Axis Units")
-           .y_major_labels_on(true)
+           .y_major_value_labels_side(true)
            .y_major_grid_on(true);
         
         // Commands.
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_full.cpp
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_full.cpp	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_full.cpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -53,7 +53,7 @@
         my_plot.legend_on(true)
                .plot_window_on(true)
                .x_label_on(true)
-	       .x_major_labels_on(true);
+	       .x_major_value_labels_side(true);
         
         // Color settings.
         my_plot.background_color(svg_color(67, 111, 69))
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_limit.cpp
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_limit.cpp	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_limit.cpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -38,12 +38,12 @@
         // Text settings.
         my_plot.title("Plot of 1 / x")
                .x_label("X Axis Units")
-           .y_major_labels_on(true)
+           .y_major_value_labels_side(true)
            .y_major_grid_on(true);
         
         // Commands.
         my_plot.plot_window_on(true)
-	       .x_major_labels_on(true);
+	       .x_major_value_labels_side(true);
 
         //X axis settings.
         my_plot.x_major_interval(2)
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/example/demo_2d_plot.cpp
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/example/demo_2d_plot.cpp	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/example/demo_2d_plot.cpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -56,7 +56,18 @@
 // and very many named colors in this namespace.
 
   // Use map with both x and y double.
-  map<double, double> data1, data2, data3;
+  map<double, double> data1;
+  map<double, double> data2;
+  map<double, double> data3;
+
+  enum side
+  { 
+    left_side = -1,
+    on_axis = 0,
+    right_side = +1,
+    bottom_side = -1,
+    top_side = +1,
+  };
 
 // Several simple math functions to demonstrate:
 double f(double x)
@@ -88,7 +99,9 @@
     const std::string& x_label = std::string(), // default is ""
     double xmin = 0., double xmax = 0.,
     const std::string& y_label = std::string(),
-    double ymin = 0., double ymax = 0.)
+    double ymin = 0., double ymax = 0.,
+    int x_major_label = -1, int y_major_label = -1,
+    int x_rotation = horizontal, int y_rotation = horizontal) // 
 {
     using namespace boost::svg;
 
@@ -110,8 +123,8 @@
           .plot_border_color(magenta)
           .x_label_on(true)
           .y_label_on(true)
-          .y_major_labels_on(-1)
-          .x_major_labels_on(-1)
+          .y_major_value_labels_side(left_side)
+          .x_major_value_labels_side(left_side)
           //.legend_title("Function")
           .legend_title("Unicode ΩΦ")
           .legend_title_font_size(16);
@@ -137,19 +150,19 @@
 
   // X axis settings.
   my_plot.x_range(xmin, xmax)
-          .x_major_interval(1)
+          .x_major_interval(2.)
           .x_major_tick_length(10) // pixels
           .x_major_tick_width(2) // pixels
           .x_minor_tick_length(5) // pixels
           .x_minor_tick_width(1) // pixels
-          .x_num_minor_ticks(4) // plus 1 major = 5 ticks per major step.
+          .x_num_minor_ticks(2) // plus 1 major = 5 ticks per major step.
           ;
 
   // Y-axis settings.
  my_plot
     .y_range(ymin, ymax)
-    .y_major_interval(1.)
-    .y_num_minor_ticks(4) // plus 1 major = 5 ticks per major step.
+    .y_major_interval(2.)
+    .y_num_minor_ticks(2) // plus 1 major = 5 ticks per major step.
     .y_major_tick_length(10) // pixels
     .y_major_tick_width(2) // pixels
     .y_minor_tick_length(5) // pixels
@@ -163,35 +176,59 @@
          .y_minor_grid_color(svg_color(240, 240, 255))
          .y_major_grid_width(2)
          .y_minor_grid_width(1)
-         .x_major_grid_on(true)  // But nothing shows - until you make .major_grid_on(true)!
+     // But nothing shows - until you make .major_grid_on(true)!
+         .x_major_grid_on(true) 
          .x_minor_grid_on(true)
          .y_major_grid_on(true)
          .y_minor_grid_on(true);
 
   my_plot.x_ticks_down_on(true); // X-axis.
   my_plot.y_ticks_left_on(true); // Y-axis.
-  my_plot.x_ticks_on_plot_window_on(0); // default on axes, if possible.
-  my_plot.y_ticks_on_plot_window_on(0);
+
+  // Where the ticks (and labels if any) go, left/right, on axis, or bottom/top.
+  // Default x_ticks_on_window_or_axis == -1 left or bottom, +1 right to top, 0 = on axis.
+  // my_plot.x_ticks_on_window_or_axis(+1); // 
+  // my_plot.y_ticks_on_window_or_axis(+1);
+  // my_plot.x_ticks_on_window_or_axis(-1); // right or top.
+  // my_plot.y_ticks_on_window_or_axis(-1);
+  // x_ticks_on_window_or_axis == 0 : on axes, if possible.
+  my_plot.x_ticks_on_window_or_axis(0); // ticks on axes.
+  my_plot.y_ticks_on_window_or_axis(0); // ticks on axes.
+
+  // Which side of axis line or plot window the value labels go.
+  //my_plot.x_major_value_labels_side(0); // NO value labels.
+  //my_plot.y_major_value_labels_side(0); // NO value labels.
+
+  //my_plot.x_major_value_labels_side(top_side); // Top side value labels.
+  //my_plot.x_major_value_labels_side(bottom_side); // Bottom side value labels (default).
+  //my_plot.y_major_value_labels_side(no_labels); // NO value labels.
+  //my_plot.y_major_value_labels_side(right_side); // Right side of axis value labels.
+  //my_plot.y_major_value_labels_side(left_side); // Left side value labels (default).
+
+
+  //my_plot.y_major_label_rotation(downhill); // sloping.
+  //my_plot.y_major_label_rotation(uphill); 
+  //my_plot.y_major_label_rotation(horizontal); // Default.
+  //my_plot.y_major_label_rotation(downward);
+
+  //my_plot.x_major_label_rotation(upward); 
+  //my_plot.x_major_label_rotation(downward); 
+  //my_plot.x_major_label_rotation(uphill); 
+  //my_plot.x_major_label_rotation(downhill); 
 
   my_plot.y_value_ioflags(ios::dec | ios::fixed).y_value_precision(1);
   my_plot.x_value_ioflags(ios::dec | ios::scientific).x_value_precision(2);
   //  my_plot.x_value_ioflags(ios::dec).x_value_precision(2);
 
-  my_plot.y_major_label_rotation(uphill); 
-  my_plot.x_major_label_rotation(downward); // sloping.
-   //my_plot.y_major_label_rotation(horizontal); // defaults.
-   //my_plot.x_major_label_rotation(horizontal);
-
   //my_plot.data_lines_width(4); // A bit gross!
         my_plot.plot(data1, "Sqrt(x)").fill_color(red);
-	my_plot.plot(data2, "-2 + x^2").fill_color(orange).size(5);
-	my_plot.plot(data3, "-1 + 2x").fill_color(yellow).bezier_on(true).line_color(blue).shape(square);
+	my_plot.plot(data2, "-2 + x^2").fill_color(orange).size(5).bezier_on(true);
+	my_plot.plot(data3, "-1 + 2x").fill_color(yellow).line_color(blue).shape(square);
 
   cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> " << file << endl;
   my_plot.write(file);
   show_plot_settings(my_plot);
 
-
   } // plot
 
 int main()
@@ -200,14 +237,15 @@
   {
   // boost::array or anything in boost such that pair_type has
   // std and boost as associated namespaces.
-  typedef ::std::pair< ::boost::array<int, 1>, int> pair_type;
-  pair_type p1;  pair_type p2;
+  //typedef ::std::pair< ::boost::array<int, 1>, int> pair_type;
+  //pair_type p1;
+  //pair_type p2;
 
-  p1.first[0] = p1.second = 0;
-  p2.first[0] = p2.second = 1;
+  //p1.first[0] = p1.second = 0;
+  //p2.first[0] = p2.second = 1;
 
-  array<pair<double, double>, 10> ddpairs;
-  ddpairs[0].first = 1.; ddpairs[0].second = 2.;
+  //array<pair<double, double>, 10> ddpairs;
+  //ddpairs[0].first = 1.; ddpairs[0].second = 2.;
   
   for(double i = -10; i <= 10.; i += 1.)
   {
@@ -219,7 +257,7 @@
    // Demonstrate/test plots with various range of x and y, some *not* including zero.
 
    plot("Plot of Mathematical Functions", "./demo_2d_plot_XYPM.svg", "X-axis", -10., +10., "Y-axis", -10., +10.); // Both X & Y include zero.
-    plot("Plot of Mathematical Functions", "./demo_2d_plot_XP.svg", "X-axis", +1., +10., "Y-axis", -10., 10.); // X all > 0
+   plot("Plot of Mathematical Functions", "./demo_2d_plot_XP.svg", "X-axis", +1., +10., "Y-axis", -10., 10.); // X all > 0
    plot("Plot of Mathematical Functions", "./demo_2d_plot_XN.svg", "X-axis", -10., -1., "Y-axis", -10., 10.); // x all < 0
    plot("Plot of Mathematical Functions", "./demo_2d_plot_YP.svg", "X-axis", -1., +10., "Y-axis", +1., +10.); // Y all > 0
    plot("Plot of Mathematical Functions", "./demo_2d_plot_YN.svg", "X-axis", -1., +10., "Y-axis", -10., -1.); // y all < 0
@@ -232,6 +270,8 @@
   {
     cout << message << endl;
   }
+
+
   return 0;
 } // int main()
 
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/example/math_special_functions.cpp
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/example/math_special_functions.cpp	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/example/math_special_functions.cpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -140,7 +140,7 @@
       //plot.legend_place(outside_right);
 
       plot
-        .x_major_labels_on(-1).y_major_labels_on(-1) // left and bottom
+        .x_major_value_labels_side(-1).y_major_value_labels_side(-1) // left and bottom
         .x_label_units_on(false).y_label_units_on(false);
       double x_delta = (m_max_x - m_min_x) / 50;
       double y_delta = (m_max_y - m_min_y) / 50;
@@ -415,7 +415,7 @@
    surface.legend_title_font_size(15);
    surface.title("Circle");
    surface.legend_on(false).title_on(true);
-   surface.x_major_labels_on(true).y_major_labels_on(true);
+   surface.x_major_value_labels_side(true).y_major_value_labels_side(true);
    surface.x_range(-2.2, 2.2)
       .y_range(-2.2, 2.2);
    surface.x_label_on(true).x_label("x");
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/test/1d_color_consistency.cpp
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/test/1d_color_consistency.cpp	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/test/1d_color_consistency.cpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -229,9 +229,9 @@
  // my_plot.x_label_units_on(true); // Set
  //	BOOST_CHECK_EQUAL(my_plot.x_label_units_on(), true); // & check.
 
- //	BOOST_CHECK_EQUAL(my_plot.x_major_labels_on(), true); // Check default.
- // my_plot.x_major_labels_on(false); // Set
- //	BOOST_CHECK_EQUAL(my_plot.x_major_labels_on(), false); // & check.
+ //	BOOST_CHECK_EQUAL(my_plot.x_major_value_labels_side(), true); // Check default.
+ // my_plot.x_major_value_labels_side(false); // Set
+ //	BOOST_CHECK_EQUAL(my_plot.x_major_value_labels_side(), false); // & check.
 
  //	BOOST_CHECK_EQUAL(my_plot.title_on(), true); // Check default.
  // my_plot.title_on(false); // Set
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/test/1d_tests.cpp
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/test/1d_tests.cpp	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/test/1d_tests.cpp	2008-01-28 06:04:29 EST (Mon, 28 Jan 2008)
@@ -37,6 +37,17 @@
 #include <string>
   using std::string;
 
+    enum side
+  { 
+    left_side = -1,
+    on_axis = 0,
+    right_side = +1,
+    bottom_side = -1,
+    top_side = +1,
+  };
+
+
+
 BOOST_AUTO_TEST_CASE( test1 )
 {
   // Check on default values and all set and get functions.
@@ -235,11 +246,11 @@
   my_plot.x_label_units_on(true); // Set
          BOOST_CHECK_EQUAL(my_plot.x_label_units_on(), true); // & check.
 
- 	BOOST_CHECK_EQUAL(my_plot.x_major_labels_on(), -1); // Check default.
-  my_plot.x_major_labels_on(0); // Set
- 	BOOST_CHECK_EQUAL(my_plot.x_major_labels_on(), 0); // & check.
-  my_plot.x_major_labels_on(+1); // Set
- 	BOOST_CHECK_EQUAL(my_plot.x_major_labels_on(), +1); // & check.
+ 	BOOST_CHECK_EQUAL(my_plot.x_major_value_labels_side(), left_side); // Check default.
+  my_plot.x_major_value_labels_side(0); // Set
+ 	BOOST_CHECK_EQUAL(my_plot.x_major_value_labels_side(), none); // & check.
+  my_plot.x_major_value_labels_side(+1); // Set
+ 	BOOST_CHECK_EQUAL(my_plot.x_major_value_labels_side(), right_side); // & check.
 
          BOOST_CHECK_EQUAL(my_plot.title_on(), true); // Check default.
   my_plot.title_on(false); // Set