$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: jakevoytko_at_[hidden]
Date: 2007-07-02 20:42:12
Author: jakevoytko
Date: 2007-07-02 20:42:10 EDT (Mon, 02 Jul 2007)
New Revision: 7342
URL: http://svn.boost.org/trac/boost/changeset/7342
Log:
2D graphs added, get_* methods, 
Added:
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_1d_plot.hpp
      - copied, changed from r7186, /sandbox/SOC/2007/visualization/boost/svg_plot/svg_plot.hpp
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp
Removed:
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_plot.hpp
Text files modified: 
   sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_style.hpp |    10                                         
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_1d_plot.hpp      |   538 ++++++++++++++++++++++++++------------- 
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_test.cpp         |    71 +++--                                   
   3 files changed, 403 insertions(+), 216 deletions(-)
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_style.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_style.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_style.hpp	2007-07-02 20:42:10 EDT (Mon, 02 Jul 2007)
@@ -89,6 +89,14 @@
         rhs << "rgb(" << (unsigned int)r << "," << (unsigned int) g << ","
             << (unsigned int)b << ")" ;
     }
+
+    bool operator==(const svg_color& rhs)
+    {
+        if(r == rhs.r && g == rhs.g && b == rhs.b)
+            return true;
+
+        return false;
+    }
 };
 
 // -----------------------------------------------------------------
@@ -203,7 +211,7 @@
     svg_color(107, 142, 35 ), // olivedrab
     svg_color(255, 165, 0  ), // orange
     svg_color(255, 69 , 0  ), // orangered
-    svg_color(218, 122, 214), // orchid
+    svg_color(218, 112, 214), // orchid
     svg_color(238, 232, 170), // palegoldenrod
     svg_color(152, 251, 152), // palegreen
     svg_color(175, 238, 238), // paleturquose
Copied: sandbox/SOC/2007/visualization/boost/svg_plot/svg_1d_plot.hpp (from r7186, /sandbox/SOC/2007/visualization/boost/svg_plot/svg_plot.hpp)
==============================================================================
--- /sandbox/SOC/2007/visualization/boost/svg_plot/svg_plot.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg_1d_plot.hpp	2007-07-02 20:42:10 EDT (Mon, 02 Jul 2007)
@@ -1,8 +1,4 @@
-                                                                     
-                                                                     
-                                                                     
-                                             
-// svg_plot.hpp
+// svg_1d_plot.hpp
 
 // Copyright (C) Jacob Voytko 2007
 //
@@ -11,8 +7,8 @@
 
 // ----------------------------------------------------------------- 
 
-#ifndef _SVG_PLOT_HPP
-#define _SVG_PLOT_HPP
+#ifndef _SVG_1D_PLOT_HPP
+#define _SVG_1D_PLOT_HPP
 
 #include <vector>
 #include <ostream>
@@ -34,11 +30,11 @@
 // -----------------------------------------------------------------
 enum plot_doc_structure{PLOT_BACKGROUND, PLOT_LEGEND_BACKGROUND,
     PLOT_LEGEND_POINTS, PLOT_LEGEND_TEXT, PLOT_PLOT_BACKGROUND, 
-    PLOT_PLOT_AXIS, PLOT_X_MINOR_TICKS, PLOT_X_MAJOR_TICKS, 
-    PLOT_PLOT_LABELS, PLOT_PLOT_LINES, PLOT_PLOT_POINTS, PLOT_X_LABEL, 
-    PLOT_TITLE};
+    PLOT_Y_AXIS, PLOT_X_AXIS, PLOT_Y_MINOR_TICKS, PLOT_X_MINOR_TICKS, 
+    PLOT_Y_MAJOR_TICKS, PLOT_X_MAJOR_TICKS, PLOT_PLOT_LABELS, 
+    PLOT_PLOT_LINES, PLOT_PLOT_POINTS, PLOT_Y_LABEL, PLOT_X_LABEL, PLOT_TITLE};
 
-#define SVG_PLOT_DOC_CHILDREN 13
+#define SVG_PLOT_DOC_CHILDREN 17
 
 // -----------------------------------------------------------------
 // This allows us to store plot state locally in svg_plot. We don't
@@ -64,18 +60,27 @@
     }
 };
 
-class svg_plot
+class svg_1d_plot
 {
-private:
+protected:
+
     //todo: replace with x_scale, x_shift, since I don't use the full matrix
     double transform_matrix[3][3];
 
     // stored so as to avoid rewriting style information constantly
     svg image;
 
-    // where we will be storing the data points for transformation
-    std::vector<svg_plot_series> series;
+    void _draw_x_axis();
+    void _draw_axis();
+
+
+    // border information for the plot window. Initially will be set to the width
+    // and height of the graph
+    int plot_window_x1, plot_window_x2, 
+        plot_window_y1, plot_window_y2;
 
+    void _transform_point(double &x, double &y);
+    
     // strings having to do with labels
     std::string  x_label, title;
 
@@ -88,11 +93,6 @@
     unsigned int x_major_tick_length,  x_minor_tick_length,
                  x_num_minor_ticks,    legend_title_font_size;
 
-    // border information for the plot window. Initially will be set to the width
-    // and height of the graph
-    int plot_window_x1, plot_window_x2, 
-        plot_window_y1, plot_window_y2;
-
     // Yes/no questions
     bool legend_on;
     bool axis_on;
@@ -100,26 +100,28 @@
     bool x_label_on;
     bool x_major_labels_on;
 
+    void _draw_x_label();
+
     // internal helper functions
-    void _transform_point(double &x);
     void _clear_legend();
     void _draw_legend_header(int, int, int);
     void _draw_legend();
-    void _draw_axis();
-    void _draw_x_label();
+private:
+    // where we will be storing the data points for transformation
+    std::vector<svg_plot_series> series;
+
+    svg_1d_plot(const svg_1d_plot&);
+    svg_1d_plot& operator=(const svg_1d_plot&);
 
-    svg_plot(const svg_plot&);
-    
-    svg_plot& operator=(const svg_plot&);
 public:
 
     // constructors
-    svg_plot();
-    svg_plot(const std::string& file);
+    svg_1d_plot();
+    svg_1d_plot(const std::string& file);
 
     // output
-    svg_plot& write(const std::string&);
-    svg_plot& write(std::ostream&);
+    svg_1d_plot& write(const std::string&);
+    svg_1d_plot& write(std::ostream&);
 
     
     // plot functions
@@ -132,68 +134,101 @@
     //setters
 
     // misc
-    svg_plot& set_image_size(unsigned int, unsigned int);
-    svg_plot& set_title(const std::string&);
-    svg_plot& set_title_font_size(unsigned int);
-    svg_plot& set_legend_title_font_size(unsigned int);
+    svg_1d_plot& set_image_size(unsigned int, unsigned int);
+    svg_1d_plot& set_title(const std::string&);
+    svg_1d_plot& set_title_font_size(unsigned int);
+    svg_1d_plot& set_legend_title_font_size(unsigned int);
 
     // commands
-    svg_plot& set_axis(bool);
-    svg_plot& set_legend(bool);
-    svg_plot& set_plot_window(bool);
-    svg_plot& set_x_label(bool);
-    svg_plot& set_x_major_labels(bool);
+    svg_1d_plot& set_axis(bool);
+    svg_1d_plot& set_legend(bool);
+    svg_1d_plot& set_plot_window(bool);
+    svg_1d_plot& set_x_label(bool);
+    svg_1d_plot& set_x_major_labels(bool);
 
     // color information    
-    svg_plot& set_title_color(svg_color_constant);
-    svg_plot& set_title_color(const svg_color&);
+    svg_1d_plot& set_title_color(svg_color_constant);
+    svg_1d_plot& set_title_color(const svg_color&);
+
+    svg_1d_plot& set_background_color(svg_color_constant);
+    svg_1d_plot& set_background_color(const svg_color&);
 
-    svg_plot& set_background_color(svg_color_constant);
-    svg_plot& set_background_color(const svg_color&);
+    svg_1d_plot& set_legend_background_color(svg_color_constant);
+    svg_1d_plot& set_legend_background_color(const svg_color&);
 
-    svg_plot& set_legend_background_color(svg_color_constant);
-    svg_plot& set_legend_background_color(const svg_color&);
+    svg_1d_plot& set_legend_border_color(svg_color_constant);
+    svg_1d_plot& set_legend_border_color(const svg_color&);
 
-    svg_plot& set_plot_background_color(svg_color_constant);
-    svg_plot& set_plot_background_color(const svg_color&);
+    svg_1d_plot& set_plot_background_color(svg_color_constant);
+    svg_1d_plot& set_plot_background_color(const svg_color&);
     
-    svg_plot& set_x_axis_color(svg_color_constant);
-    svg_plot& set_x_axis_color(const svg_color&);
+    svg_1d_plot& set_x_axis_color(svg_color_constant);
+    svg_1d_plot& set_x_axis_color(const svg_color&);
 
-    svg_plot& set_x_major_tick_color(svg_color_constant);
-    svg_plot& set_x_major_tick_color(const svg_color&);
+    svg_1d_plot& set_x_major_tick_color(svg_color_constant);
+    svg_1d_plot& set_x_major_tick_color(const svg_color&);
 
-    svg_plot& set_x_minor_tick_color(svg_color_constant);
-    svg_plot& set_x_minor_tick_color(const svg_color&);
+    svg_1d_plot& set_x_minor_tick_color(svg_color_constant);
+    svg_1d_plot& set_x_minor_tick_color(const svg_color&);
 
     // axis information
-    svg_plot& set_x_scale(double, double);
+    svg_1d_plot& set_x_scale(double, double);
 
-    svg_plot& set_x_axis_width(unsigned int);
+    svg_1d_plot& set_x_axis_width(unsigned int);
 
-    svg_plot& set_x_major_tick(double);
-    svg_plot& set_x_major_tick_length(unsigned int);
-    svg_plot& set_x_minor_tick_length(unsigned int);
-    svg_plot& set_x_num_minor_ticks(unsigned int);        
-    svg_plot& set_x_label_text(const std::string&);
-    svg_plot& set_x_major_tick_width(unsigned int);
-    svg_plot& set_x_minor_tick_width(unsigned int);
+    svg_1d_plot& set_x_major_tick(double);
+    svg_1d_plot& set_x_major_tick_length(unsigned int);
+    svg_1d_plot& set_x_minor_tick_length(unsigned int);
+    svg_1d_plot& set_x_num_minor_ticks(unsigned int);        
+    svg_1d_plot& set_x_label_text(const std::string&);
+    svg_1d_plot& set_x_major_tick_width(unsigned int);
+    svg_1d_plot& set_x_minor_tick_width(unsigned int);
 
     // getters
-    const std::string& get_title();
+    unsigned int get_image_x_size();
+    unsigned int get_image_y_size();
+    std::string get_title();
     unsigned int get_title_font_size();
+    unsigned int get_legend_title_font_size();
 
+    // commands
+    bool get_axis();
+    bool get_legend();
+    bool get_plot_window();
+    bool get_x_label();
+    bool get_x_major_labels();
+
+    // color information    
+    svg_color get_title_color();
     svg_color get_background_color();
     svg_color get_legend_background_color();
-    svg_color get_axis_color();
+    svg_color get_legend_border_color();
+    svg_color get_plot_background_color();    
+    svg_color get_x_axis_color();
+    svg_color get_x_major_tick_color();
+    svg_color get_x_minor_tick_color();
 
-    unsigned int get_axis_width();
+    // axis information
+    double get_x_min();
+    double get_x_max();
+
+    unsigned int get_x_axis_width();
+
+    double get_x_major_tick();
+    unsigned int get_x_major_tick_length();
+    unsigned int get_x_minor_tick_length();
+    unsigned int get_x_num_minor_ticks();   
+    unsigned int get_x_major_tick_width();
+    unsigned int get_x_minor_tick_width();
+
+    std::string get_x_label_text();
 };
 
-svg_plot::svg_plot(): x_label(""), x_min(-10), x_max(10), plot_window_x1(0), 
+svg_1d_plot::svg_1d_plot(): x_label(""), x_min(-10), x_max(10), plot_window_x1(0), 
                       plot_window_y1(0), plot_window_x2(100), 
                       plot_window_y2(100), x_axis(50), legend_on(false),
