/* Copyright (c) 2008-2019 Jan W. Krieger () 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 the Free Software Foundation, either version 2 of the License, or (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 . */ /** \file jkqtpgraphssinglecolumnsymbols.h * \ingroup jkqtplotter_linesymbolgraphs */ #include #include #include #include "jkqtplotter/jkqtpgraphsbase.h" #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. \ingroup jkqtplotter_linesymbolgraphs 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.
\image html JKQTPSingleColumnSymbolsGraph_NoScatter.png - if positionScatterStyle==RandomScatter it scatters around position in the range [position-width/2 ... position+width/2], e.g.
\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.
\image html JKQTPSingleColumnSymbolsGraph_BeeSwarmScatter.png . All example images above have dataDirection==DataDirection::X ! \see \ref JKQTPlotterDistributionPlot */ class LIB_EXPORT JKQTPSingleColumnSymbolsGraph: public JKQTPSingleColumnGraph { 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. https://www.r-statistics.com/2011/03/beeswarm-boxplot-and-plotting-it-with-r/). 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; /*! \brief sets the property position to the specified \a __value. \details Description of the parameter position is:
\copybrief position
\see position for more information */ inline virtual void set_position(double __value) { this->position = __value; } /*! \brief returns the property position. \details Description of the parameter position is:
\copybrief position
\see position for more information */ inline virtual double get_position() const { return this->position; } /*! \brief sets the property width to the specified \a __value. \details Description of the parameter width is:
\copybrief width
\see width for more information */ inline virtual void set_width(double __value) { this->width = __value; } /*! \brief returns the property width. \details Description of the parameter width is:
\copybrief width
\see width for more information */ inline virtual double get_width() const { return this->width; } /*! \brief sets the property dataDirection to the specified \a __value. \details Description of the parameter dataDirection is:
\copybrief dataDirection
\see dataDirection for more information */ inline virtual void set_dataDirection(DataDirection __value) { this->dataDirection = __value; } /*! \brief returns the property dataDirection. \details Description of the parameter dataDirection is:
\copybrief dataDirection
\see dataDirection for more information */ inline virtual DataDirection get_dataDirection() const { return this->dataDirection; } /*! \brief sets the property positionScatterStyle to the specified \a __value. \details Description of the parameter positionScatterStyle is:
\copybrief positionScatterStyle
\see positionScatterStyle for more information */ inline virtual void set_positionScatterStyle(ScatterStyle __value) { this->positionScatterStyle = __value; } /*! \brief returns the property positionScatterStyle. \details Description of the parameter positionScatterStyle is:
\copybrief positionScatterStyle
\see positionScatterStyle for more information */ inline virtual ScatterStyle get_positionScatterStyle() const { return this->positionScatterStyle; } /*! \brief sets the property fillColor to the specified \a __value. \details Description of the parameter fillColor is:
\copybrief fillColor
\see fillColor for more information */ inline virtual void set_fillColor(const QColor & __value) { this->fillColor = __value; } /*! \brief returns the property fillColor. \details Description of the parameter fillColor is:
\copybrief fillColor
\see fillColor for more information */ inline virtual QColor get_fillColor() const { return this->fillColor; } /*! \brief sets the property symbol to the specified \a __value. \details Description of the parameter symbol is:
\copybrief symbol
\see symbol for more information */ inline virtual void set_symbol(const JKQTPGraphSymbols & __value) { this->symbol = __value; } /*! \brief returns the property symbol. \details Description of the parameter symbol is:
\copybrief symbol
\see symbol for more information */ inline virtual JKQTPGraphSymbols get_symbol() const { return this->symbol; } /*! \brief sets the property symbolWidth to the specified \a __value. \details Description of the parameter symbolWidth is:
\copybrief symbolWidth
\see symbolWidth for more information */ inline virtual void set_symbolWidth(double __value) { this->symbolWidth = __value; } /*! \brief returns the property symbolWidth. \details Description of the parameter symbolWidth is:
\copybrief symbolWidth
\see symbolWidth for more information */ inline virtual double get_symbolWidth() const { return this->symbolWidth; } /*! \brief sets the property symbolSize to the specified \a __value. \details Description of the parameter symbolSize is:
\copybrief symbolSize
\see symbolSize for more information */ inline virtual void set_symbolSize(double __value) { this->symbolSize = __value; } /*! \brief returns the property symbolSize. \details Description of the parameter symbolSize is:
\copybrief symbolSize
\see symbolSize for more information */ inline virtual double get_symbolSize() const { return this->symbolSize; } protected: /** \brief interpret the data from dataColumn either as X- or Y-data */ DataDirection dataDirection; /** \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; /** \brief color of the graph fill */ QColor fillColor; /** \brief which symbol to use for the datapoints */ JKQTPGraphSymbols symbol; /** \brief size (diameter in pt) of the symbol for the data points */ double symbolSize; /** \brief width (in pt) of the lines used to plot the symbol for the data points */ double symbolWidth; QPen getSymbolPen(JKQTPEnhancedPainter& painter) const; QBrush getBrush(JKQTPEnhancedPainter &painter) const; }; #endif // jkqtpgraphssinglecolumnsymbols_H_INCLUDED