add support for gnuplot error bars
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Tue, 11 Dec 2007 15:49:23 +0100
changeset 2180 8cbdda2a5c2d
parent 2178 763aa96fffd4
child 2181 d20872e8c2dd
child 2264 821ccc610c55
add support for gnuplot error bars
src/contrib/gnuplot.cc
src/contrib/gnuplot.h
--- a/src/contrib/gnuplot.cc	Tue Dec 11 10:25:34 2007 +0100
+++ b/src/contrib/gnuplot.cc	Tue Dec 11 15:49:23 2007 +0100
@@ -18,13 +18,15 @@
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
 #include "gnuplot.h"
+#include "ns3/assert.h"
 #include <ostream>
 
 namespace ns3 {
 
 GnuplotDataset::GnuplotDataset (std::string title)
   : m_title (title),
-    m_style (LINES)
+    m_style (LINES),
+    m_errorBars (NONE)
 {}
 void 
 GnuplotDataset::SetStyle (enum Style style)
@@ -32,9 +34,31 @@
   m_style = style;
 }
 void 
+GnuplotDataset::SetErrorBars (enum ErrorBars errorBars)
+{
+  m_errorBars = errorBars;
+}
+void 
 GnuplotDataset::Add (double x, double y)
 {
-  m_dataset.push_back (std::make_pair (x,y));
+  NS_ASSERT (m_errorBars == NONE);
+  struct Data data;
+  data.x = x;
+  data.y = y;
+  data.dx = 0.0;
+  data.dy = 0.0;
+  m_dataset.push_back (data);
+}
+void 
+GnuplotDataset::Add (double x, double y, double errorDelta)
+{
+  NS_ASSERT (m_errorBars == X || m_errorBars == Y);
+  struct Data data;
+  data.x = x;
+  data.y = y;
+  data.dx = errorDelta;
+  data.dy = errorDelta;
+  m_dataset.push_back (data);
 }
 
 Gnuplot::Gnuplot (std::string pngFilename)
@@ -67,13 +91,41 @@
       os << "'-' title '" << (*i)->m_title << "'";
       switch ((*i)->m_style) {
       case GnuplotDataset::LINES:
-	os << " with lines";
+        os << " with lines";
 	break;
       case GnuplotDataset::POINTS:
-	os << " with points";
+        switch ((*i)->m_errorBars)
+          {
+          case GnuplotDataset::NONE:
+            os << " with points";
+            break;
+          case GnuplotDataset::X:
+            os << " with xerrorbars";
+            break;
+          case GnuplotDataset::Y:
+            os << " with yerrorbars";
+            break;
+          case GnuplotDataset::XY:
+            os << " with xyerrorbars";
+            break;
+          }
 	break;
       case GnuplotDataset::LINES_POINTS:
-	os << " with linespoints";
+        switch ((*i)->m_errorBars)
+          {
+          case GnuplotDataset::NONE:
+            os << " with linespoints";
+            break;
+          case GnuplotDataset::X:
+            os << " with xerrorlines";
+            break;
+          case GnuplotDataset::Y:
+            os << " with yerrorlines";
+            break;
+          case GnuplotDataset::XY:
+            os << " with xyerrorlines";
+            break;
+          }
 	break;
       case GnuplotDataset::DOTS:
 	os << " with dots";
@@ -103,7 +155,20 @@
       for (GnuplotDataset::Dataset::const_iterator j = (*i)->m_dataset.begin ();
 	   j != (*i)->m_dataset.end (); j++)
 	{
-	  os << j->first << " " << j->second << std::endl;
+          switch ((*i)->m_errorBars) {
+          case GnuplotDataset::NONE:
+            os << j->x << " " << j->y << std::endl;
+            break;
+          case GnuplotDataset::X:
+            os << j->x << " " << j->y << " " << j->dx << std::endl;
+            break;
+          case GnuplotDataset::Y:
+            os << j->x << " " << j->y << " " << j->dy << std::endl;
+            break;
+          case GnuplotDataset::XY:
+            os << j->x << " " << j->y << " " << j->dx << " " << j->dy << std::endl;
+            break;
+          }
 	}
       os << "e" << std::endl;
     }
--- a/src/contrib/gnuplot.h	Tue Dec 11 10:25:34 2007 +0100
+++ b/src/contrib/gnuplot.h	Tue Dec 11 15:49:23 2007 +0100
@@ -39,16 +39,32 @@
     FSTEPS,
     HISTEPS,
   };
+  enum ErrorBars {
+    NONE,
+    X,
+    Y,
+    XY
+  };
 
   GnuplotDataset (std::string title);
   void SetStyle (enum Style style);
+  void SetErrorBars (enum ErrorBars errorBars);
   void Add (double x, double y);
+  void Add (double x, double y, double errorDelta);
+  void Add (double x, double y, double errorDeltaX, double errorDeltaY);
 private:
   friend class Gnuplot;
-  typedef std::vector<std::pair<double,double> > Dataset;
+  struct Data {
+    double x;
+    double y;
+    double dx;
+    double dy;
+  };
+  typedef std::vector<struct Data> Dataset;
   Dataset m_dataset;
   std::string m_title;
   enum Style m_style;
+  enum ErrorBars m_errorBars;
 };
 
 class Gnuplot