2019-01-20 23:15:10 +08:00
/*
Copyright ( c ) 2008 - 2019 Jan W . Krieger ( < jan @ jkrieger . de > )
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
2019-01-20 23:15:10 +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>
# include "jkqtplotter/jkqtpgraphsbase.h"
2019-04-22 19:27:50 +08:00
# include "jkqtplotter/jkqtpgraphsbasestylingmixins.h"
2019-01-20 23:15:10 +08:00
# ifndef jkqtpgraphssinglecolumnsymbols_H_INCLUDED
# define jkqtpgraphssinglecolumnsymbols_H_INCLUDED
/*! \brief plots a 1-column set of data-values with symbols onto a JKQtPlotter/JKQtBasePlotter. the data from the single column
is either interpreted as x - or y - values and the missing coordinate is taken from a fixed value position .
2019-02-03 22:54:41 +08:00
\ ingroup jkqtplotter_linesymbolgraphs_simple
2019-01-20 23:15:10 +08:00
The first coordinate of the data is taken from dataColumn i . e .
- the x - values if dataDirection = = DataDirection : : X
- the y - values if dataDirection = = DataDirection : : Y
.
The second coordinate is :
- if positionScatterStyle = = NoScatter it is simply the value of position , e . g . < br > \ image html JKQTPSingleColumnSymbolsGraph_NoScatter . png
- if positionScatterStyle = = RandomScatter it scatters around position in the range [ position - width / 2 . . . position + width / 2 ] , e . g . < br > \ image html JKQTPSingleColumnSymbolsGraph_RandomScatter . png
- if positionScatterStyle = = BeeSwarmScatter it scatters around position with an algorithm that tries to avoid any overlay of the plot symbols ( SLOW ! ) , e . g . < br > \ image html JKQTPSingleColumnSymbolsGraph_BeeSwarmScatter . png
.
All example images above have dataDirection = = DataDirection : : X !
\ see \ ref JKQTPlotterDistributionPlot
*/
2019-04-22 19:27:50 +08:00
class JKQTP_LIB_EXPORT JKQTPSingleColumnSymbolsGraph : public JKQTPSingleColumnGraph , public JKQTPGraphSymbolStyleMixin {
2019-01-20 23:15:10 +08:00
Q_OBJECT
public :
/** \brief describes how data from dataColumn of a JKQTPSingleColumnSymbolsGraph positioned at position */
enum ScatterStyle {
NoScatter , /*!< \brief missing coordinate is exactly position for every datapoint in dataColumn \image html JKQTPSingleColumnSymbolsGraph_NoScatter.png */
RandomScatter , /*!< \brief missing coordinate scatters around position (with distribution-width width ) \image html JKQTPSingleColumnSymbolsGraph_RandomScatter.png */
BeeSwarmScatter , /*!< \brief missing coordinate scatters around position and the algorithm tries to prevent overlay of two symbols ("bee swarm plot", see e.g. <a href="https://www.r-statistics.com/2011/03/beeswarm-boxplot-and-plotting-it-with-r/">https://www.r-statistics.com/2011/03/beeswarm-boxplot-and-plotting-it-with-r/</a>). Note that this algorithm can be rather slow!!! \image html JKQTPSingleColumnSymbolsGraph_BeeSwarmScatter.png */
} ;
/** \brief class constructor */
JKQTPSingleColumnSymbolsGraph ( JKQTBasePlotter * parent = nullptr ) ;
JKQTPSingleColumnSymbolsGraph ( JKQTPlotter * parent ) ;
/** \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 get the maximum and minimum y-value of the graph
*
* The result is given in the two parameters which are call - by - reference parameters !
*/
virtual bool getYMinMax ( double & miny , double & maxy , double & smallestGreaterZero ) override ;
/** \brief plots the graph to the plotter object specified as parent */
virtual void draw ( JKQTPEnhancedPainter & painter ) override ;
/** \brief plots a key marker inside the specified rectangle \a rect */
virtual void drawKeyMarker ( JKQTPEnhancedPainter & painter , QRectF & rect ) override ;
2019-04-22 19:27:50 +08:00
/** \brief returns the color to be used for the key label */
virtual QColor getKeyLabelColor ( ) const override ;
/** \brief set symbol color and fill color at the same time */
void setColor ( QColor col ) ;
2019-01-20 23:15:10 +08:00
2019-04-22 19:27:50 +08:00
/*! \copydoc position
2019-02-08 00:24:46 +08:00
\ see see position for details */
2019-04-22 19:27:50 +08:00
void setPosition ( double __value ) ;
/*! \copydoc position
2019-02-08 00:24:46 +08:00
\ see see position for details */
2019-04-22 19:27:50 +08:00
double getPosition ( ) const ;
/*! \copydoc width
2019-02-08 00:24:46 +08:00
\ see see width for details */
2019-04-22 19:27:50 +08:00
void setWidth ( double __value ) ;
/*! \copydoc width
2019-02-08 00:24:46 +08:00
\ see see width for details */
2019-04-22 19:27:50 +08:00
double getWidth ( ) const ;
/*! \copydoc positionScatterStyle
2019-02-08 00:24:46 +08:00
\ see see positionScatterStyle for details */
2019-04-22 19:27:50 +08:00
void setPositionScatterStyle ( ScatterStyle __value ) ;
/*! \copydoc positionScatterStyle
2019-02-08 00:24:46 +08:00
\ see see positionScatterStyle for details */
2019-04-22 19:27:50 +08:00
ScatterStyle getPositionScatterStyle ( ) const ;
2019-01-26 19:35:57 +08:00
/** \copydoc seedValue */
2019-04-22 19:27:50 +08:00
void setSeedValue ( unsigned int val ) ;
2019-01-26 19:35:57 +08:00
/** \copydoc seedValue */
2019-04-22 19:27:50 +08:00
unsigned int getSeedValue ( ) const ;
2019-01-20 23:15:10 +08:00
protected :
/** \brief missing coordinate, i.e. if the data from \a dataColumn is interpreted as x-values, this is the y-position and vice versa (see DataDirection ) */
double position ;
/** \brief width of data distribution around position for the missing coordinate (see positionScatterStyle and position) */
double width ;
/** \brief how to distribute the datapoints from dataColumn at the location position */
ScatterStyle positionScatterStyle ;
2019-01-26 19:35:57 +08:00
/** \brief seed value for the pseudo-random number generator used for drawing.
*
* This seed is used instead of e . g . the system time to ensure that replotting results in the
* same plot every time . ou can set the seed using setSeedvalue ( ) ) */
unsigned int seedValue ;
2019-01-20 23:15:10 +08:00
} ;
# endif // jkqtpgraphssinglecolumnsymbols_H_INCLUDED