1
0
mirror of https://github.com/aportelli/LatAnalyze.git synced 2024-11-15 10:15:35 +00:00
LatAnalyze/lib/Core/Plot.hpp

409 lines
10 KiB
C++
Raw Normal View History

/*
* Plot.hpp, part of LatAnalyze 3
*
2020-01-13 09:57:06 +00:00
* Copyright (C) 2013 - 2020 Antonin Portelli
*
* LatAnalyze 3 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* LatAnalyze 3 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef Latan_Plot_hpp_
#define Latan_Plot_hpp_
2014-03-13 18:51:01 +00:00
#include <LatAnalyze/Global.hpp>
#include <LatAnalyze/Functional/Function.hpp>
#include <LatAnalyze/Core/Mat.hpp>
#include <LatAnalyze/Statistics/MatSample.hpp>
#include <LatAnalyze/Statistics/Histogram.hpp>
#include <LatAnalyze/Statistics/XYStatData.hpp>
// gnuplot default parameters
#ifndef GNUPLOT_BIN
#define GNUPLOT_BIN "gnuplot"
#endif
#ifndef GNUPLOT_ARGS
#define GNUPLOT_ARGS "-p"
#endif
BEGIN_LATAN_NAMESPACE
/******************************************************************************
2014-03-03 12:41:48 +00:00
* Plot objects *
******************************************************************************/
2014-03-03 12:41:48 +00:00
class PlotObject
{
public:
2014-02-20 22:54:11 +00:00
// destructor
2014-03-03 12:41:48 +00:00
virtual ~PlotObject(void) = default;
// access
2016-04-05 12:51:00 +01:00
std::string popTmpFile(void);
const std::string & getCommand(void) const;
const std::string & getHeadCommand(void) const;
2014-03-03 12:41:48 +00:00
// test
2016-04-05 12:51:00 +01:00
bool gotTmpFile(void) const;
protected:
2014-03-03 12:41:48 +00:00
// access
void pushTmpFile(const std::string &fileName);
void setCommand(const std::string &command);
2015-06-26 20:33:57 +01:00
void setHeadCommand(const std::string &command);
2014-03-03 18:33:53 +00:00
// dump a matrix to a temporary file
std::string dumpToTmpFile(const DMat &m);
2014-03-03 12:41:48 +00:00
private:
// plot command
std::string command_;
2015-06-26 20:33:57 +01:00
std::string headCommand_;
2014-03-03 12:41:48 +00:00
// stack of created temporary files
std::stack<std::string> tmpFileName_;
};
class PlotCommand: public PlotObject
{
public:
2014-03-03 18:33:53 +00:00
// constructor
2014-03-03 12:41:48 +00:00
explicit PlotCommand(const std::string &command);
// destructor
virtual ~PlotCommand(void) = default;
};
2015-06-26 20:33:57 +01:00
class PlotHeadCommand: public PlotObject
{
public:
// constructor
explicit PlotHeadCommand(const std::string &command);
// destructor
virtual ~PlotHeadCommand(void) = default;
};
2014-03-03 12:41:48 +00:00
class PlotData: public PlotObject
{
public:
2014-03-03 18:33:53 +00:00
// constructor
2015-07-07 18:50:36 +01:00
PlotData(const DMatSample &x, const DMatSample &y);
PlotData(const DVec &x, const DMatSample &y);
PlotData(const DMatSample &x, const DVec &y);
PlotData(const XYStatData &data, const Index i = 0, const Index j = 0);
2014-03-03 12:41:48 +00:00
// destructor
virtual ~PlotData(void) = default;
2014-03-03 18:33:53 +00:00
};
2015-02-13 15:26:00 +00:00
class PlotHLine: public PlotObject
{
public:
// constructor
PlotHLine(const double y);
// destructor
virtual ~PlotHLine(void) = default;
};
2019-03-21 17:40:13 +00:00
class PlotLine: public PlotObject
{
public:
// constructor
PlotLine(const DVec &x, const DVec &y);
// destructor
virtual ~PlotLine(void) = default;
};
2016-06-14 12:33:27 +01:00
class PlotBand: public PlotObject
{
public:
// constructor
PlotBand(const double xMin, const double xMax, const double yMin,
const double yMax, const double opacity = 0.15);
// destructor
virtual ~PlotBand(void) = default;
};
2014-03-03 18:33:53 +00:00
class PlotFunction: public PlotObject
{
public:
// constructor
PlotFunction(const DoubleFunction &function, const double xMin,
2014-04-17 12:19:13 +01:00
const double xMax, const unsigned int nPoint = 1000);
2014-03-03 18:33:53 +00:00
// destructor
virtual ~PlotFunction(void) = default;
2014-03-03 12:41:48 +00:00
};
2014-04-18 11:29:17 +01:00
class PlotPredBand: public PlotObject
{
public:
// constructor
2019-04-26 16:33:38 +01:00
PlotPredBand(const DVec &x, const DVec &y, const DVec &yerr,
const double opacity = 0.15);
2014-04-18 11:29:17 +01:00
PlotPredBand(const DoubleFunctionSample &function, const double xMin,
const double xMax, const unsigned int nPoint = 1000,
const double opacity = 0.15);
// destructor
virtual ~PlotPredBand(void) = default;
2019-04-26 16:33:38 +01:00
private:
void makePredBand(const DMat &low, const DMat &high, const double opacity);
2014-04-18 11:29:17 +01:00
};
class PlotHistogram: public PlotObject
{
public:
// constructor
PlotHistogram(const Histogram &h);
// destructor
virtual ~PlotHistogram(void) = default;
};
2019-03-09 22:45:44 +00:00
class PlotImpulses: public PlotObject
{
public:
// constructor
PlotImpulses(const DVec &x, const DVec &y);
// destructor
virtual ~PlotImpulses(void) = default;
};
2016-04-05 12:51:00 +01:00
class PlotMatrixNoRange: public PlotObject
{
public:
// constructor
PlotMatrixNoRange(const DMat &m);
// destructor
virtual ~PlotMatrixNoRange(void) = default;
};
#define PlotMatrix(m)\
PlotRange(Axis::x, -.5, (m).cols() - .5) <<\
2016-04-06 18:38:37 +01:00
PlotRange(Axis::y, (m).rows() - .5, -.5) <<\
2016-04-05 12:51:00 +01:00
PlotMatrixNoRange(m)
/******************************************************************************
2014-03-03 12:41:48 +00:00
* Plot modifiers *
******************************************************************************/
2014-03-03 12:41:48 +00:00
enum class Axis {x = 0, y = 1};
struct Range
{
double min, max;
};
struct PlotOptions
{
std::string terminal;
std::string output;
std::string caption;
std::string title;
unsigned int scaleMode[2];
Range scale[2];
std::string label[2];
std::string lineColor;
2019-03-19 20:26:50 +00:00
int lineWidth;
2019-03-25 23:20:25 +00:00
std::string dashType;
std::vector<std::string> palette;
2014-03-03 12:41:48 +00:00
};
class PlotModifier
{
public:
// destructor
virtual ~PlotModifier(void) = default;
// modifier
virtual void operator()(PlotOptions &option) const = 0;
};
2014-06-02 16:04:20 +01:00
class Caption: public PlotModifier
{
public:
// constructor
explicit Caption(const std::string &title);
// destructor
virtual ~Caption(void) = default;
// modifier
virtual void operator()(PlotOptions &option) const;
private:
const std::string caption_;
};
2015-02-13 15:26:00 +00:00
class Label: public PlotModifier
{
public:
// constructor
explicit Label(const std::string &label, const Axis axis);
// destructor
virtual ~Label(void) = default;
// modifier
virtual void operator()(PlotOptions &option) const;
private:
const std::string label_;
const Axis axis_;
};
2014-03-03 12:41:48 +00:00
class Color: public PlotModifier
{
public:
// constructor
explicit Color(const std::string &color);
// destructor
virtual ~Color(void) = default;
// modifier
virtual void operator()(PlotOptions &option) const;
private:
const std::string color_;
};
2019-03-19 20:26:50 +00:00
class LineWidth: public PlotModifier
{
public:
// constructor
explicit LineWidth(const unsigned int width);
// destructor
virtual ~LineWidth(void) = default;
// modifier
virtual void operator()(PlotOptions &option) const;
private:
const unsigned width_;
};
2019-03-25 23:20:25 +00:00
class Dash: public PlotModifier
{
public:
// constructor
explicit Dash(const std::string &dash);
// destructor
virtual ~Dash(void) = default;
// modifier
virtual void operator()(PlotOptions &option) const;
private:
const std::string dash_;
};
2014-03-03 12:41:48 +00:00
class LogScale: public PlotModifier
{
public:
// constructor
explicit LogScale(const Axis axis);
// destructor
virtual ~LogScale(void) = default;
// modifier
virtual void operator()(PlotOptions &option) const;
private:
const Axis axis_;
};
class PlotRange: public PlotModifier
{
public:
2014-09-18 17:13:26 +01:00
// constructors
PlotRange(const Axis axis);
2014-03-03 14:21:37 +00:00
PlotRange(const Axis axis, const double min, const double max);
2014-03-03 12:41:48 +00:00
// destructor
virtual ~PlotRange(void) = default;
// modifier
virtual void operator()(PlotOptions &option) const;
private:
const Axis axis_;
2014-09-18 17:13:26 +01:00
const bool reset_;
2014-03-03 12:41:48 +00:00
const double min_, max_;
};
2014-04-18 11:29:17 +01:00
class Terminal: public PlotModifier
{
public:
// constructor
Terminal(const std::string &terminal, const std::string &options = "");
// destructor
virtual ~Terminal(void) = default;
// modifier
virtual void operator()(PlotOptions &option) const;
private:
const std::string terminalCmd_;
};
2014-03-17 14:57:46 +00:00
class Title: public PlotModifier
{
public:
// constructor
explicit Title(const std::string &title);
// destructor
virtual ~Title(void) = default;
// modifier
virtual void operator()(PlotOptions &option) const;
private:
const std::string title_;
};
class Palette: public PlotModifier
{
public:
static const std::vector<std::string> category10;
public:
// constructor
explicit Palette(const std::vector<std::string> &palette);
// destructor
virtual ~Palette(void) = default;
// modifier
virtual void operator()(PlotOptions &option) const;
private:
const std::vector<std::string> palette_;
};
2014-03-03 12:41:48 +00:00
/******************************************************************************
* Plot class *
******************************************************************************/
class Plot
{
public:
class Scale
{
public:
enum
{
reset = 0,
manual = 1 << 0,
log = 1 << 1
};
};
public:
// constructor/destructor
2014-04-03 09:00:53 +01:00
Plot(void);
virtual ~Plot(void) = default;
2014-03-03 12:41:48 +00:00
// plot operations
Plot & operator<<(PlotObject &&command);
Plot & operator<<(PlotModifier &&modifier);
// plot parsing and output
void display(void);
void save(std::string dirName, bool savePdf = true);
friend std::ostream & operator<<(std::ostream &out, const Plot &plot);
2014-04-03 09:00:53 +01:00
// plot reset
void reset(void);
// find gnuplot
2020-01-10 15:15:46 +00:00
std::string getProgramPath(void);
private:
2014-04-03 09:00:53 +01:00
// default options
void initOptions(void);
private:
// gnuplot execution parameters
2014-03-03 12:41:48 +00:00
std::string gnuplotBin_ {GNUPLOT_BIN};
std::string gnuplotArgs_ {GNUPLOT_ARGS};
std::string gnuplotPath_ {""};
// string buffer for commands
std::ostringstream commandBuffer_;
// stack of created temporary files
2014-09-18 17:13:26 +01:00
std::vector<std::string> tmpFileName_;
// plot content
2014-03-03 12:41:48 +00:00
PlotOptions options_;
std::vector<std::string> headCommand_;
std::vector<std::string> plotCommand_;
};
std::ostream & operator<<(std::ostream &out, const Plot &plot);
END_LATAN_NAMESPACE
#endif // Latan_Plot_hpp_