-                      axis_on(false), x_minor_tick_length(10), 
+                      axis_on(false), plot_window_on(false),x_major_tick(1), 
+                      x_minor_tick_length(10), x_num_minor_ticks(4), 
                       legend_title_font_size(12)
 {
     for(int i = 0; i < 3; ++i)
@@ -215,7 +250,21 @@
 }
 
 
-svg_plot& svg_plot::write(const std::string& _str)
+svg_1d_plot& svg_1d_plot::write(const std::string& _str)
+{
+    std::ofstream fout(_str.c_str());
+
+    if(fout.fail())
+    {
+        throw "Failed to open "+_str;
+    }
+
+    svg_1d_plot::write(fout);
+
+    return *this;
+}
+
+svg_1d_plot& svg_1d_plot::write(std::ostream& s_out)
 {
     // Hold off drawing the legend until the very end.. it's
     // easier to draw the size that it needs at the end than
@@ -238,7 +287,7 @@
         plot_window_y1+=5;
         plot_window_y2-=5;
 
-        if(axis_on)
+        if(legend_on)
         {
             plot_window_x2 -= 155;
         }
@@ -261,7 +310,7 @@
         
     if(axis_on)
     {
-        _draw_axis();
+        _draw_x_axis();
     }
 
     if(legend_on)
@@ -275,7 +324,7 @@
     }
 
     double x1(0);
-
+    double y1(0);
     //draw points
     for(unsigned int i=0; i<series.size(); ++i)
     {
@@ -286,7 +335,7 @@
         {
             x1 = series[i].series[j];
 
-            _transform_point(x1);
+            _transform_point(x1, y1);
             
             if(x1 > plot_window_x1 && x1 < plot_window_x2)
             {
@@ -295,30 +344,13 @@
         }
     }
 
-    image.write(_str);
-
-    return *this;
-}
-
-svg_plot& svg_plot::write(std::ostream& s_out)
-{
-    if(legend_on)
-    {
-        _draw_legend();
-    }
-
-    if(axis_on)
-    {
-        _draw_axis();
-    }
-    
     image.write(s_out);
     
-    return (svg_plot&)*this;
+    return (svg_1d_plot&)*this;
 }
 
 template <class iter>
-void plot_range(svg_plot& _cont, iter _begin, iter _end, std::string _str)
+void plot_range(svg_1d_plot& _cont, iter _begin, iter _end, std::string _str)
 {
     std::vector<double> vect(_begin, _end);
 
@@ -326,7 +358,7 @@
 }
 
 template <class iter>
