2018-11-25 21:53:26 +08:00
/*
2024-02-06 21:50:49 +08:00
Copyright ( c ) 2008 - 2024 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/>.
*/
2022-04-25 04:07:39 +08:00
# ifndef jkqtpgraphsbarchart_H
# define jkqtpgraphsbarchart_H
2018-11-25 21:53:26 +08:00
# 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"
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-11-25 21:53:26 +08:00
2024-02-11 20:53:10 +08:00
/** \brief This implements a vertical bar graph with bars between \f$ y=\mbox{baseline} \f$ and \f$ y=f(x) \f$
* \ ingroup jkqtplotter_barcharts
*
*
* This class draws vertical bargraphs . The basic properties are defined and documented with JKQTPBarGraphBase .
*
* The a horizontal is defined by a series of datapoints \ c ( x , y = f ( x ) ) .
* Bars are then drawn fromm a baseline ( often \ c = 0 ) to the value \ c y = f ( x ) at each position \ c x .
* Thus the class is derived from JKQTPXYBaselineGraph , which provides a baseline as well as columns for \ c x and \ c y values .
*
* \ image html JKQTPBarVerticalGraph . png
*
* \ see \ 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
2024-02-05 05:06:09 +08:00
/** \copydoc JKQTPPlotElement::getXMinMax() */
2018-12-28 05:52:00 +08:00
virtual bool getXMinMax ( double & minx , double & maxx , double & smallestGreaterZero ) override ;
2024-02-05 05:06:09 +08:00
/** \copydoc JKQTPPlotElement::getYMinMax() */
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
2023-07-22 20:26:02 +08:00
public Q_SLOTS :
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
} ;
2022-10-31 05:01:06 +08:00
/*! \brief This implements a vertical bar graph with bars between \f$ y=\mbox{baseline} \f$ and \f$ y=f(x) \f$
2018-11-25 21:53:26 +08:00
* and error indicator
2022-10-23 03:07:14 +08:00
* \ ingroup jkqtplotter_barcharts
2018-11-25 21:53:26 +08:00
*
2024-02-11 20:53:10 +08:00
* This works much the same as JKQTPBarHorizontalGraph , but also draws error indicators .
* Here is an example output :
*
2022-09-11 04:35:30 +08:00
* \ image html JKQTPBarVerticalErrorGraph . png
2018-11-25 21:53:26 +08:00
*
2024-02-11 20:53:10 +08:00
* Error indicators are defined and styled with the functions from JKQTPYGraphErrors .
*
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 ;
2022-09-11 04:35:30 +08:00
/** \brief returns the error style of the bar */
JKQTPErrorPlotstyle getBarErrorStyle ( ) const ;
/** \brief returns whether the errors of the bars are symmetric */
bool getBarErrorSymmetric ( ) const ;
2023-07-22 20:26:02 +08:00
public Q_SLOTS :
2022-09-11 04:35:30 +08:00
/** \brief sets whether the errors of the bars are symmetric */
void setBarErrorSymmetric ( bool __value ) ;
/** \brief sets the error style of the bar */
void setBarErrorStyle ( JKQTPErrorPlotstyle __value ) ;
2020-09-17 22:59:57 +08:00
/** \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
2024-02-11 20:53:10 +08:00
/** \brief This implements a horizontal bar graph with bars between \f$ x=\mbox{baseline} \f$ and \f$ x=f(y) \f$
* \ ingroup jkqtplotter_barcharts
*
* This class draws horizontal bargraphs . The basic properties are defined and documented with JKQTPBarGraphBase .
*
* The a horizontal is defined by a series of datapoints \ c ( y , x = f ( y ) ) .
* Bars are then drawn fromm a baseline ( often \ c = 0 ) to the value \ c x = f ( y ) at each position \ c y .
* Thus the class is derived from JKQTPXYBaselineGraph , which provides a baseline as well as columns for \ c x and \ c y values .
*
* \ image html JKQTPBarHorizontalGraph . png
*
* \ 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
2024-02-05 05:06:09 +08:00
/** \copydoc JKQTPPlotElement::getXMinMax() */
2018-12-28 05:52:00 +08:00
virtual bool getXMinMax ( double & minx , double & maxx , double & smallestGreaterZero ) override ;
2024-02-05 05:06:09 +08:00
/** \copydoc JKQTPPlotElement::getYMinMax() */
2018-12-28 05:52:00 +08:00
virtual bool getYMinMax ( double & miny , double & maxy , double & smallestGreaterZero ) override ;
2022-09-10 19:38:29 +08:00
/** \brief returns the column used as "key" for the current graph (typically this call getXColumn(), but for horizontal graphs like filled curves or barcharts it may call getYColumn() ) */
virtual int getKeyColumn ( ) const override ;
/** \brief returns the column used as "value" for the current graph (typically this call getXColumn(), but for horizontal graphs like filled curves or barcharts it may call getYColumn() ) */
virtual int getValueColumn ( ) const override ;
2023-07-22 20:26:02 +08:00
public Q_SLOTS :
2022-09-10 19:38:29 +08:00
/** \brief sets the column used as "key" for the current graph (typically this call setXColumn(), but for horizontal graphs like filled curves or barcharts it may call setYColumn() ) */
virtual void setKeyColumn ( int __value ) override ;
/** \brief sets the column used as "value" for the current graph (typically this call setXColumn(), but for horizontal graphs like filled curves or barcharts it may call setYColumn() ) */
virtual void setValueColumn ( int __value ) override ;
2020-09-17 22:59:57 +08:00
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
} ;
2022-10-31 05:01:06 +08:00
/*! \brief This implements a horizontal bar graph with bars between \f$ x=\mbox{baseline} \f$ and \f$ x=f(y) \f$
2020-09-17 22:59:57 +08:00
* and error indicator
2022-10-23 03:07:14 +08:00
* \ ingroup jkqtplotter_barcharts
2020-09-17 22:59:57 +08:00
*
2024-02-11 20:53:10 +08:00
* This works much the same as JKQTPBarHorizontalGraph , but also draws error indicators .
* Here is an example output :
*
2022-09-11 04:35:30 +08:00
* \ image html JKQTPBarHorizontalErrorGraph . png
2020-09-17 22:59:57 +08:00
*
2024-02-11 20:53:10 +08:00
* Error indicators are defined and styled by functions from JKQTPXGraphErrors .
*
2020-09-17 22:59:57 +08:00
* \ 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 ;
2024-02-05 05:06:09 +08:00
/** \copydoc JKQTPPlotElement::getXMinMax() */
2020-09-17 22:59:57 +08:00
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 ;
2022-09-11 04:35:30 +08:00
/** \brief returns the error style of the bar */
JKQTPErrorPlotstyle getBarErrorStyle ( ) const ;
/** \brief returns whether the errors of the bars are symmetric */
bool getBarErrorSymmetric ( ) const ;
2023-07-22 20:26:02 +08:00
public Q_SLOTS :
2022-09-11 04:35:30 +08:00
/** \brief sets whether the errors of the bars are symmetric */
void setBarErrorSymmetric ( bool __value ) ;
/** \brief sets the error style of the bar */
void setBarErrorStyle ( JKQTPErrorPlotstyle __value ) ;
2020-09-17 22:59:57 +08:00
/** \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 ;
} ;
2022-10-31 05:01:06 +08:00
/*! \brief This implements a vertical bar graph with bars between \f$ y=\mbox{baseline} \f$ and \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
2022-10-23 03:07:14 +08:00
* \ ingroup jkqtplotter_barcharts
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
2022-10-23 03:07:14 +08:00
*
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
*/
2024-02-13 05:21:13 +08:00
class JKQTPLOTTER_LIB_EXPORT JKQTPBarVerticalStackableGraph : public JKQTPBarVerticalGraph , public JKQTPBarGraphStackInternalInterface {
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
2024-02-13 05:21:13 +08:00
/** \copydoc JKQTPBarGraphBase::hasStackParent() */
virtual bool hasStackParent ( ) const override ;
2020-09-17 22:59:57 +08:00
/** \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 ;
2024-02-13 05:21:13 +08:00
/** \copydoc JKQTPBarGraphStackInternalInterface::getBottomOfStack() */
virtual JKQTPBarGraphBase * getBottomOfStack ( ) override ;
2018-11-25 21:53:26 +08:00
} ;
2020-09-17 22:59:57 +08:00
2022-10-31 05:01:06 +08:00
/*! \brief This implements a horizontal bar graph with bars between \f$ x=\mbox{baseline} \f$ and \f$ x=f(y) \f$
2020-09-17 22:59:57 +08:00
* Optionally several graphs of this type may be stacked on top of each other
2022-10-23 03:07:14 +08:00
* \ ingroup jkqtplotter_barcharts
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
2022-10-23 03:07:14 +08:00
*
2020-09-17 22:59:57 +08:00
* \ 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
*/
2024-02-13 05:21:13 +08:00
class JKQTPLOTTER_LIB_EXPORT JKQTPBarHorizontalStackableGraph : public JKQTPBarHorizontalGraph , public JKQTPBarGraphStackInternalInterface {
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 ;
2024-02-13 05:21:13 +08:00
/** \copydoc JKQTPBarGraphBase::hasStackParent() */
2020-09-17 22:59:57 +08:00
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 ;
2024-02-13 05:21:13 +08:00
/** \copydoc JKQTPBarGraphStackInternalInterface::getBottomOfStack() */
virtual JKQTPBarGraphBase * getBottomOfStack ( ) override ;
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