$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: pbristow_at_[hidden]
Date: 2008-01-18 11:09:58
Author: pbristow
Date: 2008-01-18 11:09:57 EST (Fri, 18 Jan 2008)
New Revision: 42846
URL: http://svn.boost.org/trac/boost/changeset/42846
Log:
Minor work but re-commit to ensure latest version is up.
Text files modified: 
   sandbox/SOC/2007/visualization/boost/svg_plot/detail/axis_plot_frame.hpp                            |    48 +-                                      
   sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_style_detail.hpp                           |     4                                         
   sandbox/SOC/2007/visualization/boost/svg_plot/show_2d_settings.hpp                                  |     2                                         
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_1d_plot.hpp                                       |   658 +++++++++++++++++++++++---------------- 
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp                                       |    93 +++--                                   
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_style.hpp                                         |    64 +++                                     
   sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/index.html                                    |     3                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/svg_plot/interface.html                       |     1                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/svg_plot/interface/svg_boxplot_interface.html |     6                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/doc/interface.qbk                                      |     3                                         
   10 files changed, 536 insertions(+), 346 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-18 11:09:57 EST (Fri, 18 Jan 2008)
@@ -523,7 +523,8 @@
           if(derived().legend_on_) // Legend box required.
           {
             derived().outside_legend_on_ = true; // Unless proves to be inside.
-            double spacing = derived().y_label_font_size() * 1.; // Around any legend box - beyond any border.
+            //double spacing = derived().y_label_font_size() * 1.; // Around any legend box - beyond any border.
+            double spacing = derived().y_axis_label_style_.font_size() * 1.; // Around any legend box - beyond any border.
             switch (derived().legend_place_)
             {
             case nowhere:
@@ -1279,6 +1280,28 @@
             return derived().x_ticks_.value_precision_;
           }
 
+          Derived& x_value_ioflags(int flags)
+          { // IO flags of X tick label values (default 0X201).
+            derived().x_ticks_.value_ioflags_ = flags;
+            return derived();
+          }
+
+          int x_value_ioflags()
+          { // ALL stream ioflags for control of format of X value labels.
+            return derived().x_ticks_.value_ioflags_;
+          }
+
+          Derived& x_labels_strip_e0s(bool cmd)
+          {
+            derived().x_ticks_.strip_e0s_ = cmd;
+            return *this;
+          }
+
+          bool y_labels_strip_e0s()
+          {
+            return derived().x_ticks_.strip_e0s_;
+          }
+
           const std::string title()
           {
             return derived().title_info_.text();
@@ -1704,16 +1727,6 @@
             return derived().x_label_info_.style().font_family();
           }
 
-          Derived& x_value_ioflags(int flags)
-          { // IO flags of X tick label values (default 0X201).
-            derived().x_ticks_.value_ioflags_ = flags;
-            return derived();
-          }
-
-          int x_value_ioflags()
-          { // ALL stream ioflags for control of format of X value labels.
-            return derived().x_ticks_.value_ioflags_;
-          }
 
           Derived& title(const std::string title)
           { // Plot title.
@@ -1873,7 +1886,9 @@
           }
 
           Derived& title_font_width(double width)
-          { // width of text is effectively the boldness
+          { // width of text is effectively the boldness.
+            // Not useful with current browsers, setting this may cause lower quality graphic fonts
+            // perhaps because the font is created using graphics rather than a built-in font.
             derived().image.get_g_element(PLOT_TITLE).style().stroke_width(width); 
             return derived();
           }
@@ -1885,14 +1900,13 @@
 
           Derived& legend_color(const svg_color& col)
           {
-            derived().image.get_g_element(PLOT_LEGEND_TEXT).style().fill_color(col);
             derived().image.get_g_element(PLOT_LEGEND_TEXT).style().stroke_color(col);
             return derived();
           }
 
           svg_color legend_color()
-          { // Function legend_color sets both fill and stroke,
-            // but stroke (outside) is considered 'more important'.
+          { // Function legend_color sets only stroke, assuming that 'filled' text is not being used.
+            // (It produces much lower quality fonts on some browsers).
             return derived().image.get_g_element(PLOT_LEGEND_TEXT).style().stroke_color();
           }
 
@@ -1903,12 +1917,12 @@
           }
 
           double legend_font_width()
-          {
+          { // Probably not useful at present (se above).
             return derived().image.get_g_element(PLOT_LEGEND_TEXT).style().stroke_width();
           }
 
           Derived& background_color(const svg_color& col)
-          {
+          { // 
             derived().image.get_g_element(PLOT_BACKGROUND).style().fill_color(col);
             return derived();
           }
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_style_detail.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_style_detail.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_style_detail.hpp	2008-01-18 11:09:57 EST (Fri, 18 Jan 2008)
@@ -28,10 +28,10 @@
 
 // Caution: these two enum and ids must match because
 // the enum value is used to index the array of id strings.
-//  void set_ids() copies all strings to matching image.get_g_element(i).id()
+// void set_ids() copies all strings to matching image.get_g_element(i).id()
 // Add any new id items to both!
 enum plot_doc_structure
-{
+{ // Order control the painting order, later ones overwriting earlier layers.
   PLOT_BACKGROUND = 0, // Must be zero to index array document_ids[]
     PLOT_WINDOW_BACKGROUND, // the smaller plot window (if used).
     PLOT_Y_MINOR_GRID, PLOT_Y_MAJOR_GRID, // 2, 3
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-18 11:09:57 EST (Fri, 18 Jan 2008)
@@ -158,11 +158,11 @@
   // doesn't work - no filename is shown.
   
   cout << "axes_on " << plot.axes_on() << endl;
+  cout << "background_border_width " << plot.background_border_width() << endl;
   cout << "background_border_color " << plot.background_border_color() << endl;
   cout << "background_color " << plot.background_color() << endl;
   cout << "image_border_margin() " << plot.image_border_margin() << endl;
   cout << "image_border_width() " << plot.image_border_width() << endl;
-  cout << "background_border_width " << plot.background_border_width() << endl;
   cout << "coord_precision " << plot.coord_precision() << endl;
   cout << "copyright_date  " << plot.copyright_date() << endl;
   cout << "copyright_holder " << plot.copyright_holder() << endl;
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-18 11:09:57 EST (Fri, 18 Jan 2008)
@@ -12,21 +12,12 @@
 #ifndef BOOST_SVG_SVG_1D_PLOT_HPP
 #define BOOST_SVG_SVG_1D_PLOT_HPP
 
-
-#include <boost/bind.hpp>
-
 #if defined (BOOST_MSVC)
 #  pragma warning (push)
 #  pragma warning (disable: 4512) // "assignment operator could not be generated."
 #  pragma warning (disable: 4180) // qualifier applied to function type has no meaning; ignored
 #endif
 
-// Added disable warning 4180 in Boost.Parameter Sep 2007.
-// See also pbristow trac ticket #1097 complaining about this ;-)
-// trailing const qualifiers are said to be meaningless.
-
-#include <boost/parameter/preprocessor.hpp>
-#include <boost/parameter/name.hpp>
 #include <boost/iterator/transform_iterator.hpp>
 
 #include "svg.hpp"
@@ -34,10 +25,6 @@
 #include "detail/axis_plot_frame.hpp"
 #include "detail/functors.hpp"
 
-#if defined (BOOST_MSVC)
-#  pragma warning(pop)
-#endif
-
 #include <vector>
 #include <ostream>
 #include <sstream>
@@ -49,59 +36,59 @@
 {
 namespace svg
 {
-  #if defined (BOOST_MSVC)
-  #  pragma warning(push)
-  #  pragma warning (disable: 4512) // "assignment operator could not be generated."
-  #  pragma warning (disable: 4180) // qualifier applied to function type has no meaning; ignored
-  #endif
-
-  // -----------------------------------------------------------------
-  // Parameter names for plot() function
-  // -----------------------------------------------------------------
-  #ifndef BOOST_SVG_BOOST_PARAMETER_NAMES
-  #define BOOST_SVG_BOOST_PARAMETER_NAMES
-      BOOST_PARAMETER_NAME(my_plot)
-      BOOST_PARAMETER_NAME(container)
-      BOOST_PARAMETER_NAME(title)
-      BOOST_PARAMETER_NAME(stroke_color)
-      BOOST_PARAMETER_NAME(fill_color)
-      BOOST_PARAMETER_NAME(point_style)
-      BOOST_PARAMETER_NAME(size)
-      BOOST_PARAMETER_NAME(x_functor)
-  #endif
-
-  #if defined (BOOST_MSVC)
-  #  pragma warning(pop)
-  #endif
+  // Forward declarations.
+  const std::string strip_e0s(std::string s); // Strip unncessary zeros and e and sign.
+  class svg_1d_plot; // Plot.
+  class svg_1d_plot_series; // plot data series.
+
+  static const double wh = 0.7; // font text width/height ratio.
+  // Even after reading http://www.w3.org/TR/SVG/fonts.html, unclear how to
+  // determine the exact width of digits, so an 
+  // arbitrary average width height ratio wh = 0.7 is used as a good approximation.
+
+  static const double sin45 = 0.707; // Use if axis value labels are sloping.
+
+  // x_axis_position_ and y_axis_position_  use these.
+  enum x_axis_intersect {bottom = -1, x_intersects_y = 0, top = +1};
+  // bottom = X-axis free below bottom of end of Y-axis (case of all Y definitely < 0).
+  // top = X-axis free above top of X-axis (case of all Y definitely > 0).
+  // x_intersects_y when Y values include zero, so X intersects the Y axis.
+
+  enum y_axis_intersect {left = -1, y_intersects_x = 0, right = +1};
+  // left = Y-axis free to left of end of X-axis (case of all X definitely < 0).
+  // right = Y-axis free to left of end of X-axis (case of all X definitely > 0).
+  // y_intersects_x when X values include zero, so intersects the X axis.
 
-// -----------------------------------------------------------------
+ // -----------------------------------------------------------------
 // This allows us to store plot state locally in svg_plot. We don't
 // store it in "svg" because transforming the points after they are
 // written to the document would be difficult. We store the Cartesian
 // coordinates locally and transform them before we write them.
 // -----------------------------------------------------------------
-struct svg_plot_series
+class svg_1d_plot_series
 {
+public:
   std::vector<double> series; // Normal 'OK to plot' data values.
   std::vector<double> series_limits; // 'limit' values: too big, too small or NaN.
 
-  std::string title; // title of data series (to show on legend).
-  plot_point_style point_style; // circle, square...
+  std::string title_; // title of data series (to show on legend).
+  plot_point_style point_style_; // circle, square...
+  plot_point_style limit_point_style_;
+  plot_line_style line_style_; // No line style for 1-D, only for 2-D.
 
   // -------------------------------------------------------------
   // Scan each data point between the iterators that are passed,
   // sorting them into the correct std::vector, normal or not.
   // -------------------------------------------------------------
-  template <class T>
-  svg_plot_series(T begin, T end, const std::string& title, const plot_point_style& style)
+  template <class T> // T an STL container: array, vector ...
+  svg_1d_plot_series(T begin, T end, const std::string& title, const plot_point_style& style)
     :
-  title(title),
-  point_style(style)
-  // No line style for 1-D, only for 2-D.
-    // No defaults for begin and end.
+  title_(title),
+  point_style_(style),
+  line_style_  // Meaning of line style for 1-D as yet undefined?
   {
     for(T i = begin; i != end; ++i)
-    {
+    {  // No defaults for begin and end.
       double temp = *i;
       if(detail::is_limit(temp))
       {
@@ -113,106 +100,149 @@
       }
     }
   } // svg_plot_series
+
+  // Set functions for the plot series.
+  svg_1d_plot_series& fill_color(const svg_color& col_)
+  {
+    point_style_.fill_color_ = col_;
+    return *this;
+  }
+
+  svg_1d_plot_series& stroke_color(const svg_color& col_)
+  {
+    point_style_.stroke_color_ = col_;
+    return *this;
+  }
+
+  svg_1d_plot_series& shape(point_shape shape_)
+  {
+    point_style_.shape_ = shape_;
+    return *this;
+  }
+
+  svg_1d_plot_series& size(int size_)
+  {
+    point_style_.size_ = size_;
+    return *this;
+  }
+
+  svg_1d_plot_series& line_color(const svg_color& col_)
+  {
+    line_style_.color_ = col_;
+    return *this;
+  }
+
+  svg_1d_plot_series& line_width(double wid_)
+  { // Doesn't have desired effect yet.
+    line_style_.width_ = wid_;
+    return *this;
+  }
+
+  // Get functions for the plot series.
+  double line_width()
+  {
+    return line_style_.width_;
+  }
+
+  svg_1d_plot_series& line_on(bool on_)
+  {
+    line_style_.line_on_ = on_;
+    return *this;
+  }
+
+  svg_1d_plot_series& bezier_on(bool on_)
+  {
+    line_style_.bezier_on_ = on_;
+    return *this;
+  }
+
+  bool bezier_on()
+  {
+    return line_style_.bezier_on_;
+  }
 }; //     struct svg_plot_series()
 
 class svg_1d_plot : public detail::axis_plot_frame<svg_1d_plot>
-{
+{ // See also svg_2d_plot.hpp for 2-D version.
+  friend void show_plot_settings(svg_1d_plot&);
+  friend class detail::axis_plot_frame<svg_1d_plot>;
+
  protected:
-  // Stored so as to avoid rewriting style information constantly.
-  svg image;
+  // Where we will be storing the data points for transformation.
+  std::vector<svg_1d_plot_series> series;
+  // These are sorted into two vectors for normal and abnormal (max, inf and NaN).
+
+  svg image; // Stored so as to avoid rewriting style information constantly.
+
+  // Member data names conventionally end with _.
+
+  double x_scale_; // Used for transform from Cartesian to SVG coordinates.
+  double x_shift_; // SVG origin is top left, Cartesian is bottom right.
+  double y_scale_;
+  double y_shift_;
+
+  double text_margin_; // Marginal space around text items like title,
+  // text_margin_ * font_size to get distance in svg units
+
+  text_style a_style_; // Defaults.
+  // text_style contains font size & type etc.
+  text_style title_style_;
+  text_style legend_style_;
+  text_style x_axis_label_style_;
+  text_style y_axis_label_style_;
+  text_style x_value_label_style_;
+  text_style y_value_label_style_; // Not used?
+  text_style point_symbols_style_; // Used for data point marking.
 
   text_element title_info_; // Title of whole plot.
-  text_element legend_header; // legend box header (if any).
+  text_element legend_header_; // legend box header or title (if any).
   text_element x_label_info_; // Example: "length of widget"
+  text_element x_label_value_; // For example: "1.2" or "1.2e+001"
   text_element x_units_info_; // For example, to display, "length (meter)"
   // No Y-axis info for 1D.
-  // Note that text_elements hold font_size.
+  // Note that text_elements hold font_size, bold, italic...
 
   // Border information for the plot window (not the full image size).
-  // Allows for title and legend to be separate.
-  // Initially set to the width and height of the image.
-  // TODO Should this be unsigned int??? to be consistent.
-  int plot_left_; // calculate_plot_window() sets these values.
-  int plot_top_;
-  int plot_right_;
-  int plot_bottom_;
-
-  // X-Axis information.
-  unsigned int x_major_tick_length_; // pixels.
-  unsigned int x_major_tick_width_; // pixels.
-  unsigned int x_minor_tick_length_; // pixels.
-  unsigned int x_minor_tick_width_; // pixels.
-  // Avoid name clash with x_m*_tick_length and width.
-  unsigned int x_num_minor_ticks_; // number of minor ticks, eg 4 gives major 0, minor 1,2,3,4, major 5
-  // grid width is also set in style.stroke_width()
-  // TODO Not sure it is wise to store in two places?
-  unsigned int x_major_grid_width_; // pixels.
-  unsigned int x_minor_grid_width_; // pixels.
-  //unsigned int x_major_label; // pixels. Now in x_units_info_ font size
+  box_style image_border_; // rectangular border of all image width, color...
+  box_style plot_window_border_; // rectangular border of plot window width, color...
 
-  // Other information.
-  double text_margin_; // Marginal space around text items like title,
-  // as a fraction of font size, (pixels) (was fixed at 1.5).
-  int border_margin_; // Marginal (pixels) space around the plot border.
-    // text width is effectively the boldness of the font.
-  // 0 is default, 1 is bolder, 2 very bold...
-  // TODO SVG has also a not yet implemented boldness.
-  double title_width_; 
-  double legend_width_;
-  double legend_left_; // Left of legend box. (Optionally set by legend_position).
-  double legend_top_; // Top of legend box.
+  double plot_left_; // calculate_plot_window() sets these values.
+  double plot_top_;
+  double plot_right_;
+  double plot_bottom_;
+
+  // enum legend_places{ nowhere, inside...}
+  legend_places legend_place_; // Place for any legend box.
+  double legend_width_; // Width of legend box (pixels).
+  double legend_height_; // Height of legend box (in pixels).
   // Size of legend box is controlled by its contents,
-  // but may be helpful to store bottom right coordinates.
-  // legend_bottom_right() gives access.
-  double legend_right_; // right of legend box.
+  // but helpful to store computed coordinates.
+  double legend_left_; // Left of legend box.
+  double legend_top_; // Top of legend box.
+  // Both optionally set by legend_top_left.
+  double legend_right_; // SVG Coordinates of right of legend box,
   double legend_bottom_; // bottom of legend box.
+  size_t legend_longest_; // longest (both header & data) string in legend box,
 
-  // X-Axis information.
-  // (Y_axis stored as one point because this is a 1D graph).
-  double x_min_; // minimum x (Cartesian units).
-  double x_max_; // maximum x  (Cartesian units).
-  double x_axis_; // stroke width (pixels). ????
-  double x_major_interval_; // Interval (Cartesian units) between major ticks.
-    // set/get by x_major_interval
-  double x_minor_interval_; // Interval (Cartesian units) between minor ticks.
-  // because x_num_minor_ticks_ used to determine this instead,
-  // but one could calculate x_minor_interval_.
-
-  // Yes/no options.
-  bool title_on_; // Show plot title.
-  bool legend_on_; // Show legend box.
-  bool use_plot_window; // rather than whole image.
-  bool use_x_axis_line_; // = x_axis_on()
-  bool use_y_axis_line_; // Note: is needed in 1D version too in draw_axes.
-  bool use_x_major_labels; // For example, to show value (like 1.2) by major ticks.
-  //bool use_x_minor_labels; // For example, to show value (like 1.2) by minor ticks.
-  // Not yet implemented (doubt if needed).
-  bool use_x_label_units;  // For example, to show, "length (meter)"
-  bool use_x_major_grid; // provide major vertical lines.
-  bool use_x_minor_grid;// provide minor vertical lines.
-  bool use_x_label; // Show label text for the axis, like "X-axis"
-  bool up_ticks_on_; // ticks only up from Y = 0 horizontal X-axis.
-  bool down_ticks_on_;// ticks only down from Y = 0 horizontal X-axis.
-  //bool left_ticks_on_; // only for 2D.
-  //bool right_ticks_on_;
-  bool x_ticks_on_; // = up_ticks_on_ || down_ticks_on_
-  // bool y_ticks_on_; // = left_ticks_on_ || right_ticks_on_ only for 2-D
- // Note: can have ticks both up and down (the original style).
-  bool use_x_ticks_on_plot_window_; // rather than on Y = 0 horizontal axis.
-  bool legend_lines_; // set by legend_lines(bool); // Not really useful for 1-D,
-  // TODO but needs Boost-Parameter removed to do properly.
+  axis_line_style x_axis_;
+  axis_line_style y_axis_;
 
-private:
-  friend class detail::axis_plot_frame<svg_1d_plot>;
+  ticks_labels_style x_ticks_;
+  ticks_labels_style y_ticks_; // Added to permit shared code!
 
-  // Where we will be storing the data points for transformation.
-  std::vector<svg_plot_series> series;
-  // These are sorted into two vectors for normal and abnormal (max, inf and NaN).
-
-  double x_scale_; // Used for transform from Cartesian to SVG coordinates.
-  double x_shift_; // SVG origin is top left, Cartesian is bottom right.
-  double y_scale_;
-  double y_shift_;
+  bool title_on_; // Provide a title for the whole plot.
+  bool legend_on_; // Provide a legend box. 
+  bool outside_legend_on_; // legend box outside the plot window.
+  bool legend_lines_; // get/set by legend_lines(bool); data colored line type in legend box.
+  bool plot_window_on_; // Use a separate plot window (not whole image).
+  bool x_ticks_on_; // TODO check these are really useful.
+  int x_axis_position_; // TODO should these be in axis_style?
+  std::string plot_window_clip_; // = "clip_plot_window" id for clippath
+  // http://www.w3.org/TR/SVG/masking.html#ClipPathElement 14.1 Introduction
+  // clipping paths, which uses any combination of 'path', 'text' and basic shapes
+  // to serve as the outline where everything on the "inside" of the outline
+  // is allowed to show through but everything on the outside is masked out.
+  // So the plot_window_clip_ limits display to a plot_window rectangle.
 
   // Public member functions, defined below.
   // void calculate_transform(); //
@@ -222,55 +252,51 @@
   // void set_ids();
 
 public:
-  svg_1d_plot() : // Default constructor.
+  svg_1d_plot()
+    : // Default constructor.
     // Many ( but not all - see below) default values here.
-    title_info_(0, 0, "Plot of data", 20, "Verdana", "", "", "", "", center_align, horizontal),
-    legend_header(0, 0, "Legend", 16, "Arial", "", "", "", "", center_align, horizontal),
-    x_label_info_(0, 0, "X Axis", 14, "Lucida Sans Console", "", "", "", "", center_align, horizontal), //
-    x_units_info_(0, 0, "(units)", 14, "Lucida Sans Console", "", "", "", "", right_align, horizontal),
-    //x_units_info_(0, 0, "(units)", 14, "Times New Roman", "italic", "bold", "wider", "underline", right_align, horizontal),
-    text_margin_(2.), // for text was 1.5 // as a fraction of the font size.
-    border_margin_(5), // Prevent plot window box begin right on edge.
-    legend_left_(-1), legend_right_(-1),legend_top_(-1),legend_bottom_(-1), // Indicates not yet set.
+    text_margin_(2.), // for text was 1.5 // as a multiplier of the font size.
 
-    x_min_(-10), x_max_(10),
+    title_style_(16, "Verdana", "", ""),  // last "bold" ?
+    legend_style_(14, "Verdana", "", ""), // 2nd "italic"?
+    x_axis_label_style_(14, "Verdana", "", ""),
+    x_value_label_style_(12, "Verdana", "", ""),
+    point_symbols_style_(12, "Lucida Sans Unicode"), // Used for data point marking.
+
+    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),
+    x_label_value_(0, 0, "", x_value_label_style_, center_align, horizontal),
+    x_axis_(X, -10., +10., black, 1, 0, true, false, true),
+    // Might fill in all values, but there are rather many for ticks_labels_style,
+    x_ticks_(X),// so for defaults see ticks_labels_style.
+    image_border_(yellow, white, 2, 10, true, true), // margin should be about axis label font size.
+    plot_window_border_(yellow, svg_color(255, 255, 255), 2, 3, true, false),
+    legend_header_(0, 0, "", legend_style_, center_align, horizontal),
+    legend_width_(200), // width of legend box (pixels) // TODO isn't this calculated?
+    legend_height_(0), // height of legend box (pixels)
+    legend_left_(-1), legend_right_(-1),legend_top_(-1),legend_bottom_(-1), // Default top left of plot window.
+    legend_place_(outside_right), // default but interacts with using plot_window.
     legend_on_(false),
+    legend_longest_(0),
+    outside_legend_on_(true),
+    plot_window_clip_("plot_window"), // for <clipPath id="plot_window" ...
     title_on_(true),
-    use_plot_window(false),
-    use_x_label(false), // Label like "volume".
-    use_x_label_units(false),
-    use_x_major_labels(true), // Values on major ticks.
-    x_major_grid_width_(3),
-    x_minor_grid_width_(1),
-    up_ticks_on_(false),
-    down_ticks_on_(true),
-    use_x_ticks_on_plot_window_(false), // was external_style
-    // use_y_ticks_on_plot_window_(false), // was external_style
-    x_ticks_on_(true), // up_ticks_on_ || down_ticks_on_
-    // 2D has left and right ticks too.
-    legend_lines_(true),
-    use_x_major_grid(false),
-    // x_minor_grid_width(1),
-    use_x_minor_grid(false),
-    use_x_axis_line_(true),
-    use_y_axis_line_(false), // Not needed for 1D, but leave at false.
-    x_major_interval_(2), // interval between x major ticks
-    x_major_tick_width_(3),
-    x_minor_tick_width_(1),
-    x_major_tick_length_(10), // If both up and down, total is twice this.
-    x_minor_tick_length_(5), // If both up and down, total is twice this.
-    x_num_minor_ticks_(2),
-    // legend_title_size(12), TD remove - now in text_element
-    x_scale_(1.), x_shift_(0),
-    y_scale_(1.), y_shift_(0)
+    plot_window_on_(true),
+    // Used to transform Cartesian to SVG.
+    x_scale_(1.), x_shift_(0.),
+    y_scale_(1.), y_shift_(0.),
+    x_axis_position_(0) // Move into axis_style? 
+
   // See documentation for default settings rationale.
   {
     image_size(500, 200); // Default image size.
     // Only need to be quite shallow (y_size) for a 1-D plot.
     // 200 barely leaves enough room for five data series in the legend).
     // (2-D usually needs to be much more rectangular).
-    x_ticks_on_ = up_ticks_on_ || down_ticks_on_;
-    // Only 2D has left and right ticks.
+
+
+    using namespace boost::svg::detail; // avoid detail::
 
     // Build the document tree & add all the children of the root node.
     for(int i = 0; i < detail::SVG_PLOT_DOC_CHILDREN; ++i)
@@ -278,22 +304,154 @@
       image.add_g_element();
     }
 
-    // Set stroke color & width defaults.
-    image.get_g_element(detail::PLOT_BACKGROUND).style().fill_color(white);
-    //image.get_g_element(detail::PLOT_Y_AXIS).style().stroke_color(black); TODO needed? Harmful?
-    image.get_g_element(detail::PLOT_X_AXIS).style().stroke_color(black);
-    image.get_g_element(detail::PLOT_X_MAJOR_TICKS).style().stroke_color(black).stroke_width(x_major_tick_width_);
-    image.get_g_element(detail::PLOT_X_MINOR_TICKS).style().stroke_color(black).stroke_width(x_minor_tick_width_);
-    image.get_g_element(detail::PLOT_X_MAJOR_GRID).style().stroke_color(blue); // TODO temporary cyan is good.
-    image.get_g_element(detail::PLOT_X_MAJOR_GRID).style().stroke_width(x_major_grid_width_);
-    image.get_g_element(detail::PLOT_X_MINOR_GRID).style().stroke_color(cyan);
-    image.get_g_element(detail::PLOT_X_MINOR_GRID).style().stroke_width(x_minor_grid_width_);
-    image.get_g_element(detail::PLOT_LIMIT_POINTS).style().stroke_color(lightgray).fill_color(whitesmoke);
+    // Set other SVG color, stroke & width defaults for various child PLOT nodes.
+    image.get_g_element(PLOT_BACKGROUND).style().fill_color(image_border_.fill_);
+    image.get_g_element(PLOT_BACKGROUND).style().stroke_color(image_border_.stroke_);
+    image.get_g_element(PLOT_BACKGROUND).style().stroke_width(image_border_.width_); //
+    image.get_g_element(PLOT_WINDOW_BACKGROUND).style().fill_color(plot_window_border_.fill_);
+    image.get_g_element(PLOT_WINDOW_BACKGROUND).style().stroke_width(plot_window_border_.width_).stroke_color(plot_window_border_.stroke_);
+    image.get_g_element(PLOT_LIMIT_POINTS).style().stroke_color(lightslategray).fill_color(antiquewhite);
+    image.get_g_element(PLOT_X_AXIS).style().stroke_color(black).stroke_width(x_axis_.width());
+    image.get_g_element(PLOT_X_LABEL).style().fill_color(black);
+    image.get_g_element(PLOT_VALUE_LABELS).style().fill_color(black);
+    image.get_g_element(PLOT_LEGEND_TEXT).style().fill_color(black);
+    image.get_g_element(PLOT_TITLE).style().fill_color(black).stroke_on(false);
 
+    // Note that widths are stored in member data *and* copied here.
+    // Not sure if this is wise but ...
     // Font info defaults are set by the constructor above.
+    // Ticks
+    if(x_ticks_.use_up_ticks() || x_ticks_.use_down_ticks())
+    {
+      image.get_g_element(PLOT_X_MAJOR_TICKS).style().stroke_width(x_ticks_.major_tick_width_).stroke_color(black);
+      image.get_g_element(PLOT_X_MINOR_TICKS).style().stroke_width(x_ticks_.minor_tick_width_).stroke_color(black);
+    }
+    // Grids.
+    // Default color & width for grid, used or not.
+    image.get_g_element(PLOT_X_MAJOR_GRID).style().stroke_width(x_ticks_.major_grid_width_).stroke_color(svg_color(200, 220, 255));
+    BOOST_ASSERT(image.get_g_element(PLOT_X_MAJOR_GRID).style().stroke_color() == svg_color(200, 220, 255));
+    image.get_g_element(PLOT_X_MINOR_GRID).style().stroke_width(x_ticks_.minor_grid_width_).stroke_color(svg_color(200, 220, 255));
+    //image.get_g_element(PLOT_DATA_LINES).style().stroke_width(2); // default width.
+    // Alter with plot.data_lines_width(4); 
+
+    legend_place_ = (plot_window_on_) ? outside_right : inside; // Defaults.
+    // Note if set plot_window_on() then also need to set legend_place.
+    // (if set a default in plot_window then call to set legend place must to come *after* it.
+    // So not set a default?  But leaving it as inside is worse?)
 
+    x_ticks_on_ = x_ticks_.up_ticks_on_ || x_ticks_.down_ticks_on_;
+    // Only 2D has left and right ticks.
     set_ids();
-  } // svg_1d_plot()
+  } // svg_1d_plot() Default constructor.
+
+    
+  void calculate_plot_window()
+  { // For 1-D
+    // All calculation use svg units, pixels by default.
+
+    // Start by assuming we can use all the svg image,
+    // but reduce by the width of any image border.
+    plot_left_ = 0 + image_border_width(); // Top left of image.
+    plot_top_ = 0 + image_border_width();
+    plot_right_ = image.x_size() - image_border_width(); // Bottom right of image.
+    plot_bottom_ = image.y_size() - image_border_width();
+
+    if(title_on_)
+    { // Leave space at top for title.
+      // TODO what if want to put title at bottom?
+      plot_top_ += title_font_size() * (text_margin_ + 0.5);
+    }
+
+    size_legend_box(); // depending on its contents.
+    place_legend_box();
+    // 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_);
+    }
+
+    x_axis_.axis_ = (plot_bottom_ + plot_top_) / 2.; // Put X-axis halfway up plot window.
+
+    if(plot_window_on_)
+    { // Needed to allow any plot window border rectangle to show OK.
+      // A small margin is to prevent it overlapping the image border.
+      // Also allows for axis value labels that mark the min and max
+      // that must extend half a font width beyond the plot window border.
+      plot_left_ +=  image_border_.margin_;
+      plot_right_ -=  image_border_.margin_;
+      plot_top_ += image_border_.margin_;
+      plot_bottom_ -=  image_border_.margin_;
+
+      // Calculate the number of chars of the longest value label.
+      x_ticks_.longest_label();
+      double x_label_length_ = 0; // Work out the longest value label for X-Axis.
+      if (x_ticks_.label_rotation_ == horizontal)
+      { // Only 1 char height & 1 space needed if labels are horizontal.
+        x_label_length_ = 2 * x_value_label_style_.font_size() * wh; // SVG chars
+      } 
+      else if ((x_ticks_.label_rotation_ == upward) || (x_ticks_.label_rotation_ == downward))
+      { // ! horizontal so will need more than 2 chars worth.
+          x_label_length_+= x_ticks_.label_max_chars_ * x_value_label_style_.font_size() * wh; // SVG chars.
+      }
+      else
+      { // Assume label is sloping, say 45, so * sin(45) = 0.707.
+          x_label_length_+= x_ticks_.label_max_chars_ * x_value_label_style_.font_size() * wh * sin45; // SVG 'chars'.
+      }
+
+      if (x_ticks_.major_value_labels_on_ != 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.
+        {  // 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.
+        { // 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
+
+      // Make space for any ticks.
+      if(x_ticks_.down_ticks_on_)
+      { // Start bottom of plot higher to give space for any external down ticks.
+        plot_bottom_ -= (std::max)(x_ticks_.major_tick_length_, x_ticks_.minor_tick_length_);// Avoid macro max trap!
+      }
+      if (x_axis_.axis_line_on_)
+      { // Want a X-axis line, so check if range includes zero, so axes intersect,
+        // 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.
+        { // 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.
+        { // // 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.
+        }
+        else
+        { // y_axis_position_ == y_intersects_x
+          // Calculate below after transform is calculated.
+        }
+      } // if (use_x_axis_line_)
+
+    } // plot_window_on_
+
+    if(plot_window_on_)
+    {
+      // Draw plot window rect.
+      image.get_g_element(detail::PLOT_WINDOW_BACKGROUND).push_back(
+        new rect_element(plot_left_, plot_top_, (plot_right_ - plot_left_), plot_bottom_ - plot_top_));
+    } // plot_window_on_
+  } //  void calculate_plot_window()
+
 
   //void calculate_transform()
   //{ // Calculate scale and shift factors for transform from Cartesian to plot.
@@ -311,17 +469,17 @@
     double y2(image.y_size());
     transform_x(x);
     // Draw origin, making sure it is in the plot window.
-    if(use_x_axis_line_ && (x > plot_left_) && (x < plot_right_))
-    { // TODO >= and <= ? instead.
-      if(!use_plot_window)
+    if(x_axis_.axis_line_on_ && (x >= plot_left_) && (x <= plot_right_))
+    { 
+      if(!plot_window_on_)
       { // Use whole image.
         if(title_on_)
         { // Allow space for title, taking account of font size.
-          y1 += title_info_.font_size() * (text_margin_ +1);
+          y1 += title_info_.style().font_size() * text_margin_;
         }
-        if(use_x_label)
+        if(x_axis_.label_on_)
         {// Allow space for x tick values, taking account of font size.
-          y2 -= x_label_info_.font_size() * text_margin_;
+          y2 -= x_label_info_.style().font_size() * text_margin_;
         }
       }
       else
@@ -334,46 +492,6 @@
     draw_x_axis();
   } //  draw_axes()
 
-  void calculate_plot_window()
-  { // For 1-D
-    x_axis_ = (plot_bottom_ + plot_top_) / 2.; // Put X-axis halfway up plot window.
-    plot_left_ = 0; // Top left of image.
-    plot_top_ = 0;
-    plot_right_ = image.x_size(); // Bottom right of image.
-    plot_bottom_ = image.y_size();
-
-    if(use_plot_window)
-    {
-      plot_left_ += border_margin_; // small margin around border.
-      plot_right_ -= border_margin_; //
-      plot_top_ += border_margin_; //
-      plot_bottom_ -= border_margin_;
-
-      if(title_on_)
-      { // Allow a blank line, title lines and a line space.
-        plot_top_ += title_font_size() * 2;
-      }
-      if(legend_on_)
-      { // Allow space for legend at right.
-        plot_right_ -= 150;  // This 150 is an arbitrary legend box width.
-        // TODO size could depend on font_size & length of text?
-      }
-      if(use_x_label)
-      {// Allow space for x_label at bottom.
-        plot_bottom_ -= static_cast<int>(x_label_info_.font_size() * text_margin_);
-      }
-      if(down_ticks_on_)
-      { // Allow space for the downward ticks
-        // (so don't go into/over the border margin).
-        plot_bottom_ -= (std::max)(x_major_tick_length_, x_minor_tick_length_)
-      }
-      // Draw plot window rect.
-      image.get_g_element(detail::PLOT_WINDOW_BACKGROUND).push_back(
-        new rect_element(plot_left_, plot_top_, (plot_right_ - plot_left_), plot_bottom_ - plot_top_));
-      // <g id="plotBackground" fill="rgb(248,248,255)"><rect x="43" y="53" width="302" height="304"/></g>
-    } // use_plot_window
-  } //  void calculate_plot_window()
-
   void update_image()
   {
     // Removes all elements that will show up in a subsequent draw.
@@ -386,7 +504,7 @@
     calculate_plot_window();
     //calculate_transform();
     draw_title(); // Call after above to the plot_x and y are defined.
-    if(use_x_axis_line_)
+    if(x_axis_.axis_line_on_)
     {
       draw_axes();
     }
@@ -394,7 +512,7 @@
     {
       draw_legend();
     }
-    if(use_x_label)
+    if(x_axis_.label_on_)
     {
       draw_x_label();
     }
@@ -404,18 +522,18 @@
     { // For each of the data series.
       g_element& g_ptr = image.get_g_element(detail::PLOT_DATA_POINTS).add_g_element();
 
-      g_ptr.style().stroke_color(series[i].point_style_.stroke_color);
-      g_ptr.style().fill_color(series[i].point_style_.fill_color);
+      g_ptr.style().stroke_color(series[i].point_style_.stroke_color_);
+      g_ptr.style().fill_color(series[i].point_style_.fill_color_);
 
       for(unsigned int j = 0; j < series[i].series.size(); ++j)
       { // Draw points for jth series.
         double x = series[i].series[j];
         transform_x(x);
         if( // Check point is inside plot_window (otherwise ignore it).
-             (x > plot_left_) // TODO <=?
-          && (x < plot_right_)
-          && (y > plot_top_)
-          && (y < plot_bottom_) )
+             (x >= plot_left_)
+          && (x <= plot_right_)
+          && (y >= plot_top_)
+          && (y <= plot_bottom_) )
         {
           draw_plot_point(x, y, g_ptr, series[i].point_style_);
         }
@@ -464,50 +582,38 @@
     image.write(s_out);
     return (svg_1d_plot&)*this;
   }
+  
+  template <class T>
+  svg_1d_plot_series& plot(const T& container, const std::string& title)
+  {
+    series.push_back(
+      svg_1d_plot_series(
+      boost::make_transform_iterator(container.begin(), detail::boost_default_convert()),
+      boost::make_transform_iterator(container.end(), detail::boost_default_convert()),
+      title)
+    );
+    return series[series.size()-1];
+  }
 
-  //
-  #if defined (BOOST_MSVC)
-  #  pragma warning(push) // disable warnings in Boost.parameter
-  // (delete this and pop below if not used in future.)
-  #  pragma warning (disable: 4100) // 'args' : unreferenced formal parameter
-  #endif
-
-  BOOST_PARAMETER_MEMBER_FUNCTION
-    (
-    (void),
-    plot,
-    tag,
-    (required
-    (container, *)
-    (title, (const std::string&))
-    )
-    (optional
-    (stroke_color, (const svg_color&), svg_color(white))
-    (point_style, (point_shape), round)
-    (size, (int), 10)
-    (x_functor, *, detail::boost_default_convert())
-    )
-    (deduced
-    (optional
-    (fill_color, (const svg_color&), svg_color(black))
-    )
-    )
-    )
-  {
-    series.push_back(svg_plot_series(
-      boost::make_transform_iterator(container.begin(), x_functor),
-      boost::make_transform_iterator(container.end(),   x_functor),
-      title,
-      plot_point_style(stroke_color, fill_color, size, point_style)
-      ));
-  }
-
-  #if defined (BOOST_MSVC)
-  #  pragma warning(pop)
-  #endif
+  template <class T, class U>
+  svg_1d_plot_series& plot(const T& container, const std::string& title, U functor)
+  { // Version with functor.
+    series.push_back(
+      svg_1d_plot_series(
+      boost::make_transform_iterator(container.begin(), functor),
+      boost::make_transform_iterator(container.end(),   functor),
+      title)
+    );
+    return series[series.size()-1];
+  }
 
 }; // end svg_1d_plot
 
+#if defined (BOOST_MSVC)
+#  pragma warning(pop)
+#endif
+
+
 } // namespace svg
 } // namespace boost
 
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-18 11:09:57 EST (Fri, 18 Jan 2008)
@@ -44,7 +44,7 @@
 
     static const double wh = 0.7; // font text width/height ratio.
     // Even after reading http://www.w3.org/TR/SVG/fonts.html, unclear how to
-    // determine the exact width of digits, so an 
+    // determine the exact width of digits, so an
     // arbitrary average width height ratio wh = 0.7 is used as a good approximation.
 
     static const double sin45 = 0.707; // Use if axis value labels are sloping.
@@ -106,7 +106,6 @@
       } // svg_2d_plot_series
 
       // Set functions for the plot series.
-      // TODO get functions for completeness?
       svg_2d_plot_series& fill_color(const svg_color& col_)
       {
         point_style_.fill_color_ = col_;
@@ -143,6 +142,7 @@
         return *this;
       }
 
+      // Get functions for the plot series.
       double line_width()
       {
         return line_style_.width_;
@@ -166,7 +166,7 @@
       }
 
     }; // struct svg_2d_plot_series
- 
+
     class svg_2d_plot : public detail::axis_plot_frame<svg_2d_plot>
     { // See also svg_1d_plot.hpp for 1-D version.
      friend void show_plot_settings(svg_2d_plot&);
@@ -238,7 +238,7 @@
       ticks_labels_style y_ticks_;
 
       bool title_on_; // Provide a title for the whole plot.
-      bool legend_on_; // Provide a legend box. 
+      bool legend_on_; // Provide a legend box.
       bool outside_legend_on_; // legend box outside the plot window.
       bool legend_lines_; // get/set by legend_lines(bool); data colored line type in legend box.
       bool plot_window_on_; // Use a separate plot window (not whole image).
@@ -294,7 +294,7 @@
         legend_width_(200), // width of legend box (pixels) // TODO isn't this calculated?
         legend_height_(0), // height of legend box (pixels)
         legend_left_(-1), legend_right_(-1),legend_top_(-1),legend_bottom_(-1), // Default top left of plot window.
-        legend_place_(outside_right), // default but interacts with using plot_window
+        legend_place_(outside_right), // default but interacts with using plot_window.
         legend_on_(false),
         legend_longest_(0),
         outside_legend_on_(true),
@@ -304,7 +304,7 @@
         // Used to transform Cartesian to SVG.
         x_scale_(1.), x_shift_(0.),
         y_scale_(1.), y_shift_(0.),
-        x_axis_position_(0), // TODO move into axis_style? 
+        x_axis_position_(0), // TODO move into axis_style?
         y_axis_position_(0) // But some problems with this.
       {
         image_size(500, 400); // Default image size for 2-D.
@@ -357,7 +357,7 @@
         image.get_g_element(PLOT_Y_MAJOR_GRID).style().stroke_width(y_ticks_.major_grid_width_).stroke_color(svg_color(200, 220, 255));
         image.get_g_element(PLOT_Y_MINOR_GRID).style().stroke_width(y_ticks_.minor_grid_width_).stroke_color(svg_color(200, 220, 255));
         image.get_g_element(PLOT_DATA_LINES).style().stroke_width(2); // default width.
-        // Alter with plot.data_lines_width(4); 
+        // Alter with plot.data_lines_width(4);
 
         legend_place_ = (plot_window_on_) ? outside_right : inside; // Defaults.
         // Note if set plot_window_on() then also need to set legend_place.
@@ -367,16 +367,15 @@
         x_ticks_on_ = x_ticks_.up_ticks_on_ || x_ticks_.down_ticks_on_;
         y_ticks_on_ = y_ticks_.left_ticks_on_ || y_ticks_.right_ticks_on_;
 
-        // title_info_.style().font_size(20);
       } // svg_2d_plot() default constructor.
 
     private:
       // svg_2d_plot Member Functions.
 
-      void set_ids()  // TODO is this only used once in constructor and should be inline?
+      void set_ids()  // This only used once in constructor and should be inlined.
       { // document ids for use in <g id = "PLOT_TITLE".../>
         for(int i = 0; i < detail::SVG_PLOT_DOC_CHILDREN; ++i)
-        {
+        {	// Order determines the painting order.
           image.get_g_element(i).id(detail::document_ids[i]);
         }
       } //  void set_ids()
@@ -406,8 +405,8 @@
           plot_top_ += title_font_size() * (text_margin_ + 0.5);
         }
 
-       size_legend_box(); // depending on its contents.
-       place_legend_box();
+       size_legend_box(); // Size depends on its contents.
+       place_legend_box(); // according to options chosen.
        // Assume that axis labels are always at bottom and left.
        if(x_axis_.label_on_)
        { // Leave space at bottom for X axis label.
@@ -438,7 +437,7 @@
         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_plot_window_on_ = +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).
@@ -454,7 +453,7 @@
           y_ticks_.ticks_on_plot_window_on_ = +1; // right = true;
         }
 
-        // Calculate the lengths of the longest value labels.
+        // Calculate the number of chars of the longest value labels.
         x_ticks_.longest_label();
         y_ticks_.longest_label();
 
@@ -493,7 +492,7 @@
           // 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_on(int d)
           // to set tick value labels to left (<0), none (==0) or right (>0).
           else
           { // no labels on plot window (may be on mid-plot Y-axis).
@@ -504,7 +503,7 @@
         if (x_ticks_.label_rotation_ == horizontal)
         { // Only 1 char height & 1 space needed if labels are horizontal.
           x_label_length_ = 2 * x_value_label_style_.font_size() * wh; // SVG chars
-        } 
+        }
         else if ((x_ticks_.label_rotation_ == upward) || (x_ticks_.label_rotation_ == downward))
         { // ! horizontal so will need more than 2 chars worth.
             x_label_length_+= x_ticks_.label_max_chars_ * x_value_label_style_.font_size() * wh; // SVG chars.
@@ -521,7 +520,7 @@
           {  // 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) // 
+          else if ((x_ticks_.ticks_on_plot_window_on_ > 0) //
              && (x_ticks_.major_value_labels_on_ > 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.
@@ -541,7 +540,7 @@
           plot_bottom_ -= (std::max)(x_ticks_.major_tick_length_, x_ticks_.minor_tick_length_);// Avoid macro max trap!
         }
 
-        if (x_axis_.axis_line_on_) 
+        if (x_axis_.axis_line_on_)
         { // Want a X-axis line, so check if range includes zero, so axes intersect,
           // and x_axis_ is svg coordinate of Y-axis (usually y = 0).
           // If not fix axis to bottom of the plot window.
@@ -555,15 +554,15 @@
             && !(x_ticks_.ticks_on_plot_window_on_ > 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. 
+             x_axis_.axis_ = plot_top_; // Put X-axis on top.
           }
           else
           { // y_axis_position_ == y_intersects_x
             // Calculate below after transform is calculated.
           }
-        } // if (use_x_axis_line_) 
+        } // if (use_x_axis_line_)
 
-        if (y_axis_.axis_line_on_) 
+        if (y_axis_.axis_line_on_)
         { // 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 of the plot window
@@ -573,8 +572,8 @@
             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) 
-          { 
+          else if(y_axis_position_ == right)
+          {
             y_axis_.axis_ = plot_right_; // Y-axis to right of plot window,
             //plot_right_ -= 2 * y_label_info_.font_size(); // with a space.
           }
@@ -582,7 +581,7 @@
           { // x_axis_position_ == x_intersects_y
             // Calculate below after transform is calculated.
           }
-        } // if (use_y_axis_line_) 
+        } // if (use_y_axis_line_)
 
         // TODO this can move up to after last change to plot_left ...???
         // Calculate scale and shift factors for transform from Cartesian to plot.
@@ -640,7 +639,7 @@
             { // Draw vertical line holding the ticks on the left of plot window.
               image.get_g_element(detail::PLOT_Y_AXIS).line(plot_left_, plot_top_, plot_left_, plot_bottom_);
             }
-            else 
+            else
             {// Draw vertical line holding the ticks on the right of plot window.
               image.get_g_element(detail::PLOT_Y_AXIS).line(plot_right_, plot_top_, plot_right_, plot_bottom_);
             }
@@ -747,7 +746,7 @@
         if(y_ticks_.major_grid_on_)
         { // Draw horizontal major grid line.
           if(!plot_window_on_ != 0)
-          { 
+          {
             if(y_ticks_.major_value_labels_on_ < 0)
             { // Start further right to give space for y axis value label.
               y -= y_value_label_style_.font_size() * text_margin_;
@@ -817,9 +816,9 @@
           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 half a digit to center value digits on tick.
+            {  // Just shift down third a digit to center value digits on tick.
               alignment = right_align;
-              y += y_value_label_style_.font_size() / 2;
+              y += y_value_label_style_.font_size() * 0.3;
             }
             else if ((y_ticks_.label_rotation_ == upward) || (y_ticks_.label_rotation_ == downward))
             {// Tick value label straight up or down vertically on y axis.
@@ -847,7 +846,7 @@
               image.get_g_element(detail::PLOT_VALUE_LABELS).text(
                 x_left ,
                 y, // Just shift down half a digit to center value digits on tick.
-                label.str(), 
+                label.str(),
                 y_value_label_style_,
                 alignment, // on the tick ???
                 y_ticks_.label_rotation_);
@@ -866,7 +865,7 @@
         if(y_ticks_.minor_grid_on_)
         { // Draw the minor grid, if wanted.
           if(!plot_window_on_)
-          { 
+          {
             if(x_axis_.label_on_)
             {
               x_left += y_value_label_style_.font_size() * text_margin_;
@@ -888,12 +887,12 @@
 
         if(y_ticks_.ticks_on_plot_window_on_ < 0)
         { // Put y minor ticks on the plot window border left.
-          x_left = plot_left_; 
+          x_left = plot_left_;
           x_right = plot_left_;
         }
         else if (y_ticks_.ticks_on_plot_window_on_ > 0)
         { // Put y minor ticks on the plot window border left.
-          x_left = plot_right_; 
+          x_left = plot_right_;
           x_right = plot_right_;
         }
         else
@@ -1014,13 +1013,13 @@
         if(series.series.size() > 2)
         { // Need >= 3 for a cubic curve (start point, 2 control points, and end point).
           std::multimap<double, double>::const_iterator iter = series.series.begin();
-          n_minus_1 = *(iter++);  // begin() 
+          n_minus_1 = *(iter++);  // begin()
           transform_pair(n_minus_1);
           n = *(iter++); // middle
           transform_pair(n);
           path.M(n_minus_1.first, n_minus_1.second); // move m_minus_1, the 1st data point.
 
-          double control = 0.1;  
+          double control = 0.1;
           //0.2 is a scaling factor that Jake used to define the magnitude of the
           //vector of the current control point to be placed. I was basically
           //taking advantage of the auto-drawing of Bezier curves that exists in
@@ -1032,13 +1031,13 @@
 
           for(; iter != series.series.end(); ++iter)
           {
-            n_minus_2 = n_minus_1; 
+            n_minus_2 = n_minus_1;
             n_minus_1 = n;
             n = *iter;
             transform_pair(n);
 
             back_vtr.first = ((n_minus_1.first - n.first) + // (x diff - x previous diff) * control
-              (n_minus_2.first - n_minus_1.first)) * control; 
+              (n_minus_2.first - n_minus_1.first)) * control;
             back_vtr.second = ((n_minus_1.second - n.second) + // y
               (n_minus_2.second - n_minus_1.second)) * control;
 
@@ -1052,7 +1051,7 @@
               n_minus_1.first, n_minus_1.second); // x, y - end point.
           } // for
           // Last point.
-          back_vtr.first = 0.; 
+          back_vtr.first = 0.;
           back_vtr.second = (n.second - n_minus_1.second) * control;
           path.S(n.first + back_vtr.first, // x
             n.second + back_vtr.second, // y
@@ -1244,7 +1243,7 @@
       }
 
       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;
         return *this;
       }
@@ -1298,6 +1297,17 @@
         return y_ticks_.value_ioflags_;
       }
 
+      svg_2d_plot& y_labels_strip_e0s(bool cmd)
+      {
+        y_ticks_.strip_e0s_ = cmd;
+        return *this;
+      }
+
+      bool y_labels_strip_e0s()
+      {
+        return y_ticks_.strip_e0s_;
+      }
+
       svg_2d_plot& y_axis_color(const svg_color& col)
       { // Set only stroke color.
         image.get_g_element(detail::PLOT_Y_AXIS).style().stroke_color(col);
@@ -1332,7 +1342,7 @@
       }
 
       svg_2d_plot& y_axis_value_color(const svg_color& col)
-      { 
+      {
         image.get_g_element(detail::PLOT_VALUE_LABELS).style().stroke_color(col);
         return *this;
       }
@@ -1343,7 +1353,7 @@
       }
 
       svg_2d_plot& y_label_width(double width)
-      { 
+      {
         image.get_g_element(detail::PLOT_Y_LABEL).style().stroke_width(width);
         return *this;
       }
@@ -1547,7 +1557,6 @@
         return y_ticks_.ticks_on_plot_window_on_;
       }
 
-
       svg_2d_plot& y_ticks_left_on(bool cmd)
       {
         y_ticks_.left_ticks_on_ = cmd;
@@ -1627,7 +1636,7 @@
 
       unsigned int y_label_font_size()
       {
-        return x_axis_label_style_.font_size();
+        return y_axis_label_style_.font_size();
       }
 
       svg_2d_plot& y_label_weight(std::string s)
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-18 11:09:57 EST (Fri, 18 Jan 2008)
@@ -518,11 +518,67 @@
     bool line_on_;
     bool bezier_on_;
 
-    plot_line_style(const svg_color& col = black, const svg_color& acol = true, double width = 2, bool on = true, bool bezier_on = false)
+    plot_line_style(const svg_color& col = black, const svg_color& acol = true, double width = 2, bool line_on = true, bool bezier_on = false)
       :
-      color_(col), area_fill_(acol), width_(width), line_on_(on), bezier_on_(bezier_on)
+      color_(col), area_fill_(acol), width_(width), line_on_(line_on), bezier_on_(bezier_on)
     { // Defaults for all private data.
     }
+
+  plot_line_style& width(double w)
+  {
+    width_ = w;
+    return *this;
+  }
+
+  double width()
+  {
+    return width_;
+  }
+
+  plot_line_style& color(const svg_color& f)
+  {
+    color_ = f;
+    return *this;
+  }
+
+  svg_color& color()
+  {
+    return color_;
+  }
+
+  plot_line_style& area_fill(const svg_color& f)
+  {
+    area_fill_ = f;
+    return *this;
+  }
+
+  svg_color& area_fill()
+  {
+    return area_fill_;
+  }
+
+  bool line_on() const
+  {
+    return line_on_;
+  }
+
+  plot_line_style& line_on(bool is) 
+  {
+    line_on_ = is;
+    return *this; // Make chainable.
+  }
+
+  bool bezier_on() const
+  {
+    return bezier_on_;
+  }
+
+  plot_line_style& bezier_on(bool is) 
+  {
+    bezier_on_ = is;
+    return *this; // Make chainable.
+  }
+
 }; // class plot_line_style
 
 std::ostream& operator<< (std::ostream& os, plot_line_style p)
@@ -680,7 +736,7 @@
     bool major_grid_on_;  // Draw X grid at major ticks.
     bool minor_grid_on_;// Draw X grid at minor ticks.
     int value_precision_; // precision for tick value labels, usually 3 will suffice.
-    int value_ioflags_;  // IO formatting flags for the axis.
+    int value_ioflags_;  // IO formatting flags for the axis default std::ios::dec.
     bool strip_e0s_; // If redundant zero, + and e are to be stripped.
     size_t label_max_chars_;  // width (in SVG units) of longest label on axis.
     int ticks_on_plot_window_on_; // Value labels & ticks on the plot window border 
@@ -871,7 +927,7 @@
     fill_on_(fill_on)
     { // Initializes all private data.
     }
-}; // class axis_line_style
+}; // class box_style
 
 const std::string strip_e0s(std::string s)
 { // Ugly hack to remove unwanted sign and leading zero(s) in exponent.
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-18 11:09:57 EST (Fri, 18 Jan 2008)
@@ -88,6 +88,7 @@
 <dt><span class="section"> svg_1d_plot Public Interface</span></dt>
 <dt><span class="section"> svg_2d_plot Public Interface</span></dt>
 <dt><span class="section"> svg_boxplot Public Interface</span></dt>
+<dt><span class="section"> Show settings Public Interface</span></dt>
 </dl></dd>
 <dt><span class="section"> Implementation & Rationale</span></dt>
 <dt><span class="section"> Acknowledgements</span></dt>
@@ -95,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 17, 2008 at 18:41:35 GMT</small></p></td>
+<td align="left"><p><small>Last revised: January 18, 2008 at 09:53:10 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.html
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/svg_plot/interface.html	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/doc/html/svg_plot/interface.html	2008-01-18 11:09:57 EST (Fri, 18 Jan 2008)
@@ -34,6 +34,7 @@
 <dt><span class="section"> svg_1d_plot Public Interface</span></dt>
 <dt><span class="section"> svg_2d_plot Public Interface</span></dt>
 <dt><span class="section"> svg_boxplot Public Interface</span></dt>
+<dt><span class="section"> Show settings Public Interface</span></dt>
 </dl></div>
 </div>
 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
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-18 11:09:57 EST (Fri, 18 Jan 2008)
@@ -7,7 +7,7 @@
 <link rel="start" href="../../index.html" title="SVG_Plot">
 <link rel="up" href="../interface.html" title=" Public Interfaces">
 <link rel="prev" href="svg_2d_plot_interface.html" title=" svg_2d_plot Public Interface">
-<link rel="next" href="../implementation.html" title=" Implementation & Rationale">
+<link rel="next" href="settings.html" title=" Show settings Public Interface">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table cellpadding="2" width="100%"><tr>
@@ -20,7 +20,7 @@
 </tr></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="svg_2d_plot_interface.html"><img src="../../../../../../../../../../trunk/doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../interface.html"><img src="../../../../../../../../../../trunk/doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../../../../../trunk/doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="../implementation.html"><img src="../../../../../../../../../../trunk/doc/html/images/next.png" alt="Next"></a>
+<a accesskey="p" href="svg_2d_plot_interface.html"><img src="../../../../../../../../../../trunk/doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../interface.html"><img src="../../../../../../../../../../trunk/doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../../../../../trunk/doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="settings.html"><img src="../../../../../../../../../../trunk/doc/html/images/next.png" alt="Next"></a>
 </div>
 <div class="section" lang="en">
 <div class="titlepage"><div><div><h3 class="title">
@@ -906,7 +906,7 @@
 </tr></table>
 <hr>
 <div class="spirit-nav">
-<a accesskey="p" href="svg_2d_plot_interface.html"><img src="../../../../../../../../../../trunk/doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../interface.html"><img src="../../../../../../../../../../trunk/doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../../../../../trunk/doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="../implementation.html"><img src="../../../../../../../../../../trunk/doc/html/images/next.png" alt="Next"></a>
+<a accesskey="p" href="svg_2d_plot_interface.html"><img src="../../../../../../../../../../trunk/doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../interface.html"><img src="../../../../../../../../../../trunk/doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../../../../../trunk/doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="settings.html"><img src="../../../../../../../../../../trunk/doc/html/images/next.png" alt="Next"></a>
 </div>
 </body>
 </html>
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-18 11:09:57 EST (Fri, 18 Jan 2008)
@@ -357,6 +357,9 @@
 [`boost_default_convert` (default) is sufficient in all cases where the data stored in the container can be directly cast to a double.]]
 ] [/ table Optional Functions]
 [endsect] [/section:svg_2d_plot_interface]
+
+[include settings.qbk]
+
 [endsect] [/section:interface]
 
 [/ interface.qbk