Gnuplot-iostream interface

This interface allows gnuplot to be controlled from C++ and is designed to
be the lowest hanging fruit. In other words, if you know how gnuplot works
it should only take 30 seconds to learn this library. Basically it is just
an iostream pipe to gnuplot with some extra functions for pushing data
arrays and getting mouse clicks. Data sources include STL containers (eg.
vector), Blitz++, and armadillo. You can use nested data types like
std::vector<std::vector<std::pair<double, double>>> (as well as even more
exotic types). Support for custom data types is possible.

This is a low level interface, and usage involves manually sending commands
to gnuplot using the "<<" operator (so you need to know gnuplot syntax).
This is in my opinion the easiest way to do it if you are already
comfortable with using gnuplot. If you would like a more high level interface
check out the gnuplot-cpp library
(http://code.google.com/p/gnuplot-cpp).

Download

To retrieve the source code from git:

git clone https://github.com/dstahlke/gnuplot-iostream.git

Documentation

Documentation is available
[here]
but also you can look at the example programs (starting with
"example-misc.cc").

Example 1

// Demo of vector plot.// Compile it with:// g++ -o example-vector example-vector.cc -lboost_iostreams -lboost_system -lboost_filesystem#include <vector>#include <cmath>#include <boost/tuple/tuple.hpp>#include "gnuplot-iostream.h"intmain(){Gnuplotgp;// Create a script which can be manually fed into gnuplot later:// Gnuplot gp(">script.gp");// Create script and also feed to gnuplot:// Gnuplot gp("tee plot.gp | gnuplot -persist");// Or choose any of those options at runtime by setting the GNUPLOT_IOSTREAM_CMD// environment variable.// Gnuplot vectors (i.e. arrows) require four columns: (x,y,dx,dy)std::vector<boost::tuple<double,double,double,double>>pts_A;// You can also use a separate container for each column, like so:std::vector<double>pts_B_x;std::vector<double>pts_B_y;std::vector<double>pts_B_dx;std::vector<double>pts_B_dy;// You could also use:// std::vector<std::vector<double> >// boost::tuple of four std::vector's// std::vector of std::tuple (if you have C++11)// arma::mat (with the Armadillo library)// blitz::Array<blitz::TinyVector<double, 4>, 1> (with the Blitz++ library)// ... or anything of that sortfor(doublealpha=0;alpha<1;alpha+=1.0/24.0){doubletheta=alpha*2.0*3.14159;pts_A.push_back(boost::make_tuple(cos(theta),sin(theta),-cos(theta)*0.1,-sin(theta)*0.1));pts_B_x.push_back(cos(theta)*0.8);pts_B_y.push_back(sin(theta)*0.8);pts_B_dx.push_back(sin(theta)*0.1);pts_B_dy.push_back(-cos(theta)*0.1);}// Don't forget to put "\n" at the end of each line!gp<<"set xrange [-2:2]\nset yrange [-2:2]\n";// '-' means read from stdin. The send1d() function sends data to gnuplot's stdin.gp<<"plot '-' with vectors title 'pts_A', '-' with vectors title 'pts_B'\n";gp.send1d(pts_A);gp.send1d(boost::make_tuple(pts_B_x,pts_B_y,pts_B_dx,pts_B_dy));#ifdef _WIN32// For Windows, prompt for a keystroke before the Gnuplot object goes out of scope so that// the gnuplot window doesn't get closed.std::cout<<"Press enter to exit."<<std::endl;std::cin.get();#endif}

Example 2

// Demo of sending data via temporary files. The default is to send data to gnuplot directly// through stdin.//// Compile it with:// g++ -o example-tmpfile example-tmpfile.cc -lboost_iostreams -lboost_system -lboost_filesystem#include <map>#include <vector>#include <cmath>#include "gnuplot-iostream.h"intmain(){Gnuplotgp;std::vector<std::pair<double,double>>xy_pts_A;for(doublex=-2;x<2;x+=0.01){doubley=x*x*x;xy_pts_A.push_back(std::make_pair(x,y));}std::vector<std::pair<double,double>>xy_pts_B;for(doublealpha=0;alpha<1;alpha+=1.0/24.0){doubletheta=alpha*2.0*3.14159;xy_pts_B.push_back(std::make_pair(cos(theta),sin(theta)));}gp<<"set xrange [-2:2]\nset yrange [-2:2]\n";// Data will be sent via a temporary file. These are erased when you call// gp.clearTmpfiles() or when gp goes out of scope. If you pass a filename// (e.g. "gp.file1d(pts, 'mydata.dat')"), then the named file will be created// and won't be deleted (this is useful when creating a script).gp<<"plot"<<gp.file1d(xy_pts_A)<<"with lines title 'cubic',"<<gp.file1d(xy_pts_B)<<"with points title 'circle'"<<std::endl;#ifdef _WIN32// For Windows, prompt for a keystroke before the Gnuplot object goes out of scope so that// the gnuplot window doesn't get closed.std::cout<<"Press enter to exit."<<std::endl;std::cin.get();#endif}