2018-11-25 21:53:26 +08:00
/*
2020-08-26 18:58:23 +08:00
Copyright ( c ) 2008 - 2020 Jan W . Krieger ( < jan @ jkrieger . de > )
2018-11-25 21:53:26 +08:00
This software is free software : you can redistribute it and / or modify
it under the terms of the GNU Lesser General Public License ( LGPL ) as published by
2019-02-08 00:24:46 +08:00
the Free Software Foundation , either version 2.1 of the License , or
2018-11-25 21:53:26 +08:00
( at your option ) any later version .
This program 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 Lesser General Public License ( LGPL ) for more details .
You should have received a copy of the GNU Lesser General Public License ( LGPL )
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include <QString>
# include <QPainter>
# include <QPair>
2019-05-30 04:40:02 +08:00
# include "jkqtplotter/jkqtptools.h"
2019-06-22 20:21:32 +08:00
# include "jkqtplotter/jkqtplotter_imexport.h"
2019-05-30 04:40:02 +08:00
# include "jkqtplotter/jkqtpimagetools.h"
2018-12-19 00:13:18 +08:00
# include "jkqtplotter/jkqtpgraphsbase.h"
2019-02-08 00:24:46 +08:00
# include "jkqtplotter/jkqtpgraphsbaseerrors.h"
2019-04-22 19:27:50 +08:00
# include "jkqtplotter/jkqtpgraphsbasestylingmixins.h"
2020-09-17 22:59:57 +08:00
# include "jkqtplotter/graphs/jkqtpbarchartbase.h"
2018-12-19 00:13:18 +08:00
# ifndef jkqtpgraphsbarchart_H
# define jkqtpgraphsbarchart_H
2018-11-25 21:53:26 +08:00
2020-09-17 22:59:57 +08:00
/*! \brief This implements a bar graph with bars starting at \f$ yoverride \f$ to \f$ y=f(x) \f$
2019-01-13 01:53:16 +08:00
\ ingroup jkqtplotter_barssticks
2018-11-25 21:53:26 +08:00
This class plots a bargraph . This image explains the parameters :
\ image html bargraph_basics . png
By default the sift parameter is , so the bar is centered at the x - value . The width is 0.9 ,
so adjacent bars are plotted with a small distance between them . It is possible to use these two parameters
2019-04-22 19:27:50 +08:00
to plot multiple bars for every x - value , by having on JKQTPSpecialLineHorizontalGraph object per
2018-11-25 21:53:26 +08:00
set of bars that belong together . For example for three bars per x - value one would set :
\ verbatim
2020-09-17 22:59:57 +08:00
widthoverride .3
2018-11-25 21:53:26 +08:00
shift = - 0.3 / 0 / + 0.3
\ endverbatim
This results in a bargraph , as shown here :
\ image html plot_bargraphverplot . png
2019-01-20 23:15:10 +08:00
You can use JKQTPlotter : : addHorizontalBargraph ( ) to add a series of bargraphs , where the width and shift are determined
2018-11-25 21:53:26 +08:00
automatically . The y - columns are given as a QVector < int > to this function .
2019-06-13 16:27:06 +08:00
\ see JKQTPBarHorizontalGraph , \ ref JKQTPlotterBarcharts , jkqtpstatAddHHistogram1D ( ) , jkqtpstatAddHHistogram1DAutoranged ( )
2018-11-25 21:53:26 +08:00
*/
2020-09-17 22:59:57 +08:00
class JKQTPLOTTER_LIB_EXPORT JKQTPBarVerticalGraph : public JKQTPBarGraphBase {
2018-11-25 21:53:26 +08:00
Q_OBJECT
public :
/** \brief class constructor */
2019-01-20 17:49:29 +08:00
JKQTPBarVerticalGraph ( JKQTBasePlotter * parent = nullptr ) ;
2018-11-25 21:53:26 +08:00
/** \brief class constructor */
2019-01-20 23:15:10 +08:00
JKQTPBarVerticalGraph ( JKQTPlotter * parent ) ;
2018-11-25 21:53:26 +08:00
/** \brief plots the graph to the plotter object specified as parent */
2018-12-28 05:52:00 +08:00
virtual void draw ( JKQTPEnhancedPainter & painter ) override ;
2018-11-25 21:53:26 +08:00
/** \brief get the maximum and minimum x-value of the graph
*
* The result is given in the two parameters which are call - by - reference parameters !
*/
2018-12-28 05:52:00 +08:00
virtual bool getXMinMax ( double & minx , double & maxx , double & smallestGreaterZero ) override ;
2018-11-25 21:53:26 +08:00
/** \brief get the maximum and minimum y-value of the graph
*
* The result is given in the two parameters which are call - by - reference parameters !
*/
2018-12-28 05:52:00 +08:00
virtual bool getYMinMax ( double & miny , double & maxy , double & smallestGreaterZero ) override ;
2020-09-17 22:59:57 +08:00
/** \brief returns xColumn or yColumn, whichever is used for the position of the bars (depending on whether the barchart is vertical or horizontal \see getBarHeightColumn(), xColumn, yColumn */
virtual int getBarPositionColumn ( ) const override ;
/** \brief returns xColumn or yColumn, whichever is used for the height of the bars (depending on whether the barchart is vertical or horizontal \see getBarPositionColumn(), xColumn, yColumn */
virtual int getBarHeightColumn ( ) const override ;
public slots :
/** \brief returns xColumn or yColumn, whichever is used for the position of the bars (depending on whether the barchart is vertical or horizontal \see getBarHeightColumn(), xColumn, yColumn */
virtual void setBarPositionColumn ( int column ) override ;
/** \brief returns xColumn or yColumn, whichever is used for the position of the bars (depending on whether the barchart is vertical or horizontal \see getBarHeightColumn(), xColumn, yColumn */
virtual void setBarPositionColumn ( size_t column ) override ;
/** \brief returns xColumn or yColumn, whichever is used for the height of the bars (depending on whether the barchart is vertical or horizontal \see getBarPositionColumn(), xColumn, yColumn */
virtual void setBarHeightColumn ( int column ) override ;
/** \brief returns xColumn or yColumn, whichever is used for the height of the bars (depending on whether the barchart is vertical or horizontal \see getBarPositionColumn(), xColumn, yColumn */
virtual void setBarHeightColumn ( size_t column ) override ;
2018-11-25 21:53:26 +08:00
protected :
2020-09-17 22:59:57 +08:00
/** \brief this function is used by autoscaleBarWidthAndShift() to determine whether a given graph shall be taken into account when autoscaling.
* Typically this returns \ c true for all JKQTPBarGraphBase - derved objects with the same orientation ( horizontal or vertical ) */
virtual bool considerForAutoscaling ( JKQTPBarGraphBase * other ) const override ;
2018-11-25 21:53:26 +08:00
} ;
2020-09-17 22:59:57 +08:00
/*! \brief This implements a bar graph with bars starting at \f$ yoverride \f$ to \f$ y=f(x) \f$
2018-11-25 21:53:26 +08:00
* and error indicator
2019-01-13 01:53:16 +08:00
* \ ingroup jkqtplotter_barssticks
2018-11-25 21:53:26 +08:00
*
2019-01-20 17:49:29 +08:00
* This works much the same as JKQTPBarHorizontalGraph . Here is an example output :
2018-11-25 21:53:26 +08:00
* \ image html plot_bargraphverploterr . png
*
2019-06-13 16:27:06 +08:00
* \ see jkqtpstatAddYErrorBarGraph ( ) , JKQTPBarVerticalGraph , \ ref JKQTPlotterBarcharts
2018-11-25 21:53:26 +08:00
*/
2019-06-22 20:21:32 +08:00
class JKQTPLOTTER_LIB_EXPORT JKQTPBarVerticalErrorGraph : public JKQTPBarVerticalGraph , public JKQTPYGraphErrors {
2018-11-25 21:53:26 +08:00
Q_OBJECT
public :
/** \brief class constructor */
2019-01-20 17:49:29 +08:00
JKQTPBarVerticalErrorGraph ( JKQTBasePlotter * parent = nullptr ) ;
2018-11-25 21:53:26 +08:00
/** \brief class constructor */
2019-01-20 23:15:10 +08:00
JKQTPBarVerticalErrorGraph ( JKQTPlotter * parent ) ;
2018-11-25 21:53:26 +08:00
2019-01-20 17:49:29 +08:00
/** \copydoc JKQTPGraph::usesColumn() */
2018-12-28 05:52:00 +08:00
virtual bool usesColumn ( int c ) const override ;
2018-11-25 21:53:26 +08:00
/** \brief get the maximum and minimum y-value of the graph
*
* The result is given in the two parameters which are call - by - reference parameters !
*/
2018-12-28 05:52:00 +08:00
virtual bool getYMinMax ( double & miny , double & maxy , double & smallestGreaterZero ) override ;
2018-11-25 21:53:26 +08:00
2020-09-17 22:59:57 +08:00
/** \brief returns the column that contains the bar height errors */
int getBarErrorColumn ( ) const ;
/** \brief returns the column that contains the lower bar height errors */
int getBarLowerErrorColumn ( ) const ;
public slots :
/** \brief sets the column that contains the bar height errors */
void setBarErrorColumn ( int column ) ;
/** \brief sets the column that contains the bar height errors */
void setBarErrorColumn ( size_t column ) ;
/** \brief sets the column that contains the bar height errors */
void setBarLowerErrorColumn ( int column ) ;
/** \brief sets the column that contains the bar height errors */
void setBarLowerErrorColumn ( size_t column ) ;
2018-11-25 21:53:26 +08:00
protected :
/** \brief this function is used to plot error inidcators before plotting the graphs. */
2018-12-28 05:52:00 +08:00
virtual void drawErrorsAfter ( JKQTPEnhancedPainter & painter ) override ;
2018-11-25 21:53:26 +08:00
} ;
2020-09-17 22:59:57 +08:00
/*! \brief This implements a bar graph with bars starting at \f$ xoverride \f$ to \f$ x=f(y) \f$
2019-01-13 01:53:16 +08:00
\ ingroup jkqtplotter_barssticks
2018-11-25 21:53:26 +08:00
2019-01-20 17:49:29 +08:00
This works much the same as JKQTPBarHorizontalGraph . Here is an example output :
2019-06-13 16:27:06 +08:00
2018-11-25 21:53:26 +08:00
\ image html plot_bargraphhorplot . png
2019-06-13 16:27:06 +08:00
\ see \ ref JKQTPlotterBarcharts , jkqtpstatAddVHistogram1D ( ) , jkqtpstatAddVHistogram1DAutoranged ( )
2018-11-25 21:53:26 +08:00
*/
2020-09-17 22:59:57 +08:00
class JKQTPLOTTER_LIB_EXPORT JKQTPBarHorizontalGraph : public JKQTPBarGraphBase {
2018-11-25 21:53:26 +08:00
Q_OBJECT
public :
/** \brief class constructor */
2019-01-20 17:49:29 +08:00
JKQTPBarHorizontalGraph ( JKQTBasePlotter * parent = nullptr ) ;
2018-11-25 21:53:26 +08:00
/** \brief class constructor */
2019-01-20 23:15:10 +08:00
JKQTPBarHorizontalGraph ( JKQTPlotter * parent ) ;
2018-11-25 21:53:26 +08:00
/** \brief plots the graph to the plotter object specified as parent */
2018-12-28 05:52:00 +08:00
virtual void draw ( JKQTPEnhancedPainter & painter ) override ;
2018-11-25 21:53:26 +08:00
/** \brief get the maximum and minimum x-value of the graph
*
* The result is given in the two parameters which are call - by - reference parameters !
*/
2018-12-28 05:52:00 +08:00
virtual bool getXMinMax ( double & minx , double & maxx , double & smallestGreaterZero ) override ;
2018-11-25 21:53:26 +08:00
/** \brief get the maximum and minimum y-value of the graph
*
* The result is given in the two parameters which are call - by - reference parameters !
*/
2018-12-28 05:52:00 +08:00
virtual bool getYMinMax ( double & miny , double & maxy , double & smallestGreaterZero ) override ;
2018-11-25 21:53:26 +08:00
2020-09-17 22:59:57 +08:00
/** \brief returns xColumn or yColumn, whichever is used for the position of the bars (depending on whether the barchart is vertical or horizontal \see getBarHeightColumn(), xColumn, yColumn */
virtual int getBarPositionColumn ( ) const override ;
/** \brief returns xColumn or yColumn, whichever is used for the height of the bars (depending on whether the barchart is vertical or horizontal \see getBarPositionColumn(), xColumn, yColumn */
virtual int getBarHeightColumn ( ) const override ;
public slots :
/** \brief sets xColumn or yColumn, whichever is used for the position of the bars (depending on whether the barchart is vertical or horizontal \see getBarHeightColumn(), xColumn, yColumn */
virtual void setBarPositionColumn ( int column ) override ;
/** \brief sets xColumn or yColumn, whichever is used for the position of the bars (depending on whether the barchart is vertical or horizontal \see getBarHeightColumn(), xColumn, yColumn */
virtual void setBarPositionColumn ( size_t column ) override ;
2018-11-25 21:53:26 +08:00
2020-09-17 22:59:57 +08:00
/** \brief sets xColumn or yColumn, whichever is used for the height of the bars (depending on whether the barchart is vertical or horizontal \see getBarPositionColumn(), xColumn, yColumn */
virtual void setBarHeightColumn ( int column ) override ;
/** \brief sets xColumn or yColumn, whichever is used for the height of the bars (depending on whether the barchart is vertical or horizontal \see getBarPositionColumn(), xColumn, yColumn */
virtual void setBarHeightColumn ( size_t column ) override ;
protected :
/** \brief this function is used by autoscaleBarWidthAndShift() to determine whether a given graph shall be taken into account when autoscaling.
* Typically this returns \ c true for all JKQTPBarGraphBase - derved objects with the same orientation ( horizontal or vertical ) */
virtual bool considerForAutoscaling ( JKQTPBarGraphBase * other ) const override ;
2018-11-25 21:53:26 +08:00
} ;
2020-09-17 22:59:57 +08:00
/*! \brief This implements a bar graph with bars starting at \f$ xoverride \f$ to \f$ x=f(y) \f$
* and error indicator
* \ ingroup jkqtplotter_barssticks
*
* This works much the same as JKQTPBarHorizontalGraph . Here is an example output :
* \ image html plot_bargraphhorploterr . png
*
* \ see jkqtpstatAddXErrorBarGraph ( ) , JKQTPBarHorizontalGraph , \ ref JKQTPlotterBarcharts
*
*/
class JKQTPLOTTER_LIB_EXPORT JKQTPBarHorizontalErrorGraph : public JKQTPBarHorizontalGraph , public JKQTPXGraphErrors {
Q_OBJECT
public :
/** \brief class constructor */
JKQTPBarHorizontalErrorGraph ( JKQTBasePlotter * parent = nullptr ) ;
/** \brief class constructor */
JKQTPBarHorizontalErrorGraph ( JKQTPlotter * parent ) ;
/** \copydoc JKQTPGraph::usesColumn() */
virtual bool usesColumn ( int c ) const override ;
/** \brief get the maximum and minimum x-value of the graph
*
* The result is given in the two parameters which are call - by - reference parameters !
*/
virtual bool getXMinMax ( double & minx , double & maxx , double & smallestGreaterZero ) override ;
/** \brief returns the column that contains the bar height errors */
int getBarErrorColumn ( ) const ;
/** \brief returns the column that contains the lower bar height errors */
int getBarLowerErrorColumn ( ) const ;
public slots :
/** \brief sets the column that contains the bar height errors */
void setBarErrorColumn ( int column ) ;
/** \brief sets the column that contains the bar height errors */
void setBarErrorColumn ( size_t column ) ;
/** \brief sets the column that contains the bar height errors */
void setBarLowerErrorColumn ( int column ) ;
/** \brief sets the column that contains the bar height errors */
void setBarLowerErrorColumn ( size_t column ) ;
protected :
/** \brief this function is used to plot error inidcators before plotting the graphs. */
virtual void drawErrorsAfter ( JKQTPEnhancedPainter & painter ) override ;
} ;
/*! \brief This implements a bar graph with bars starting at \f$ yoverride \f$ to \f$ y=f(x) \f$
2018-11-25 21:53:26 +08:00
* Optionally several graphs of this type may be stacked on top of each other
2019-01-13 01:53:16 +08:00
* \ ingroup jkqtplotter_barssticks
2018-11-25 21:53:26 +08:00
*
2019-01-26 20:00:40 +08:00
* Draw stacked barcharts by connecting several plots by calling \ c setStackedParent ( belowPlot ) for each plot
2020-09-17 22:59:57 +08:00
* \ image html JKQTPBarVerticalGraphStacked . png
2019-06-13 16:27:06 +08:00
*
2020-09-17 22:59:57 +08:00
* \ see JKQTPBarVerticalGraph , \ ref JKQTPlotterStackedBarChart
2018-11-25 21:53:26 +08:00
*/
2020-09-17 22:59:57 +08:00
class JKQTPLOTTER_LIB_EXPORT JKQTPBarVerticalStackableGraph : public JKQTPBarVerticalGraph {
2018-11-25 21:53:26 +08:00
Q_OBJECT
public :
/** \brief class constructor */
2020-09-17 22:59:57 +08:00
JKQTPBarVerticalStackableGraph ( JKQTBasePlotter * parent = nullptr ) ;
2018-11-25 21:53:26 +08:00
/** \brief class constructor */
2020-09-17 22:59:57 +08:00
JKQTPBarVerticalStackableGraph ( JKQTPlotter * parent ) ;
2018-11-25 21:53:26 +08:00
/** \brief stacks this barchart upon the given \a parentGraph */
2020-09-17 22:59:57 +08:00
void stackUpon ( JKQTPBarVerticalStackableGraph * parentGraph ) ;
2018-11-25 21:53:26 +08:00
/** \brief unstacks this graph (i.e. deletes the parent graph in the stack) */
void dontStackUpon ( ) ;
/** \brief returns the stack parent graph, or \c nullptr */
2020-09-17 22:59:57 +08:00
const JKQTPBarVerticalStackableGraph * getStackParent ( ) const ;
/** \brief returns the stack parent graph, or \c nullptr */
JKQTPBarVerticalStackableGraph * getStackParent ( ) ;
2018-11-25 21:53:26 +08:00
protected :
/** \brief if set (!=nullptr), the current plot is drawn stacked onto this plot
*
2019-01-26 20:00:40 +08:00
* draw stacked barcharts by connecting several plots by calling \ c setStackedParent ( belowPlot ) for each plot
2018-11-25 21:53:26 +08:00
*/
2020-09-17 22:59:57 +08:00
JKQTPBarVerticalStackableGraph * stackParent ;
/** \brief used to generate stacked plots: returns the upper boundary of the parent plot in a stack, for the index-th datapoint */
double getParentStackedMax ( int index ) const ;
2018-11-25 21:53:26 +08:00
/** \brief returns \c true, if a stack parent is set (if available) */
2020-09-17 22:59:57 +08:00
bool hasStackParent ( ) const ;
/** \brief used to generate stacked plots: returns the upper boundary of this plot in a stack, for the index-th datapoint */
double getStackedMax ( int index ) const ;
2018-11-25 21:53:26 +08:00
} ;
2020-09-17 22:59:57 +08:00
/*! \brief This implements a bar graph with bars starting at \f$ yoverride \f$ to \f$ y=f(x) \f$
* Optionally several graphs of this type may be stacked on top of each other
2019-01-13 01:53:16 +08:00
* \ ingroup jkqtplotter_barssticks
2018-11-25 21:53:26 +08:00
*
2020-09-17 22:59:57 +08:00
* Draw stacked barcharts by connecting several plots by calling \ c setStackedParent ( belowPlot ) for each plot
* \ image html JKQTPBarHorizontalGraphStacked . png
2018-11-25 21:53:26 +08:00
*
2019-06-13 16:27:06 +08:00
*
2020-09-17 22:59:57 +08:00
* \ see JKQTPBarHorizontalGraph , \ ref JKQTPlotterStackedBarChart
2018-11-25 21:53:26 +08:00
*/
2020-09-17 22:59:57 +08:00
class JKQTPLOTTER_LIB_EXPORT JKQTPBarHorizontalStackableGraph : public JKQTPBarHorizontalGraph {
2018-11-25 21:53:26 +08:00
Q_OBJECT
public :
/** \brief class constructor */
2020-09-17 22:59:57 +08:00
JKQTPBarHorizontalStackableGraph ( JKQTBasePlotter * parent = nullptr ) ;
2018-11-25 21:53:26 +08:00
/** \brief class constructor */
2020-09-17 22:59:57 +08:00
JKQTPBarHorizontalStackableGraph ( JKQTPlotter * parent ) ;
/** \brief stacks this barchart upon the given \a parentGraph */
void stackUpon ( JKQTPBarHorizontalStackableGraph * parentGraph ) ;
/** \brief unstacks this graph (i.e. deletes the parent graph in the stack) */
void dontStackUpon ( ) ;
/** \brief returns the stack parent graph, or \c nullptr */
const JKQTPBarHorizontalStackableGraph * getStackParent ( ) const ;
/** \brief returns the stack parent graph, or \c nullptr */
JKQTPBarHorizontalStackableGraph * getStackParent ( ) ;
2018-11-25 21:53:26 +08:00
2020-09-17 22:59:57 +08:00
protected :
/** \brief if set (!=nullptr), the current plot is drawn stacked onto this plot
2018-11-25 21:53:26 +08:00
*
2020-09-17 22:59:57 +08:00
* draw stacked barcharts by connecting several plots by calling \ c setStackedParent ( belowPlot ) for each plot
2018-11-25 21:53:26 +08:00
*/
2020-09-17 22:59:57 +08:00
JKQTPBarHorizontalStackableGraph * stackParent ;
2018-11-25 21:53:26 +08:00
2020-09-17 22:59:57 +08:00
/** \brief used to generate stacked plots: returns the upper boundary of the parent plot in a stack, for the index-th datapoint */
virtual double getParentStackedMax ( int index ) const override ;
/** \brief returns \c true, if a stack parent is set (if available) */
virtual bool hasStackParent ( ) const override ;
/** \brief used to generate stacked plots: returns the upper boundary of this plot in a stack, for the index-th datapoint */
double getStackedMax ( int index ) const ;
2018-11-25 21:53:26 +08:00
} ;
2020-09-17 22:59:57 +08:00
2018-12-19 00:13:18 +08:00
# endif // jkqtpgraphsbarchart_H