-void plot_range(svg_plot& _cont, iter _begin, iter _end, std::string _str,
+void plot_range(svg_1d_plot& _cont, iter _begin, iter _end, std::string _str,
                       svg_color_constant _col)
 {
     std::vector<double> vect(_begin, _end);
@@ -337,7 +369,7 @@
 // -----------------------------------------------------------------
 // Actually draw data to the plot. Default color information
 // -----------------------------------------------------------------
-void svg_plot::plot_range(std::vector<double>::const_iterator begin,
+void svg_1d_plot::plot_range(std::vector<double>::const_iterator begin,
                             std::vector<double>::const_iterator end,
                             const std::string& _str)
 {
@@ -347,7 +379,7 @@
 // -----------------------------------------------------------------
 // Actually draw data to the plot. Fill color information provided
 // -----------------------------------------------------------------
-void svg_plot::plot_range(std::vector<double>::const_iterator begin,
+void svg_1d_plot::plot_range(std::vector<double>::const_iterator begin,
                             std::vector<double>::const_iterator end,
                             const std::string& _str,
                             svg_color_constant _col)
@@ -370,25 +402,26 @@
 //
 // set_legend_title_font_size(): As above
 // -----------------------------------------------------------------
-svg_plot& svg_plot::set_image_size(unsigned int x, unsigned int y)
+svg_1d_plot& svg_1d_plot::set_image_size(unsigned int x, unsigned int y)
 {
     image.image_size(x, y);
     
     return *this;
 }
 
-svg_plot& svg_plot::set_title(const std::string& _title)
+svg_1d_plot& svg_1d_plot::set_title(const std::string& _title)
 {
     text_element title(image.get_x_size()/2., 30, _title);
 
     title.set_alignment(center_align);
 
+    // problem here
     image.get_g_element(PLOT_TITLE).push_back(new text_element(title));
 
     return *this;
 }
 
-svg_plot& svg_plot::set_title_font_size(unsigned int _size)
+svg_1d_plot& svg_1d_plot::set_title_font_size(unsigned int _size)
 {
     text_element* t_ptr = static_cast<text_element*>(
                     &(image.get_g_element(PLOT_TITLE)[0]));
@@ -398,7 +431,7 @@
     return *this;
 }
 
-svg_plot& svg_plot::set_legend_title_font_size(unsigned int _size)
+svg_1d_plot& svg_1d_plot::set_legend_title_font_size(unsigned int _size)
 {
     legend_title_font_size = _size;
 
@@ -423,48 +456,48 @@
 //  
 // -----------------------------------------------------------------
 
-svg_plot& svg_plot::set_axis(bool _cmd)
+svg_1d_plot& svg_1d_plot::set_axis(bool _cmd)
 {
     axis_on = _cmd;
-    return (svg_plot&)*this;
+    return *this;
 }
 
-svg_plot& svg_plot::set_legend(bool _cmd)
+svg_1d_plot& svg_1d_plot::set_legend(bool _cmd)
 {
     legend_on = _cmd;
 
-    return (svg_plot&)*this;
+    return *this;
 }
 
-svg_plot& svg_plot::set_plot_window(bool _cmd)
+svg_1d_plot& svg_1d_plot::set_plot_window(bool _cmd)
 {
     plot_window_on = _cmd;
 
-    return (svg_plot&)*this;
+    return *this;
 }
 
-svg_plot& svg_plot::set_x_label(bool _cmd)
+svg_1d_plot& svg_1d_plot::set_x_label(bool _cmd)
 {
     x_label_on = _cmd;
 
     return *this;
 }
 
-svg_plot& svg_plot::set_x_major_labels(bool _cmd)
+svg_1d_plot& svg_1d_plot::set_x_major_labels(bool _cmd)
 {
     x_major_labels_on = _cmd;
 
     return *this;
 }
 
-svg_plot& svg_plot::set_title_color(svg_color_constant _col)
+svg_1d_plot& svg_1d_plot::set_title_color(svg_color_constant _col)
 {
     set_title_color(constant_to_rgb(_col));
 
     return *this;
 }
 
-svg_plot& svg_plot::set_title_color(const svg_color& _col)
+svg_1d_plot& svg_1d_plot::set_title_color(const svg_color& _col)
 {
     image.get_g_element(PLOT_TITLE).set_stroke_color(_col);
     image.get_g_element(PLOT_TITLE).set_fill_color(_col);
@@ -495,14 +528,14 @@
 //
 // set_x_minor_tick_color(): As above, but for minor ticks
 // -----------------------------------------------------------------
-svg_plot& svg_plot::set_background_color(svg_color_constant _col)
+svg_1d_plot& svg_1d_plot::set_background_color(svg_color_constant _col)
 {
     set_background_color(constant_to_rgb(_col));
 
     return *this;
 }
 
-svg_plot& svg_plot::set_background_color(const svg_color& _col)
+svg_1d_plot& svg_1d_plot::set_background_color(const svg_color& _col)
 {
     image.get_g_element(PLOT_BACKGROUND).set_fill_color(_col);
 
@@ -514,75 +547,87 @@
     return *this;
 }
 
-svg_plot& svg_plot::set_legend_background_color(svg_color_constant _col)
+svg_1d_plot& svg_1d_plot::set_legend_background_color(svg_color_constant _col)
 {
     set_legend_background_color(constant_to_rgb(_col));
 
-    return (svg_plot&)*this;
+    return *this;
 }
 
-svg_plot& svg_plot::set_legend_background_color(const svg_color& _col)
+svg_1d_plot& svg_1d_plot::set_legend_background_color(const svg_color& _col)
 {
-    image.get_g_element(PLOT_LEGEND_BACKGROUND)
-            .set_fill_color(_col);
+    image.get_g_element(PLOT_LEGEND_BACKGROUND).set_fill_color(_col);
+
+    return *this;
+}
+
+svg_1d_plot& svg_1d_plot::set_legend_border_color(svg_color_constant _col)
+{
+    set_legend_border_color(constant_to_rgb(_col));
 
     return *this;
 }
 
-svg_plot& svg_plot::set_plot_background_color(svg_color_constant _col)
+svg_1d_plot& svg_1d_plot::set_legend_border_color(const svg_color& _col)
+{
+    image.get_g_element(PLOT_LEGEND_BACKGROUND).set_stroke_color(_col);
+
+    return *this;
+}
+
+svg_1d_plot& svg_1d_plot::set_plot_background_color(svg_color_constant _col)
 {
     image.get_g_element(PLOT_PLOT_BACKGROUND).set_fill_color(_col);
 
     return *this;
 }
 
-svg_plot& svg_plot::set_plot_background_color(const svg_color& _col)
+svg_1d_plot& svg_1d_plot::set_plot_background_color(const svg_color& _col)
 {
     image.get_g_element(PLOT_PLOT_BACKGROUND).set_fill_color(_col);
 
     return *this;
 }
 
-svg_plot& svg_plot::set_x_axis_color(svg_color_constant _col)
+svg_1d_plot& svg_1d_plot::set_x_axis_color(svg_color_constant _col)
 {
     set_x_axis_color(constant_to_rgb(_col));
 
-    return (svg_plot&)*this;
+    return *this;
 }
 
-svg_plot& svg_plot::set_x_axis_color(const svg_color& _col)
+svg_1d_plot& svg_1d_plot::set_x_axis_color(const svg_color& _col)
 {
-    image.get_g_element(PLOT_PLOT_AXIS)
+    image.get_g_element(PLOT_X_AXIS)
             .set_fill_color(_col);
 
-    image.get_g_element(PLOT_PLOT_AXIS)
+    image.get_g_element(PLOT_X_AXIS)
             .set_stroke_color(_col);
 
     return *this;
 }
 
-svg_plot& svg_plot::set_x_major_tick_color(const svg_color& _col)
+svg_1d_plot& svg_1d_plot::set_x_major_tick_color(const svg_color& _col)
 {
     image.get_g_element(PLOT_X_MAJOR_TICKS).set_stroke_color(_col);
     image.get_g_element(PLOT_X_MAJOR_TICKS).set_fill_color(_col);
     return *this;
 }
 
-svg_plot& svg_plot::set_x_major_tick_color(svg_color_constant _col)
+svg_1d_plot& svg_1d_plot::set_x_major_tick_color(svg_color_constant _col)
 {
     set_x_major_tick_color(constant_to_rgb(_col));
     return *this;
 }
 
-svg_plot& svg_plot::set_x_minor_tick_color(const svg_color& _col)
+svg_1d_plot& svg_1d_plot::set_x_minor_tick_color(const svg_color& _col)
 {
     image.get_g_element(PLOT_X_MINOR_TICKS).set_stroke_color(_col);
     image.get_g_element(PLOT_X_MINOR_TICKS).set_fill_color(_col);
     return *this;
 }
 
-
-svg_plot& svg_plot::set_x_minor_tick_color(svg_color_constant _col)
+svg_1d_plot& svg_1d_plot::set_x_minor_tick_color(svg_color_constant _col)
 {
     set_x_minor_tick_color(constant_to_rgb(_col));
     return *this;
@@ -611,7 +656,7 @@
 // set_x_minor_tick_width(): Stroke width for minor ticks
 // -----------------------------------------------------------------
 
-svg_plot& svg_plot::set_x_scale(double x1, double x2)
+svg_1d_plot& svg_1d_plot::set_x_scale(double x1, double x2)
 {
     x_min = x1;
     x_max = x2;
@@ -621,56 +666,56 @@
         throw "Illegal Argument: X scale: x2 < x1";
     }
 
-    return (svg_plot&)*this;
+    return (svg_1d_plot&)*this;
 }
 
-svg_plot& svg_plot::set_x_axis_width(unsigned int _width)
+svg_1d_plot& svg_1d_plot::set_x_axis_width(unsigned int _width)
 {
-    image.get_g_element(PLOT_PLOT_AXIS).set_stroke_width(_width);
+    image.get_g_element(PLOT_X_AXIS).set_stroke_width(_width);
 
     return *this;
 }
 
-svg_plot& svg_plot::set_x_major_tick(double _inter)
+svg_1d_plot& svg_1d_plot::set_x_major_tick(double _inter)
 {
     x_major_tick = _inter;
 
     return *this;
 }
 
-svg_plot& svg_plot::set_x_major_tick_length(unsigned int _length)
+svg_1d_plot& svg_1d_plot::set_x_major_tick_length(unsigned int _length)
 {
     x_major_tick_length = _length;
     return *this;
 }
 
-svg_plot& svg_plot::set_x_minor_tick_length(unsigned int _length)
+svg_1d_plot& svg_1d_plot::set_x_minor_tick_length(unsigned int _length)
 {
     x_minor_tick_length = _length;
     return *this;
 }
 
-svg_plot& svg_plot::set_x_num_minor_ticks(unsigned int _num)
+svg_1d_plot& svg_1d_plot::set_x_num_minor_ticks(unsigned int _num)
 {
     x_num_minor_ticks = _num;
     return *this;
 }
 
-svg_plot& svg_plot::set_x_label_text(const std::string& _str)
+svg_1d_plot& svg_1d_plot::set_x_label_text(const std::string& _str)
 {
     x_label = _str;
 
     return *this;
 }
 
-svg_plot& svg_plot::set_x_major_tick_width(unsigned int _width)
+svg_1d_plot& svg_1d_plot::set_x_major_tick_width(unsigned int _width)
 {
     image.get_g_element(PLOT_X_MAJOR_TICKS).set_stroke_width(_width);
 
     return *this;
 }
 
-svg_plot& svg_plot::set_x_minor_tick_width(unsigned int _width)
+svg_1d_plot& svg_1d_plot::set_x_minor_tick_width(unsigned int _width)
 {
     image.get_g_element(PLOT_X_MINOR_TICKS).set_stroke_width(_width);
 
@@ -681,34 +726,28 @@
 // We don't use the SVG coordinate transform because then text would
 // be flipped. I'm considering using it to scale the image for resizes
 // -----------------------------------------------------------------
-void svg_plot::_transform_point(double &x)
+void svg_1d_plot::_transform_point(double &x, double &y)
 {
     x = transform_matrix[0][0] * x + transform_matrix[0][2];
+    y = transform_matrix[1][1] * y + transform_matrix[1][2];
 }
 
-//refactor
-void svg_plot::_draw_axis()
+void svg_1d_plot::_draw_x_axis()
 {
-    // one major axis. We just need to draw a vertical line through
-    // the origin for now. We will make that an option later.
-    double x1, y1, y2;
-
-    x_axis = (plot_window_y1 + plot_window_y2) / 2.;
+    double y1(0.), y2(0.), x1(0.), toss(0.);
 
-    image.line(plot_window_x1, x_axis, plot_window_x2, x_axis, 
-        image.get_g_element(PLOT_PLOT_AXIS));
+    // draw the axis line
+    _transform_point(x1, y1);
 
-    x1 = 0;
+    x_axis = y1;
 
-    _transform_point(x1);
-    
-    image.line(x1, plot_window_y1, x1, plot_window_y2, 
-        image.get_g_element(PLOT_PLOT_AXIS));
-
-    int major_tick_len = x_major_tick_length/2;
+    image.line(plot_window_x1, x_axis, plot_window_x2, x_axis, 
+        image.get_g_element(PLOT_X_AXIS));
 
+    // draw the ticks on the positive side
     for(double i = 0; i < x_max; i += x_major_tick)
     {
+        //draw minor ticks
         for(double j=i; j<i+x_major_tick; j+=x_major_tick / (x_num_minor_ticks+1))
         {
             y1 = x_axis + x_minor_tick_length/2.;
@@ -716,7 +755,7 @@
 
             x1=j;
 
-            _transform_point(x1);
+            _transform_point(x1, toss);
 
             //make sure that we are drawing inside of the allowed window
             if(x1 < plot_window_x2)
@@ -726,16 +765,17 @@
             }
         }
 
-        y1 = x_axis + x_major_tick_length/2;
-        y2 = x_axis - x_major_tick_length/2;
-    
+        //draw major tick
         x1=i;
 
-        _transform_point(x1);
+        _transform_point(x1, toss);
 
         //make sure that we are drawing inside of the allowed window
         if(x1 < plot_window_x2)
         {
+            y1 = x_axis + x_major_tick_length/2;
+            y2 = x_axis - x_major_tick_length/2;
+            
             image.line(x1, y1, x1, y2, 
                 image.get_g_element(PLOT_X_MAJOR_TICKS));
 
@@ -750,8 +790,10 @@
         }
     }
 
+    // draw the ticks on the negative side
     for(double i = 0; i > x_min; i -= x_major_tick)
     {
+        // draw minor ticks
         for(double j=i; j>i-x_major_tick; j-=x_major_tick / (x_num_minor_ticks+1))
         {
             y1 = x_axis + x_minor_tick_length/2.;
@@ -759,7 +801,7 @@
 
             x1=j;
 
-            _transform_point(x1);
+            _transform_point(x1, toss);
 
             //make sure that we are drawing inside of the allowed window
             if(x1 > plot_window_x1)
@@ -768,12 +810,14 @@
                     image.get_g_element(PLOT_X_MINOR_TICKS));
             }
         }
-        y1 = x_axis+major_tick_len;
-        y2 = x_axis-major_tick_len;
+
+        //draw the major tick
+        y1 = x_axis+x_major_tick_length/2.;
+        y2 = x_axis-x_major_tick_length/2.;
     
         x1=i;
 
-        _transform_point(x1);
+        _transform_point(x1, toss);
 
         if(x1 > plot_window_x1)
         {
@@ -791,13 +835,30 @@
     }
 }
 
+//refactor
+void svg_1d_plot::_draw_axis()
+{
+    double x1(0.), y1(0.);
+
+    _transform_point(x1, y1);
+    
+    //draw origin. Make sure it is in the window
+    if(x1 > plot_window_x1 && x1 < plot_window_x2)
+    {
+        image.line(x1, plot_window_y1, x1, plot_window_y2, 
+            image.get_g_element(PLOT_X_AXIS));
+    }
+
+    _draw_x_axis();
+}
+
 // -----------------------------------------------------------------
 // When writing to multiple documents, the contents of the plot
 // may change significantly between. Rather than figuring out what
 // has and has not changed, just erase the contents of the legend
 // in the document and start over.
 // -----------------------------------------------------------------
-void svg_plot::_clear_legend()
+void svg_1d_plot::_clear_legend()
 {
     g_element* g_ptr = &(image.get_g_element(PLOT_LEGEND_POINTS));
 
@@ -813,7 +874,7 @@
 // This function has some "magic" values that could be removed
 // or abstracted
 // -----------------------------------------------------------------
-void svg_plot::_draw_legend_header(int _x, int _y, int _width)
+void svg_1d_plot::_draw_legend_header(int _x, int _y, int _width)
 {
     // 2 added to y argument for padding.
     text_element legend_header(_x+(_width/2), _y + legend_title_font_size + 2, "Legend");
@@ -833,7 +894,7 @@
 // The legend will soon be a percentage of the window, which will
 // remove some of the magic values
 // -----------------------------------------------------------------
-void svg_plot::_draw_legend()
+void svg_1d_plot::_draw_legend()
 {
     _clear_legend();
 
@@ -850,16 +911,20 @@
        legend_width = (int)x_size; 
     }
 
-    int legend_x_start(plot_window_x2 + 5);
-    int legend_y_start(plot_window_y1);
+    unsigned int legend_x_start(plot_window_x2 + 5);
+    unsigned int legend_y_start(plot_window_y1);
 
+    if((unsigned int)(plot_window_x2) >= image.get_x_size())
+    {
+        legend_x_start-=160;
+        legend_y_start+=5;
+    }
     // legend_height = title_spacing + (space per element)(num_elements)
     //                  + (end spacing)
     legend_height = (int)(legend_title_font_size*1.5 + (25 * num_points) + 10);
 
     // TODO: Figure out how tall the legend should be
 
-    image.get_g_element(PLOT_LEGEND_BACKGROUND).set_stroke_color(svg_color(102, 102, 84));
     g_element* g_ptr = &(image.get_g_element(PLOT_LEGEND_BACKGROUND));
 
     g_ptr->push_back(new rect_element(legend_x_start, 
@@ -889,7 +954,7 @@
     }
 }
 
-void svg_plot::_draw_x_label()
+void svg_1d_plot::_draw_x_label()
 {
     text_element to_use((plot_window_x2 + plot_window_x1) / 2., image.get_y_size() - 8, x_label);
 
@@ -903,39 +968,142 @@
     image.get_g_element(PLOT_X_LABEL).push_back(new text_element(to_use));
 }
 
-const std::string& svg_plot::get_title()
+unsigned int svg_1d_plot::get_image_x_size()
+{
+    return image.get_x_size();
+}
+
+unsigned int svg_1d_plot::get_image_y_size()
+{
+    return image.get_x_size();
+}
+
+std::string svg_1d_plot::get_title()
 {
     return title;
 }
 
-unsigned int svg_plot::get_title_font_size()
+unsigned int svg_1d_plot::get_legend_title_font_size()
+{
+    return legend_title_font_size;
+}
+
+    // commands
+bool svg_1d_plot::get_axis()
+{
+    return axis_on;
+}
+
+bool svg_1d_plot::get_legend()
+{
+    return legend_on;
+}
+
+bool svg_1d_plot::get_plot_window()
+{
+    return plot_window_on;
+}
+
+bool svg_1d_plot::get_x_label()
+{
+    return x_label_on;
+}
+
+bool svg_1d_plot::get_x_major_labels()
+{
+    return x_major_labels_on;
+}
+
+// color information    
+svg_color svg_1d_plot::get_title_color()
 {
-    return (static_cast<text_element*>(
-                &(image.get_g_element(PLOT_TITLE)[0])))->get_font_size();
-    return 0;
+    return image.get_g_element(PLOT_TITLE).get_fill_color();
 }
 
-svg_color svg_plot::get_background_color()
+svg_color svg_1d_plot::get_background_color()
 {
     return image.get_g_element(PLOT_BACKGROUND).get_fill_color();
-    return svg_color(0,0,0);
 }
 
-svg_color svg_plot::get_legend_background_color()
+svg_color svg_1d_plot::get_legend_background_color()
 {
     return image.get_g_element(PLOT_LEGEND_BACKGROUND).get_fill_color();
-    return svg_color(0,0,0);
 }
 
-svg_color svg_plot::get_axis_color()
+svg_color svg_1d_plot::get_legend_border_color()
+{
+    return image.get_g_element(PLOT_LEGEND_BACKGROUND).get_stroke_color();
+}
+
+svg_color svg_1d_plot::get_plot_background_color()
+{
+    return image.get_g_element(PLOT_PLOT_BACKGROUND).get_fill_color();
+}   
+
+svg_color svg_1d_plot::get_x_axis_color()
+{
+    return image.get_g_element(PLOT_X_AXIS).get_stroke_color();
+}
+
+svg_color svg_1d_plot::get_x_major_tick_color()
+{
+    return image.get_g_element(PLOT_X_MAJOR_TICKS).get_stroke_color();
+}
+
+svg_color svg_1d_plot::get_x_minor_tick_color()
+{
+    return image.get_g_element(PLOT_X_MINOR_TICKS).get_stroke_color();
+}
+
+// axis information
+double svg_1d_plot::get_x_min()
+{
+    return x_min;
+}
+
+double svg_1d_plot::get_x_max()
+{
+    return x_max;
+}
+
+unsigned int svg_1d_plot::get_x_axis_width()
+{
+    return image.get_g_element(PLOT_X_AXIS).get_stroke_width();
+}
+
+double svg_1d_plot::get_x_major_tick()
+{
+    return x_major_tick;
+}
+
+unsigned int svg_1d_plot::get_x_major_tick_length()
+{
+    return x_major_tick_length;
+}
+
+unsigned int svg_1d_plot::get_x_minor_tick_length()
+{
+    return x_minor_tick_length;
+}
+
+unsigned int svg_1d_plot::get_x_num_minor_ticks()
+{
+    return x_num_minor_ticks;
+}  
+
+unsigned int svg_1d_plot::get_x_major_tick_width()
+{
+    return image.get_g_element(PLOT_X_MAJOR_TICKS).get_stroke_width();
+}
+
+unsigned int svg_1d_plot::get_x_minor_tick_width()
 {
-    return image.get_g_element(PLOT_PLOT_AXIS).get_stroke_color();
-    return svg_color(0,0,0);
+    return image.get_g_element(PLOT_X_MINOR_TICKS).get_stroke_width();
 }
 
-unsigned int svg_plot::get_axis_width()
+std::string svg_1d_plot::get_x_label_text()
 {
-    return image.get_g_element(PLOT_PLOT_AXIS).get_stroke_width();
+    return x_label;
 }
 
 
Added: sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp	2007-07-02 20:42:10 EDT (Mon, 02 Jul 2007)
@@ -0,0 +1,978 @@
+// svg_1d_plot.hpp
+
+// Copyright (C) Jacob Voytko 2007
+//
+// Distributed under the Boost Software License, Version 1.0.
+// For more information, see http://www.boost.org
+
+// ----------------------------------------------------------------- 
+
+#ifndef _SVG_2D_PLOT_HPP
+#define _SVG_2D_PLOT_HPP
+
+#include <map>
+#include <ostream>
+#include <sstream>
+#include <iterator>
+
+#include "svg_1d_plot.hpp"
+#include "detail/svg_plot_instruction.hpp"
+
+
+namespace boost {
+namespace svg {
+
+struct svg_2d_plot_series
+{
+    std::multimap<double, double> series;
+    std::string title;
+    svg_color style;
+
+    svg_2d_plot_series(std::multimap<double, double>::const_iterator _begin, 
+                       std::multimap<double, double>::const_iterator _end,
+                       std::string _title,
+                       const svg_color& _style):
+                       series(_begin,_end),
+                       title(_title),
+                       style(_style)
+    {
+
+    }
+};
+
+class svg_2d_plot: public svg_1d_plot
+{
+private:
+    // where we will be storing the data points for transformation
+    std::vector<svg_2d_plot_series> series;
+
+    // strings having to do with labels
+    std::string  y_label;
+
+    // axis information
+    double       y_min,  y_max;
+
+    double       y_major_tick, y_axis;
+
+    unsigned int y_major_tick_length,  y_minor_tick_length,
+                 y_num_minor_ticks;
+
+    bool y_label_on;
+    bool y_major_labels_on;
+
+    void _draw_y_axis();
+    void _draw_axis();
+    void _draw_y_label();
+    void _draw_legend();
+
+    svg_2d_plot(const svg_2d_plot&);
+    svg_2d_plot& operator=(const svg_2d_plot&);
+
+public:
+
+    // constructors
+    svg_2d_plot();
+
+    // output
+    svg_2d_plot& write(const std::string&);
+    svg_2d_plot& write(std::ostream&);
+
+    
+    // plot functions
+    void plot_range(std::multimap<double,double>::const_iterator,
+        std::multimap<double,double>::const_iterator, const std::string&);
+    
+    void plot_range(std::multimap<double,double>::const_iterator, 
+        std::multimap<double,double>::const_iterator, const std::string&, 
+        svg_color_constant);
+
+    // setters
+
+    // Methods from the public interface of svg_1d_plot are
+    // wrapped here so that we may correctly use chaining
+
+    // misc
+    svg_2d_plot& set_image_size(unsigned int, unsigned int);
+    svg_2d_plot& set_title(const std::string&);
+    svg_2d_plot& set_title_font_size(unsigned int);
+    svg_2d_plot& set_legend_title_font_size(unsigned int);
+
+    // commands
+    svg_2d_plot& set_axis(bool);
+    svg_2d_plot& set_legend(bool);
+    svg_2d_plot& set_plot_window(bool);
+
+    svg_2d_plot& set_x_label(bool);
+    svg_2d_plot& set_x_major_labels(bool);
+
+    svg_2d_plot& set_y_label(bool);
+    svg_2d_plot& set_y_major_labels(bool);
+
+    // color information    
+    svg_2d_plot& set_title_color(svg_color_constant);
+    svg_2d_plot& set_title_color(const svg_color&);
+
+    svg_2d_plot& set_background_color(svg_color_constant);
+    svg_2d_plot& set_background_color(const svg_color&);
+
+    svg_2d_plot& set_legend_background_color(svg_color_constant);
+    svg_2d_plot& set_legend_background_color(const svg_color&);
+
+    svg_2d_plot& set_legend_border_color(svg_color_constant);
+    svg_2d_plot& set_legend_border_color(const svg_color&);
+
+    svg_2d_plot& set_plot_background_color(svg_color_constant);
+    svg_2d_plot& set_plot_background_color(const svg_color&);
+    
+    svg_2d_plot& set_x_axis_color(svg_color_constant);
+    svg_2d_plot& set_x_axis_color(const svg_color&);
+
+    svg_2d_plot& set_y_axis_color(svg_color_constant);
+    svg_2d_plot& set_y_axis_color(const svg_color&);
+
+    svg_2d_plot& set_x_major_tick_color(svg_color_constant);
+    svg_2d_plot& set_x_major_tick_color(const svg_color&);
+
+    svg_2d_plot& set_y_major_tick_color(svg_color_constant);
+    svg_2d_plot& set_y_major_tick_color(const svg_color&);
+
+    svg_2d_plot& set_x_minor_tick_color(svg_color_constant);
+    svg_2d_plot& set_x_minor_tick_color(const svg_color&);
+
+    svg_2d_plot& set_y_minor_tick_color(svg_color_constant);
+    svg_2d_plot& set_y_minor_tick_color(const svg_color&);
+
+    // axis information
+    svg_2d_plot& set_x_scale(double, double);
+    svg_2d_plot& set_y_scale(double, double);
+
+    svg_2d_plot& set_x_axis_width(unsigned int);
+    svg_2d_plot& set_y_axis_width(unsigned int);
+
+    svg_2d_plot& set_x_major_tick(double);
+    svg_2d_plot& set_x_major_tick_length(unsigned int);
+    svg_2d_plot& set_x_minor_tick_length(unsigned int);
+    svg_2d_plot& set_x_num_minor_ticks(unsigned int);        
+    svg_2d_plot& set_x_label_text(const std::string&);
+    svg_2d_plot& set_x_major_tick_width(unsigned int);
+    svg_2d_plot& set_x_minor_tick_width(unsigned int);
+
+    svg_2d_plot& set_y_major_tick(double);
+    svg_2d_plot& set_y_major_tick_length(unsigned int);
+    svg_2d_plot& set_y_minor_tick_length(unsigned int);
+    svg_2d_plot& set_y_num_minor_ticks(unsigned int);        
+    svg_2d_plot& set_y_label_text(const std::string&);
+    svg_2d_plot& set_y_major_tick_width(unsigned int);
+    svg_2d_plot& set_y_minor_tick_width(unsigned int);
+
+    // getters
+    const std::string& get_title();
+    unsigned int get_title_font_size();
+
+    svg_color get_background_color();
+    svg_color get_legend_background_color();
+    svg_color get_axis_color();
+
+    unsigned int get_axis_width();
+};
+
+svg_2d_plot::svg_2d_plot(): y_label(""), y_min(-10), y_max(10), 
+                      y_major_tick(1), y_label_on(false),
+                      y_minor_tick_length(10), y_num_minor_ticks(4), 
+                      svg_1d_plot()
+{
+
+}
+
+
+svg_2d_plot& svg_2d_plot::write(const std::string& _str)
+{
+    std::ofstream fout(_str.c_str());
+
+    if(fout.fail())
+    {
+        throw "Failure opening "+_str;
+    }
+
+    write(fout);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::write(std::ostream& s_out)
+{
+        int x_size = image.get_x_size();
+    int y_size = image.get_y_size();
+   
+    plot_window_x1 = plot_window_y1 = 0;
+    plot_window_x2 = image.get_x_size();
+    plot_window_y2 = image.get_y_size();
+
+    if(plot_window_on)
+    {
+        // give the plot window a natural bit of padding
+        plot_window_x1+=5;
+        plot_window_x2-=5;
+        plot_window_y1+=5;
+        plot_window_y2-=5;
+
+        if(legend_on)
+        {
+            plot_window_x2 -= 155;
+        }
+
+        if(x_label_on)
+        {
+            plot_window_y2 -= 20;
+        }
+
+        if(y_label_on)
+        {
+            plot_window_x1 += 20;
+        }
+
+        //for the title. Will take into account font size soon
+        plot_window_y1 +=40;
+
+        image.get_g_element(PLOT_PLOT_BACKGROUND).push_back(
+                new rect_element(plot_window_x1, plot_window_y1, 
+                        (plot_window_x2-plot_window_x1), plot_window_y2-plot_window_y1));
+    }
+
+    transform_matrix[0][0] = (plot_window_x2-plot_window_x1)/(x_max-x_min);
+    transform_matrix[0][2] = plot_window_x1 - (x_min *(plot_window_x2-plot_window_x1)/(x_max-x_min));
+
+    transform_matrix[1][1] = -(plot_window_y2-plot_window_y1)/(y_max-y_min);
+    transform_matrix[1][2] = plot_window_y1 - (y_max *(plot_window_y1-plot_window_y2)/(y_max-y_min));
+
+    if(axis_on)
+    {
+        _draw_y_axis();
+        _draw_x_axis();
+    }
+
+    if(legend_on)
+    {
+        _draw_legend();
+    }
+
+    if(x_label_on)
+    {
+        _draw_x_label();
+    }
+
+    //draw points
+    double x(0.), y(0.);
+    for(unsigned int i=0; i<series.size(); ++i)
+    {
+        g_element& g_ptr = image.get_g_element(PLOT_PLOT_POINTS).add_g_element();
+        g_ptr.set_fill_color(series[i].style);
+
+        for(std::multimap<double,double>::const_iterator j = series[i].series.begin(); 
+            j!=series[i].series.end(); ++j)
+        {
+            x = j->first;
+            y = j->second;
+
+            _transform_point(x, y);
+            
+            if(x > plot_window_x1 && x < plot_window_x2
+             && y > plot_window_y1 && y < plot_window_y2)
+            {
+                image.point(x, y, g_ptr);
+            }
+        }
+    }
+
+    image.write(s_out);
+
+    return *this;
+}
+
+template <class iter>
+void plot_range(svg_2d_plot& _cont, iter _begin, iter _end, std::string _str)
+{
+    std::multimap<double, double> mult(_begin, _end);
+
+    _cont.plot_range(mult.begin(), mult.end(), _str);
+}
+
+template <class iter>
+void plot_range(svg_2d_plot& _cont, iter _begin, iter _end, std::string _str,
+                      svg_color_constant _col)
+{
+    std::multimap<double, double> vect(_begin, _end);
+
+    _cont.plot_range(vect.begin(), vect.end(), _str, _col);
+}
+
+// -----------------------------------------------------------------
+// Actually draw data to the plot. Default color information
+// -----------------------------------------------------------------
+void svg_2d_plot::plot_range(std::multimap<double, double>::const_iterator begin,
+                            std::multimap<double, double>::const_iterator end,
+                            const std::string& _str)
+{
+    series.push_back(svg_2d_plot_series(begin, end, _str, svg_color(0,0,0)));
+}
+
+// -----------------------------------------------------------------
+// Actually draw data to the plot. Fill color information provided
+// -----------------------------------------------------------------
+void svg_2d_plot::plot_range(std::multimap<double, double>::const_iterator begin,
+                             std::multimap<double, double>::const_iterator end,
+                             const std::string& _str,
+                             svg_color_constant _col)
+{
+    series.push_back(svg_2d_plot_series(begin, end, _str, constant_to_rgb(_col)));
+}
+
+// -----------------------------------------------------------------
+// Miscellaneous setter methods: those with no clear, definable home
+// in another category
+//
+// set_image_size():      sets image size in pixels. (x,y) corresponds 
+//                        to point at lower right of graph
+//
+// set_title():           adds the text _title to the top of the screen
+//
+// set_title_font_size(): uses an internal variable to save state, to
+//                        avoid crashes when the title hasn't been
+//                        set yet
+//
+// set_legend_title_font_size(): As above
+// -----------------------------------------------------------------
+svg_2d_plot& svg_2d_plot::set_image_size(unsigned int x, unsigned int y)
+{
+    svg_1d_plot::set_image_size(x, y);
+    
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_title(const std::string& _title)
+{
+    svg_1d_plot::set_title(_title);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_title_font_size(unsigned int _size)
+{
+    svg_1d_plot::set_title_font_size(_size);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_legend_title_font_size(unsigned int _size)
+{
+    svg_1d_plot::set_legend_title_font_size(_size);
+
+    return *this;
+}
+
+// -----------------------------------------------------------------
+// Commands: Answers to yes or no questions (Example: Show the legend?)
+//
+// set_axis(): Whether or not the axis will show
+//
+// set_legend(): Whether or not the legend will show
+//
+// set_plot_window(): Whether or not the plot will be full screen or
+// 		      in its own contained window
+//
+// set_x_label(): Wrapper for 1d function
+//
+// set_y_label(): Sets the label for the y-axis
+//
+// set_x_major_labels(): Wrapper for 1d function
+//
+// set_y_major_labels(): Determines whether or not y axis major labels
+//                       will be shown
+// -----------------------------------------------------------------
+
+svg_2d_plot& svg_2d_plot::set_axis(bool _cmd)
+{
+    svg_1d_plot::set_axis(_cmd);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_legend(bool _cmd)
+{
+    svg_1d_plot::set_legend(_cmd);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_plot_window(bool _cmd)
+{
+    svg_1d_plot::set_plot_window(_cmd);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_label(bool _cmd)
+{
+    svg_1d_plot::set_x_label(_cmd);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_label(bool _cmd)
+{
+    y_label_on = _cmd;
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_major_labels(bool _cmd)
+{
+    svg_1d_plot::set_x_major_labels(_cmd);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_major_labels(bool _cmd)
+{
+    y_major_labels_on = _cmd;
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_title_color(svg_color_constant _col)
+{
+    svg_1d_plot::set_title_color(constant_to_rgb(_col));
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_title_color(const svg_color& _col)
+{
+    svg_1d_plot::set_title_color(_col);
+
+    return *this;
+}
+
+// -----------------------------------------------------------------
+// Color settings: Customization of colors found in the plot
+//
+// set_title_color(): 	   Sets the color of the plot title
+//
+// set_background_color(): Sets the color of the background. This is
+// 			   not the same as the plot window background
+//
+// set_legend_background_color():
+// 			   Sets the background color of the legend
+//
+// set_plot_background_color():
+// 			   Sets the background color of the plot area.
+// 			   If plot_window_on is not set true, this
+// 			   does not show
+//
+// set_axis_color():	   Color of the x axis + origin
+//
+// set_x_major_tick_color(): Sets the color of the major ticks on
+// 			     the x-axis
+//
+// set_x_minor_tick_color(): As above, but for minor ticks
+// -----------------------------------------------------------------
+svg_2d_plot& svg_2d_plot::set_background_color(svg_color_constant _col)
+{
+    svg_1d_plot::set_background_color(constant_to_rgb(_col));
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_background_color(const svg_color& _col)
+{
+    svg_1d_plot::set_background_color(_col);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_legend_background_color(svg_color_constant _col)
+{
+    svg_1d_plot::set_legend_background_color(constant_to_rgb(_col));
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_legend_background_color(const svg_color& _col)
+{
+    svg_1d_plot::set_legend_background_color(_col);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_legend_border_color(svg_color_constant _col)
+{
+    svg_1d_plot::set_legend_border_color(constant_to_rgb(_col));
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_legend_border_color(const svg_color& _col)
+{
+    svg_1d_plot::set_legend_border_color(_col);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_plot_background_color(svg_color_constant _col)
+{
+    svg_1d_plot::set_plot_background_color(constant_to_rgb(_col));
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_plot_background_color(const svg_color& _col)
+{
+    svg_1d_plot::set_plot_background_color(_col);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_axis_color(svg_color_constant _col)
+{
+    svg_1d_plot::set_x_axis_color(constant_to_rgb(_col));
+
+    return (svg_2d_plot&)*this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_axis_color(const svg_color& _col)
+{
+    svg_1d_plot::set_x_axis_color(_col);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_axis_color(svg_color_constant _col)
+{
+    set_y_axis_color(constant_to_rgb(_col));
+
+    return (svg_2d_plot&)*this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_axis_color(const svg_color& _col)
+{
+    image.get_g_element(PLOT_Y_AXIS)
+            .set_fill_color(_col);
+
+    image.get_g_element(PLOT_Y_AXIS)
+            .set_stroke_color(_col);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_major_tick_color(svg_color_constant _col)
+{
+    svg_1d_plot::set_x_major_tick_color(constant_to_rgb(_col));
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_major_tick_color(const svg_color& _col)
+{
+    svg_1d_plot::set_x_major_tick_color(_col);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_major_tick_color(const svg_color& _col)
+{
+    image.get_g_element(PLOT_Y_MAJOR_TICKS).set_stroke_color(_col);
+    image.get_g_element(PLOT_Y_MAJOR_TICKS).set_fill_color(_col);
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_major_tick_color(svg_color_constant _col)
+{
+    set_y_major_tick_color(constant_to_rgb(_col));
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_minor_tick_color(svg_color_constant _col)
+{
+    svg_1d_plot::set_x_minor_tick_color(constant_to_rgb(_col));
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_minor_tick_color(const svg_color& _col)
+{
+    svg_1d_plot::set_x_minor_tick_color(_col);
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_minor_tick_color(const svg_color& _col)
+{
+    image.get_g_element(PLOT_Y_MINOR_TICKS).set_stroke_color(_col);
+    image.get_g_element(PLOT_Y_MINOR_TICKS).set_fill_color(_col);
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_minor_tick_color(svg_color_constant _col)
+{
+    set_y_minor_tick_color(constant_to_rgb(_col));
+    return *this;
+}
+
+// -----------------------------------------------------------------
+// Axis information: Settings for customization of axis information
+//
+// set_x_scale(): sets the left and right max values for the x axis
+//
+// set_x_axis_width(): The width of the x axis
+//
+// set_x_major_tick(): The distance between the ticks of the x_axis
+//
+// set_x_major_tick_length(): How long each tick will be
+//
+// set_x_minor_tick_length(): How long each tick will be
+//
+// set_x_num_minor_ticks(): The number of minor ticks between each
+// 			    major tick
+//
+// set_x_label_text(): Labelling for the x-axis
+//
+// set_x_major_tick_width(): Stroke width for major ticks
+// 
+// set_x_minor_tick_width(): Stroke width for minor ticks
+//
+// All functions defined for x above are also defined for y
+// -----------------------------------------------------------------
+
+// x functions
+svg_2d_plot& svg_2d_plot::set_x_scale(double x1, double x2)
+{
+    svg_1d_plot::set_x_scale(x1, x2);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_axis_width(unsigned int _width)
+{
+    svg_1d_plot::set_x_axis_width(_width);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_major_tick(double _inter)
+{
+    svg_1d_plot::set_x_major_tick(_inter);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_major_tick_length(unsigned int _length)
+{
+    svg_1d_plot::set_x_major_tick_length(_length);
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_minor_tick_length(unsigned int _length)
+{
+    svg_1d_plot::set_x_minor_tick_length(_length);
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_num_minor_ticks(unsigned int _num)
+{
+    svg_1d_plot::set_x_num_minor_ticks(_num);
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_label_text(const std::string& _str)
+{
+    svg_1d_plot::set_x_label_text(_str);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_major_tick_width(unsigned int _width)
+{
+    svg_1d_plot::set_x_major_tick_width(_width);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_x_minor_tick_width(unsigned int _width)
+{
+    svg_1d_plot::set_x_minor_tick_width(_width);
+
+    return *this;
+}
+
+//y functions
+
+svg_2d_plot& svg_2d_plot::set_y_scale(double y1, double y2)
+{
+    y_min = y1;
+    y_max = y2;
+
+    if(y2 <= y1)
+    {
+        throw "Illegal Argument: X scale: x2 < x1";
+    }
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_axis_width(unsigned int _width)
+{
+    image.get_g_element(PLOT_Y_AXIS).set_stroke_width(_width);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_major_tick(double _inter)
+{
+    y_major_tick = _inter;
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_major_tick_length(unsigned int _length)
+{
+    y_major_tick_length = _length;
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_minor_tick_length(unsigned int _length)
+{
+    y_minor_tick_length = _length;
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_num_minor_ticks(unsigned int _num)
+{
+    y_num_minor_ticks = _num;
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_label_text(const std::string& _str)
+{
+    y_label = _str;
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_major_tick_width(unsigned int _width)
+{
+    image.get_g_element(PLOT_Y_MAJOR_TICKS).set_stroke_width(_width);
+
+    return *this;
+}
+
+svg_2d_plot& svg_2d_plot::set_y_minor_tick_width(unsigned int _width)
+{
+    image.get_g_element(PLOT_Y_MINOR_TICKS).set_stroke_width(_width);
+
+    return *this;
+}
+
+void svg_2d_plot::_draw_y_axis()
+{
+    double x1(0.), x2(0.), y1(0.), y2(0.), toss(0.);
+
+    // draw the axis line
+    _transform_point(x1, y1);
+
+    y_axis = x1;
+
+    image.line(y_axis, plot_window_y1, y_axis, plot_window_y2, 
+        image.get_g_element(PLOT_Y_AXIS));
+
+    // draw the ticks on the positive side
+    for(double i = 0; i < y_max; i += y_major_tick)
+    {
+        //draw minor ticks
+        for(double j=i+(y_major_tick / (y_num_minor_ticks+1)); 
+            j<i+y_major_tick; 
+            j+=y_major_tick / (y_num_minor_ticks+1))
+        {
+            x1 = y_axis + y_minor_tick_length/2.;
+            x2 = y_axis - y_minor_tick_length/2.;
+
+            y1=j;
+
+            _transform_point(toss, y1);
+
+            //make sure that we are drawing inside of the allowed window
+            if(y1 > plot_window_y1)
+            {
+                image.line(x1, y1, x2, y1, 
+                    image.get_g_element(PLOT_Y_MINOR_TICKS));
+            }
+        }
+
+        //draw major tick
+        y1=i;
+        _transform_point(x1, y1);
+        _transform_point(x2, y2);
+
+        //make sure that we are drawing inside of the allowed window
+        if(y1 > plot_window_y1)
+        {
+            x1 = y_axis + y_major_tick_length/2;
+            x2 = y_axis - y_major_tick_length/2;
+
+            image.line(x1, y1, x2, y1, 
+                image.get_g_element(PLOT_Y_MAJOR_TICKS));
+            
+            if(y_major_labels_on && i != 0)
+            {
+                std::stringstream fmt;
+                fmt<<i;
+
+                image.text(x1, y1 + (2 + x_major_tick_length/2), fmt.str());
+            }
+        }
+    }
+
+    // draw the ticks on the negative side
+    for(double i = 0; i > y_min; i -= y_major_tick)
+    {
+        //draw minor ticks
+        for(double j=i-(y_major_tick / (y_num_minor_ticks+1)); 
+            j>i-y_major_tick; 
+            j-=y_major_tick / (y_num_minor_ticks+1))
+        {
+            x1 = y_axis + y_minor_tick_length/2.;
+            x2 = y_axis - y_minor_tick_length/2.;
+
+            y1=j;
+
+            _transform_point(toss, y1);
+
+            //make sure that we are drawing inside of the allowed window
+            if(y1 < plot_window_y2)
+            {
+                image.line(x1, y1, x2, y1, 
+                    image.get_g_element(PLOT_Y_MINOR_TICKS));
+            }
+        }
+
+        //draw major tick
+        y1=i;
+        _transform_point(x1, y1);
+        _transform_point(x2, y2);
+
+        //make sure that we are drawing inside of the allowed window
+        if(y1 < plot_window_y2)
+        {
+            x1 = y_axis + y_major_tick_length/2;
+            x2 = y_axis - y_major_tick_length/2;
+
+            image.line(x1, y1, x2, y1, 
+                image.get_g_element(PLOT_Y_MAJOR_TICKS));
+            
+            if(y_major_labels_on && i != 0)
+            {
+                std::stringstream fmt;
+                fmt<<i;
+
+                image.text(x1, y1 + (2 + x_major_tick_length/2), fmt.str());
+            }
+        }
+    }
+
+}
+
+//refactor
+void svg_2d_plot::_draw_axis()
+{
+    _draw_y_axis();
+    _draw_x_axis();
+}
+
+void svg_2d_plot::_draw_y_label()
+{
+/*    text_element to_use((plot_window_x2 + plot_window_x1) / 2., image.get_y_size() - 8, x_label);
+
+    to_use.set_font_size(12);
+    to_use.set_alignment(center_align);
+
+    image.get_g_element(PLOT_X_LABEL).set_stroke_color(white);
+    image.get_g_element(PLOT_X_LABEL).set_fill_color(white);
+
+
+    image.get_g_element(PLOT_X_LABEL).push_back(new text_element(to_use));
+*/
+}
+
+// -----------------------------------------------------------------
+// Important note: there are a lot of magic numbers that are temporary
+// fill-ins for the time when the legend system is more configurable.
+// This will happen bit-by-bit, as I give the user options to change
+// these values
+//
+// The legend will soon be a percentage of the window, which will
+// remove some of the magic values
+// -----------------------------------------------------------------
+void svg_2d_plot::_draw_legend()
+{
+    _clear_legend();
+
+    int num_points = (int)(series.size());
+
+    int legend_width(150);
+    int legend_height(25);
+
+    int x_size = image.get_x_size();
+
+    // Figure out how wide the legend should be
+    if(x_size < 200)
+    {
+       legend_width = (int)x_size; 
+    }
+
+    unsigned int legend_x_start(plot_window_x2 + 5);
+    unsigned int legend_y_start(plot_window_y1);
+
+    if((unsigned int)(plot_window_x2) >= image.get_x_size())
+    {
+        legend_x_start-=160;
+        legend_y_start+=5;
+    }
+
+    // legend_height = title_spacing + (space per element)(num_elements)
+    //                  + (end spacing)
+    legend_height = (int)(legend_title_font_size*1.5 + (25 * num_points) + 10);
+
+    // TODO: Figure out how tall the legend should be
+
+    g_element* g_ptr = &(image.get_g_element(PLOT_LEGEND_BACKGROUND));
+
+    g_ptr->push_back(new rect_element(legend_x_start, 
+			             legend_y_start,
+                         legend_width, 
+				         legend_height));
+
+    _draw_legend_header(legend_x_start, legend_y_start, legend_width);
+
+    g_ptr = &(image.get_g_element(PLOT_LEGEND_POINTS));
+
+    g_element* g_inner_ptr = g_ptr;
+
+    for(unsigned int i=0; i<series.size(); ++i)
+    {
+        g_inner_ptr = &(g_ptr->add_g_element());
+
+        g_inner_ptr->set_fill_color(series[i].style);
+        g_inner_ptr->set_stroke_color(series[i].style);
+
+        g_inner_ptr->push_back(new point_element(legend_x_start + 25,
+                        legend_y_start + legend_title_font_size + 20 + i*25));
+
+        g_inner_ptr->push_back(new text_element(legend_x_start + 40,
+                        legend_y_start + legend_title_font_size + 25 + i*25,
+                        series[i].title));
+    }
+}
+
+
+}
+}
+
+#endif
\ No newline at end of file
Deleted: sandbox/SOC/2007/visualization/boost/svg_plot/svg_plot.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg_plot.hpp	2007-07-02 20:42:10 EDT (Mon, 02 Jul 2007)
+++ (empty file)
@@ -1,946 +0,0 @@
-                                                                     
-                                                                     
-                                                                     
-                                             
-// svg_plot.hpp
-
-// Copyright (C) Jacob Voytko 2007
-//
-// Distributed under the Boost Software License, Version 1.0.
-// For more information, see http://www.boost.org
-
-// ----------------------------------------------------------------- 
-
-#ifndef _SVG_PLOT_HPP
-#define _SVG_PLOT_HPP
-
-#include <vector>
-#include <ostream>
-#include <sstream>
-#include <iterator>
-
-#include "svg.hpp"
-#include "detail/svg_plot_instruction.hpp"
-
-
-namespace boost {
-namespace svg {
-
-// -----------------------------------------------------------------
-// This is the base level of the "tree" for the SVG document. It is 
-// flattened in order to facilitate using other image formats in the 
-// future that don't have the benefit of a document tree. It also
-// greatly simplifies the logic of the methods below
-// -----------------------------------------------------------------
-enum plot_doc_structure{PLOT_BACKGROUND, PLOT_LEGEND_BACKGROUND,
-    PLOT_LEGEND_POINTS, PLOT_LEGEND_TEXT, PLOT_PLOT_BACKGROUND, 
-    PLOT_PLOT_AXIS, PLOT_X_MINOR_TICKS, PLOT_X_MAJOR_TICKS, 
-    PLOT_PLOT_LABELS, PLOT_PLOT_LINES, PLOT_PLOT_POINTS, PLOT_X_LABEL, 
-    PLOT_TITLE};
-
-#define SVG_PLOT_DOC_CHILDREN 13
-
-// -----------------------------------------------------------------
-// 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
-{
-    std::vector<double> series;
-    std::string title;
-    svg_color style;
-
-    svg_plot_series(std::vector<double>::const_iterator _begin, 
-                    std::vector<double>::const_iterator _end,
-                    std::string _title,
-                    const svg_color& _style):
-                    series(_begin,_end),
-                    title(_title),
-                    style(_style)
-    {
-
-    }
-};
-
-class svg_plot
-{
-private:
-    //todo: replace with x_scale, x_shift, since I don't use the full matrix
-    double transform_matrix[3][3];
-
-    // stored so as to avoid rewriting style information constantly
-    svg image;
-
-    // where we will be storing the data points for transformation
-    std::vector<svg_plot_series> series;
-
-    // strings having to do with labels
-    std::string  x_label, title;
-
-    // axis information. y_axis stored as one point because this is a 1D graph
-    double       x_min,  x_max;
-    double       x_axis;
-    
-    double       x_major_tick;
-
-    unsigned int x_major_tick_length,  x_minor_tick_length,
-                 x_num_minor_ticks,    legend_title_font_size;
-
-    // border information for the plot window. Initially will be set to the width
-    // and height of the graph
-    int plot_window_x1, plot_window_x2, 
-        plot_window_y1, plot_window_y2;
-
-    // Yes/no questions
-    bool legend_on;
-    bool axis_on;
-    bool plot_window_on;
-    bool x_label_on;
-    bool x_major_labels_on;
-
-    // internal helper functions
-    void _transform_point(double &x);
-    void _clear_legend();
-    void _draw_legend_header(int, int, int);
-    void _draw_legend();
-    void _draw_axis();
-    void _draw_x_label();
-
-    svg_plot(const svg_plot&);
-    
-    svg_plot& operator=(const svg_plot&);
-public:
-
-    // constructors
-    svg_plot();
-    svg_plot(const std::string& file);
-
-    // output
-    svg_plot& write(const std::string&);
-    svg_plot& write(std::ostream&);
-
-    
-    // plot functions
-    void plot_range(std::vector<double>::const_iterator,
-        std::vector<double>::const_iterator, const std::string&);
-    
-    void plot_range(std::vector<double>::const_iterator, 
-        std::vector<double>::const_iterator, const std::string&, svg_color_constant);
-
-    //setters
-
-    // misc
-    svg_plot& set_image_size(unsigned int, unsigned int);
-    svg_plot& set_title(const std::string&);
-    svg_plot& set_title_font_size(unsigned int);
-    svg_plot& set_legend_title_font_size(unsigned int);
-
-    // commands
-    svg_plot& set_axis(bool);
-    svg_plot& set_legend(bool);
-    svg_plot& set_plot_window(bool);
-    svg_plot& set_x_label(bool);
-    svg_plot& set_x_major_labels(bool);
-
-    // color information    
-    svg_plot& set_title_color(svg_color_constant);
-    svg_plot& set_title_color(const svg_color&);
-
-    svg_plot& set_background_color(svg_color_constant);
-    svg_plot& set_background_color(const svg_color&);
-
-    svg_plot& set_legend_background_color(svg_color_constant);
-    svg_plot& set_legend_background_color(const svg_color&);
-
-    svg_plot& set_plot_background_color(svg_color_constant);
-    svg_plot& set_plot_background_color(const svg_color&);
-    
-    svg_plot& set_x_axis_color(svg_color_constant);
-    svg_plot& set_x_axis_color(const svg_color&);
-
-    svg_plot& set_x_major_tick_color(svg_color_constant);
-    svg_plot& set_x_major_tick_color(const svg_color&);
-
-    svg_plot& set_x_minor_tick_color(svg_color_constant);
-    svg_plot& set_x_minor_tick_color(const svg_color&);
-
-    // axis information
-    svg_plot& set_x_scale(double, double);
-
-    svg_plot& set_x_axis_width(unsigned int);
-
-    svg_plot& set_x_major_tick(double);
-    svg_plot& set_x_major_tick_length(unsigned int);
-    svg_plot& set_x_minor_tick_length(unsigned int);
-    svg_plot& set_x_num_minor_ticks(unsigned int);        
-    svg_plot& set_x_label_text(const std::string&);
-    svg_plot& set_x_major_tick_width(unsigned int);
-    svg_plot& set_x_minor_tick_width(unsigned int);
-
-    // getters
-    const std::string& get_title();
-    unsigned int get_title_font_size();
-
-    svg_color get_background_color();
-    svg_color get_legend_background_color();
-    svg_color get_axis_color();
-
-    unsigned int get_axis_width();
-};
-
-svg_plot::svg_plot(): x_label(""), x_min(-10), x_max(10), plot_window_x1(0), 
-                      plot_window_y1(0), plot_window_x2(100), 
-                      plot_window_y2(100), x_axis(50), legend_on(false),
-                      axis_on(false), x_minor_tick_length(10), 
-                      legend_title_font_size(12)
-{
-    for(int i = 0; i < 3; ++i)
-    {
-        for(int j = 0; j < 3; ++j)
-        {
-            transform_matrix[i][j] = 0;
-        }
-    }
-    
-    //to determine: reasonable default values
-    set_image_size(100, 100);
-
-    //build the document tree.. add children of the root node
-    for(int i=0; i<SVG_PLOT_DOC_CHILDREN; ++i)
-    {
-        image.add_g_element();
-    }
-}
-
-
-svg_plot& svg_plot::write(const std::string& _str)
-{
-    // Hold off drawing the legend until the very end.. it's
-    // easier to draw the size that it needs at the end than
-    // it is to 
-    // Don't bother with re-adding things if we don't need to
-
-    int x_size = image.get_x_size();
-    int y_size = image.get_y_size();
-   
-    x_axis = (plot_window_y2 + plot_window_y1)/2.;
-
-    plot_window_x1 = plot_window_y1 = 0;
-    plot_window_x2 = image.get_x_size();
-    plot_window_y2 = image.get_y_size();
-
-    if(plot_window_on)
-    {
-        plot_window_x1+=5;
-        plot_window_x2-=5;
-        plot_window_y1+=5;
-        plot_window_y2-=5;
-
-        if(axis_on)
-        {
-            plot_window_x2 -= 155;
-        }
-
-        if(x_label_on)
-        {
-            plot_window_y2 -= 20;
-        }
-
-        //for the title. Will take into account font size soon
-        plot_window_y1 +=40;
-
-        image.get_g_element(PLOT_PLOT_BACKGROUND).push_back(
-                new rect_element(plot_window_x1, plot_window_y1, 
-                        (plot_window_x2-plot_window_x1), plot_window_y2-plot_window_y1));
-    }
-
-    transform_matrix[0][0] = (plot_window_x2-plot_window_x1)/(x_max-x_min);
-    transform_matrix[0][2] = plot_window_x1 - (x_min *(plot_window_x2-plot_window_x1)/(x_max-x_min));
-        
-    if(axis_on)
-    {
-        _draw_axis();
-    }
-
-    if(legend_on)
-    {
-        _draw_legend();
-    }
-
-    if(x_label_on)
-    {
-        _draw_x_label();
-    }
-
-    double x1(0);
-
-    //draw points
-    for(unsigned int i=0; i<series.size(); ++i)
-    {
-        g_element& g_ptr = image.get_g_element(PLOT_PLOT_POINTS).add_g_element();
-        g_ptr.set_fill_color(series[i].style);
-
-        for(unsigned int j=0; j<series[i].series.size(); ++j)
-        {
-            x1 = series[i].series[j];
-
-            _transform_point(x1);
-            
-            if(x1 > plot_window_x1 && x1 < plot_window_x2)
-            {
-                image.point(x1, x_axis, g_ptr);
-            }
-        }
-    }
-
-    image.write(_str);
-
-    return *this;
-}
-
-svg_plot& svg_plot::write(std::ostream& s_out)
-{
-    if(legend_on)
-    {
-        _draw_legend();
-    }
-
-    if(axis_on)
-    {
-        _draw_axis();
-    }
-    
-    image.write(s_out);
-    
-    return (svg_plot&)*this;
-}
-
-template <class iter>
-void plot_range(svg_plot& _cont, iter _begin, iter _end, std::string _str)
-{
-    std::vector<double> vect(_begin, _end);
-
-    _cont.plot_range(vect.begin(), vect.end(), _str);
-}
-
-template <class iter>
-void plot_range(svg_plot& _cont, iter _begin, iter _end, std::string _str,
-                      svg_color_constant _col)
-{
-    std::vector<double> vect(_begin, _end);
-
-    _cont.plot_range(vect.begin(), vect.end(), _str, _col);
-}
-
-// -----------------------------------------------------------------
-// Actually draw data to the plot. Default color information
-// -----------------------------------------------------------------
-void svg_plot::plot_range(std::vector<double>::const_iterator begin,
-                            std::vector<double>::const_iterator end,
-                            const std::string& _str)
-{
-    series.push_back(svg_plot_series(begin, end, _str, svg_color(0,0,0)));
-}
-
-// -----------------------------------------------------------------
-// Actually draw data to the plot. Fill color information provided
-// -----------------------------------------------------------------
-void svg_plot::plot_range(std::vector<double>::const_iterator begin,
-                            std::vector<double>::const_iterator end,
-                            const std::string& _str,
-                            svg_color_constant _col)
-{
-    series.push_back(svg_plot_series(begin, end, _str, constant_to_rgb(_col)));
-}
-
-// -----------------------------------------------------------------
-// Miscellaneous setter methods: those with no clear, definable home
-// in another category
-//
-// set_image_size():      sets image size in pixels. (x,y) corresponds 
-//                        to point at lower right of graph
-//
-// set_title():           adds the text _title to the top of the screen
-//
-// set_title_font_size(): uses an internal variable to save state, to
-//                        avoid crashes when the title hasn't been
-//                        set yet
-//
-// set_legend_title_font_size(): As above
-// -----------------------------------------------------------------
-svg_plot& svg_plot::set_image_size(unsigned int x, unsigned int y)
-{
-    image.image_size(x, y);
-    
-    return *this;
-}
-
-svg_plot& svg_plot::set_title(const std::string& _title)
-{
-    text_element title(image.get_x_size()/2., 30, _title);
-
-    title.set_alignment(center_align);
-
-    image.get_g_element(PLOT_TITLE).push_back(new text_element(title));
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_title_font_size(unsigned int _size)
-{
-    text_element* t_ptr = static_cast<text_element*>(
-                    &(image.get_g_element(PLOT_TITLE)[0]));
-
-    t_ptr->set_font_size(_size);
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_legend_title_font_size(unsigned int _size)
-{
-    legend_title_font_size = _size;
-
-    return *this;
-}
-
-// -----------------------------------------------------------------
-// Commands: Answers to yes or no questions (Example: Show the legend?)
-//
-// set_axis(): Whether or not the axis will show
-//
-// set_legend(): Whether or not the legend will show
-//
-// set_plot_window(): Whether or not the plot will be full screen or
-// 		      in its own contained window
-//
-// set_x_label(): Whether or not the label for the X axis will show
-//
-// set_x_major_labels(): Whether or not the major ticks will have labels
-// 			 on the x-axis
-//
-//  
-// -----------------------------------------------------------------
-
-svg_plot& svg_plot::set_axis(bool _cmd)
-{
-    axis_on = _cmd;
-    return (svg_plot&)*this;
-}
-
-svg_plot& svg_plot::set_legend(bool _cmd)
-{
-    legend_on = _cmd;
-
-    return (svg_plot&)*this;
-}
-
-svg_plot& svg_plot::set_plot_window(bool _cmd)
-{
-    plot_window_on = _cmd;
-
-    return (svg_plot&)*this;
-}
-
-svg_plot& svg_plot::set_x_label(bool _cmd)
-{
-    x_label_on = _cmd;
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_x_major_labels(bool _cmd)
-{
-    x_major_labels_on = _cmd;
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_title_color(svg_color_constant _col)
-{
-    set_title_color(constant_to_rgb(_col));
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_title_color(const svg_color& _col)
-{
-    image.get_g_element(PLOT_TITLE).set_stroke_color(_col);
-    image.get_g_element(PLOT_TITLE).set_fill_color(_col);
-
-    return *this;
-}
-
-// -----------------------------------------------------------------
-// Color settings: Customization of colors found in the plot
-//
-// set_title_color(): 	   Sets the color of the plot title
-//
-// set_background_color(): Sets the color of the background. This is
-// 			   not the same as the plot window background
-//
-// set_legend_background_color():
-// 			   Sets the background color of the legend
-//
-// set_plot_background_color():
-// 			   Sets the background color of the plot area.
-// 			   If plot_window_on is not set true, this
-// 			   does not show
-//
-// set_axis_color():	   Color of the x axis + origin
-//
-// set_x_major_tick_color(): Sets the color of the major ticks on
-// 			     the x-axis
-//
-// set_x_minor_tick_color(): As above, but for minor ticks
-// -----------------------------------------------------------------
-svg_plot& svg_plot::set_background_color(svg_color_constant _col)
-{
-    set_background_color(constant_to_rgb(_col));
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_background_color(const svg_color& _col)
-{
-    image.get_g_element(PLOT_BACKGROUND).set_fill_color(_col);
-
-    image.get_g_element(PLOT_BACKGROUND).clear();
-    image.get_g_element(PLOT_BACKGROUND).push_back(
-                     new rect_element(0, 0, image.get_x_size(), 
-                     image.get_y_size()));
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_legend_background_color(svg_color_constant _col)
-{
-    set_legend_background_color(constant_to_rgb(_col));
-
-    return (svg_plot&)*this;
-}
-
-svg_plot& svg_plot::set_legend_background_color(const svg_color& _col)
-{
-    image.get_g_element(PLOT_LEGEND_BACKGROUND)
-            .set_fill_color(_col);
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_plot_background_color(svg_color_constant _col)
-{
-    image.get_g_element(PLOT_PLOT_BACKGROUND).set_fill_color(_col);
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_plot_background_color(const svg_color& _col)
-{
-    image.get_g_element(PLOT_PLOT_BACKGROUND).set_fill_color(_col);
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_x_axis_color(svg_color_constant _col)
-{
-    set_x_axis_color(constant_to_rgb(_col));
-
-    return (svg_plot&)*this;
-}
-
-svg_plot& svg_plot::set_x_axis_color(const svg_color& _col)
-{
-    image.get_g_element(PLOT_PLOT_AXIS)
-            .set_fill_color(_col);
-
-    image.get_g_element(PLOT_PLOT_AXIS)
-            .set_stroke_color(_col);
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_x_major_tick_color(const svg_color& _col)
-{
-    image.get_g_element(PLOT_X_MAJOR_TICKS).set_stroke_color(_col);
-    image.get_g_element(PLOT_X_MAJOR_TICKS).set_fill_color(_col);
-    return *this;
-}
-
-svg_plot& svg_plot::set_x_major_tick_color(svg_color_constant _col)
-{
-    set_x_major_tick_color(constant_to_rgb(_col));
-    return *this;
-}
-
-svg_plot& svg_plot::set_x_minor_tick_color(const svg_color& _col)
-{
-    image.get_g_element(PLOT_X_MINOR_TICKS).set_stroke_color(_col);
-    image.get_g_element(PLOT_X_MINOR_TICKS).set_fill_color(_col);
-    return *this;
-}
-
-
-svg_plot& svg_plot::set_x_minor_tick_color(svg_color_constant _col)
-{
-    set_x_minor_tick_color(constant_to_rgb(_col));
-    return *this;
-}
-
-// -----------------------------------------------------------------
-// Axis information: Settings for customization of axis information
-//
-// set_x_scale(): sets the left and right max values for the x axis
-//
-// set_x_axis_width(): The width of the x axis
-//
-// set_x_major_tick(): The distance between the ticks of the x_axis
-//
-// set_x_major_tick_length(): How long each tick will be
-//
-// set_x_minor_tick_length(): How long each tick will be
-//
-// set_x_num_minor_ticks(): The number of minor ticks between each
-// 			    major tick
-//
-// set_x_label_text(): Labelling for the x-axis
-//
-// set_x_major_tick_width(): Stroke width for major ticks
-// 
-// set_x_minor_tick_width(): Stroke width for minor ticks
-// -----------------------------------------------------------------
-
-svg_plot& svg_plot::set_x_scale(double x1, double x2)
-{
-    x_min = x1;
-    x_max = x2;
-
-    if(x2 <= x1)
-    {
-        throw "Illegal Argument: X scale: x2 < x1";
-    }
-
-    return (svg_plot&)*this;
-}
-
-svg_plot& svg_plot::set_x_axis_width(unsigned int _width)
-{
-    image.get_g_element(PLOT_PLOT_AXIS).set_stroke_width(_width);
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_x_major_tick(double _inter)
-{
-    x_major_tick = _inter;
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_x_major_tick_length(unsigned int _length)
-{
-    x_major_tick_length = _length;
-    return *this;
-}
-
-svg_plot& svg_plot::set_x_minor_tick_length(unsigned int _length)
-{
-    x_minor_tick_length = _length;
-    return *this;
-}
-
-svg_plot& svg_plot::set_x_num_minor_ticks(unsigned int _num)
-{
-    x_num_minor_ticks = _num;
-    return *this;
-}
-
-svg_plot& svg_plot::set_x_label_text(const std::string& _str)
-{
-    x_label = _str;
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_x_major_tick_width(unsigned int _width)
-{
-    image.get_g_element(PLOT_X_MAJOR_TICKS).set_stroke_width(_width);
-
-    return *this;
-}
-
-svg_plot& svg_plot::set_x_minor_tick_width(unsigned int _width)
-{
-    image.get_g_element(PLOT_X_MINOR_TICKS).set_stroke_width(_width);
-
-    return *this;
-}
-
-// -----------------------------------------------------------------
-// We don't use the SVG coordinate transform because then text would
-// be flipped. I'm considering using it to scale the image for resizes
-// -----------------------------------------------------------------
-void svg_plot::_transform_point(double &x)
-{
-    x = transform_matrix[0][0] * x + transform_matrix[0][2];
-}
-
-//refactor
-void svg_plot::_draw_axis()
-{
-    // one major axis. We just need to draw a vertical line through
-    // the origin for now. We will make that an option later.
-    double x1, y1, y2;
-
-    x_axis = (plot_window_y1 + plot_window_y2) / 2.;
-
-    image.line(plot_window_x1, x_axis, plot_window_x2, x_axis, 
-        image.get_g_element(PLOT_PLOT_AXIS));
-
-    x1 = 0;
-
-    _transform_point(x1);
-    
-    image.line(x1, plot_window_y1, x1, plot_window_y2, 
-        image.get_g_element(PLOT_PLOT_AXIS));
-
-    int major_tick_len = x_major_tick_length/2;
-
-    for(double i = 0; i < x_max; i += x_major_tick)
-    {
-        for(double j=i; j<i+x_major_tick; j+=x_major_tick / (x_num_minor_ticks+1))
-        {
-            y1 = x_axis + x_minor_tick_length/2.;
-            y2 = x_axis - x_minor_tick_length/2.;
-
-            x1=j;
-
-            _transform_point(x1);
-
-            //make sure that we are drawing inside of the allowed window
-            if(x1 < plot_window_x2)
-            {
-                image.line(x1, y1, x1, y2, 
-                    image.get_g_element(PLOT_X_MINOR_TICKS));
-            }
-        }
-
-        y1 = x_axis + x_major_tick_length/2;
-        y2 = x_axis - x_major_tick_length/2;
-    
-        x1=i;
-
-        _transform_point(x1);
-
-        //make sure that we are drawing inside of the allowed window
-        if(x1 < plot_window_x2)
-        {
-            image.line(x1, y1, x1, y2, 
-                image.get_g_element(PLOT_X_MAJOR_TICKS));
-
-            
-            if(x_major_labels_on)
-            {
-                std::stringstream fmt;
-                fmt<<i;
-
-                image.text(x1, y1 + (2 + x_major_tick_length/2), fmt.str());
-            }
-        }
-    }
-
-    for(double i = 0; i > x_min; i -= x_major_tick)
-    {
-        for(double j=i; j>i-x_major_tick; j-=x_major_tick / (x_num_minor_ticks+1))
-        {
-            y1 = x_axis + x_minor_tick_length/2.;
-            y2 = x_axis - x_minor_tick_length/2.;
-
-            x1=j;
-
-            _transform_point(x1);
-
-            //make sure that we are drawing inside of the allowed window
-            if(x1 > plot_window_x1)
-            {
-                image.line(x1, y1, x1, y2, 
-                    image.get_g_element(PLOT_X_MINOR_TICKS));
-            }
-        }
-        y1 = x_axis+major_tick_len;
-        y2 = x_axis-major_tick_len;
-    
-        x1=i;
-
-        _transform_point(x1);
-
-        if(x1 > plot_window_x1)
-        {
-            image.line(x1, y1, x1, y2, 
-                image.get_g_element(PLOT_X_MAJOR_TICKS));
-
-            if(x_major_labels_on)
-            {
-                std::stringstream fmt;
-                fmt<<i;
-
-                image.text(x1, y1 + (2 + x_major_tick_length/2), fmt.str());
-            }
-        }
-    }
-}
-
-// -----------------------------------------------------------------
-// When writing to multiple documents, the contents of the plot
-// may change significantly between. Rather than figuring out what
-// has and has not changed, just erase the contents of the legend
-// in the document and start over.
-// -----------------------------------------------------------------
-void svg_plot::_clear_legend()
-{
-    g_element* g_ptr = &(image.get_g_element(PLOT_LEGEND_POINTS));
-
-    g_ptr->clear();
-
-    g_ptr = &(image.get_g_element(PLOT_LEGEND_TEXT));
-    g_ptr->clear();
-}
-
-// -----------------------------------------------------------------
-// Factored out to make _draw_legend() cleaner
-//
-// This function has some "magic" values that could be removed
-// or abstracted
-// -----------------------------------------------------------------
-void svg_plot::_draw_legend_header(int _x, int _y, int _width)
-{
-    // 2 added to y argument for padding.
-    text_element legend_header(_x+(_width/2), _y + legend_title_font_size + 2, "Legend");
-
-    legend_header.set_alignment(center_align);
-    legend_header.set_font_size(legend_title_font_size);
-
-    image.get_g_element(PLOT_LEGEND_TEXT).push_back(new text_element(legend_header));
-}
-
-// -----------------------------------------------------------------
-// Important note: there are a lot of magic numbers that are temporary
-// fill-ins for the time when the legend system is more configurable.
-// This will happen bit-by-bit, as I give the user options to change
-// these values
-//
-// The legend will soon be a percentage of the window, which will
-// remove some of the magic values
-// -----------------------------------------------------------------
-void svg_plot::_draw_legend()
-{
-    _clear_legend();
-
-    int num_points = (int)(series.size());
-
-    int legend_width(150);
-    int legend_height(25);
-
-    int x_size = image.get_x_size();
-
-    // Figure out how wide the legend should be
-    if(x_size < 200)
-    {
-       legend_width = (int)x_size; 
-    }
-
-    int legend_x_start(plot_window_x2 + 5);
-    int legend_y_start(plot_window_y1);
-
-    // legend_height = title_spacing + (space per element)(num_elements)
-    //                  + (end spacing)
-    legend_height = (int)(legend_title_font_size*1.5 + (25 * num_points) + 10);
-
-    // TODO: Figure out how tall the legend should be
-
-    image.get_g_element(PLOT_LEGEND_BACKGROUND).set_stroke_color(svg_color(102, 102, 84));
-    g_element* g_ptr = &(image.get_g_element(PLOT_LEGEND_BACKGROUND));
-
-    g_ptr->push_back(new rect_element(legend_x_start, 
-			             legend_y_start,
-                         legend_width, 
-				         legend_height));
-
-    _draw_legend_header(legend_x_start, legend_y_start, legend_width);
-
-    g_ptr = &(image.get_g_element(PLOT_LEGEND_POINTS));
-
-    g_element* g_inner_ptr = g_ptr;
-
-    for(unsigned int i=0; i<series.size(); ++i)
-    {
-        g_inner_ptr = &(g_ptr->add_g_element());
-
-        g_inner_ptr->set_fill_color(series[i].style);
-        g_inner_ptr->set_stroke_color(series[i].style);
-
-        g_inner_ptr->push_back(new point_element(legend_x_start + 25,
-                        legend_y_start + legend_title_font_size + 20 + i*25));
-
-        g_inner_ptr->push_back(new text_element(legend_x_start + 40,
-                        legend_y_start + legend_title_font_size + 25 + i*25,
-                        series[i].title));
-    }
-}
-
-void svg_plot::_draw_x_label()
-{
-    text_element to_use((plot_window_x2 + plot_window_x1) / 2., image.get_y_size() - 8, x_label);
-
-    to_use.set_font_size(12);
-    to_use.set_alignment(center_align);
-
-    image.get_g_element(PLOT_X_LABEL).set_stroke_color(white);
-    image.get_g_element(PLOT_X_LABEL).set_fill_color(white);
-
-
-    image.get_g_element(PLOT_X_LABEL).push_back(new text_element(to_use));
-}
-
-const std::string& svg_plot::get_title()
-{
-    return title;
-}
-
-unsigned int svg_plot::get_title_font_size()
-{
-    return (static_cast<text_element*>(
-                &(image.get_g_element(PLOT_TITLE)[0])))->get_font_size();
-    return 0;
-}
-
-svg_color svg_plot::get_background_color()
-{
-    return image.get_g_element(PLOT_BACKGROUND).get_fill_color();
-    return svg_color(0,0,0);
-}
-
-svg_color svg_plot::get_legend_background_color()
-{
-    return image.get_g_element(PLOT_LEGEND_BACKGROUND).get_fill_color();
-    return svg_color(0,0,0);
-}
-
-svg_color svg_plot::get_axis_color()
-{
-    return image.get_g_element(PLOT_PLOT_AXIS).get_stroke_color();
-    return svg_color(0,0,0);
-}
-
-unsigned int svg_plot::get_axis_width()
-{
-    return image.get_g_element(PLOT_PLOT_AXIS).get_stroke_width();
-}
-
-
-}
-}
-
-#endif
-
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg_test.cpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg_test.cpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg_test.cpp	2007-07-02 20:42:10 EDT (Mon, 02 Jul 2007)
@@ -1,16 +1,18 @@
-#include <vector>
-#include <deque>
+#include <map>
 #include <cmath>
 #include <boost/array.hpp>
 
-#include "svg_plot.hpp"
+#include "svg_1d_plot.hpp"
+#include "svg_2d_plot.hpp"
 
+using std::multimap;
+using std::deque;
+using boost::array;
 using namespace boost::svg;
-using namespace std;
 
 double f(double x)
 {
-    return (x*x)/2.;
+    return sqrt(x);
 }
 
 double g(double x)
@@ -25,30 +27,25 @@
 
 int main()
 {
-  double start = 0, finish = 10;
 
-    vector<double> data1;
-    deque<double> data2;
-    boost::array<double, 10> data3;
-
-    double inter = 3.1415926535 / 1.;
-    
-    int j=0;
-    for(double i = start; i <= finish; i += inter, ++j)
+    double start = 0, finish = 10;
+
+    multimap<double, double> data;
+
+    svg_2d_plot my_plot;
+
+    for(double i=0; i<10; ++i)
     {
-        data1.push_back(f(i));
-        data2.push_back(g(i));
-        data3[j] = h(i);
+        data.insert(std::pair<double,double>(i,f(i)));
     }
 
-    svg_plot my_plot;
-
     // size/scale settings
     my_plot.set_image_size(500, 350)
-           .set_x_scale(-3, 10);
+           .set_x_scale(-1, 10)
+           .set_y_scale(-1, 5);
 
     // Text settings
-    my_plot.set_title("Oh My!")
+    my_plot.set_title("2D Graph Test")
            .set_title_font_size(29)
            .set_x_label_text("Time in Months");
 
@@ -57,33 +54,47 @@
            .set_legend(true)
            .set_plot_window(true)
            .set_x_label(true)
-           .set_x_major_labels(true);
+           .set_x_major_labels(true)
+           .set_y_major_labels(true);
 
     // color settings
     my_plot.set_background_color(svg_color(67, 111, 69))
            .set_legend_background_color(svg_color(207, 202,167))
            .set_plot_background_color(svg_color(136, 188, 126))
            .set_title_color(white)
+
            .set_x_axis_color(black)
+           .set_y_axis_color(black)
+
            .set_x_major_tick_color(black)
-           .set_x_minor_tick_color(black);
+           .set_y_major_tick_color(black)
+
+           .set_legend_border_color(svg_color(102, 102, 84))
+
+           .set_x_minor_tick_color(black)
+           .set_y_minor_tick_color(black);
 
     //axis settings
     my_plot.set_x_major_tick(2)
-           .set_x_num_minor_ticks(3)
+           .set_x_num_minor_ticks(2)
            .set_x_major_tick_length(14)
            .set_x_minor_tick_length(7)
-           .set_x_major_tick_width(1)
-           .set_x_minor_tick_width(1);
+           .set_x_major_tick_width(2)
+           .set_x_minor_tick_width(1)
+
+           .set_y_major_tick(3)
+           .set_y_num_minor_ticks(2)
+           .set_y_major_tick_length(20)
+           .set_y_minor_tick_length(10)
+           .set_y_major_tick_width(2)
+           .set_y_minor_tick_width(1);
 
     //legend settings
     my_plot.set_legend_title_font_size(15);
 
-    plot_range(my_plot, data2.begin(), data2.end(), "Lions",  blue);
-    plot_range(my_plot, data1.begin(), data1.end(), "Tigers", purple);
-    plot_range(my_plot, data3.begin(), data3.end(), "Bears",  red);
+    plot_range(my_plot, data.begin(), data.end(), "sqrt(x)",  blue);
 
-    my_plot.write("./test.svg");
+    my_plot.write("D:/test.svg");
 
     return 0;
 }