From f4767072a406b0c1774fa6069f38bb33a9fc0ba0 Mon Sep 17 00:00:00 2001 From: jkriege2 Date: Sat, 19 Sep 2020 19:58:50 +0200 Subject: [PATCH] - improved/breaking change: reworked class hierarchy of range plot elements (JKQTPVerticalRange and JKQTPHorizontalRange) - improved their documentation --- doc/dox/jkqtplotter.dox | 33 +- doc/dox/whatsnew.dox | 1 + doc/images/JKQTPRangeBase.png | Bin 0 -> 15996 bytes doc/images/JKQTPRangeBase_Inverted.png | Bin 0 -> 9252 bytes lib/jkqtplotter/graphs/jkqtpboxplot.h | 4 +- lib/jkqtplotter/graphs/jkqtpgeoannotations.h | 4 +- lib/jkqtplotter/graphs/jkqtprange.cpp | 356 ++++++++++--------- lib/jkqtplotter/graphs/jkqtprange.h | 205 +++++++---- lib/jkqtplotter/graphs/jkqtpviolinplot.h | 4 +- 9 files changed, 354 insertions(+), 253 deletions(-) create mode 100644 doc/images/JKQTPRangeBase.png create mode 100644 doc/images/JKQTPRangeBase_Inverted.png diff --git a/doc/dox/jkqtplotter.dox b/doc/dox/jkqtplotter.dox index 1f52e95328..617290f60c 100644 --- a/doc/dox/jkqtplotter.dox +++ b/doc/dox/jkqtplotter.dox @@ -451,12 +451,28 @@ This group assembles graphs that show their data with symbols and optionally wit \image html geo_chords_small.png JKQTPGeoChord + + +Examples: + - \ref JKQTPlotterGeometricGraphs +. + +\defgroup jkqtplotter_annotations Graph Annotations +\ingroup jkqtplotter_graphsgroup + + - - + +
\image html geo_boxplot_small.png - JKQTPBoxplotVerticalElement, JKQTPBoxplotHorizontalElement + Screenshot + Classes
\image html JKQTPViolinplotVerticalElement_small.png - JKQTPViolinplotVerticalElement, JKQTPViolinplotHorizontalElement + \image html symbol_filled_diamond.png + JKQTPGeoSymbol +
\image html geo_text_small.png + JKQTPGeoText +
\image html JKQTPHorizontalRange_small.png + JKQTPHorizontalRange, JKQTPVerticalRange
Examples: @@ -470,12 +486,15 @@ Examples: Screenshot Classes - - \image html JKQTPHorizontalRange_small.png - JKQTPHorizontalRange, JKQTPVerticalRange \image html JKQTPPeakStreamGraphY_small.png JKQTPPeakStreamGraph + + \image html geo_boxplot_small.png + JKQTPBoxplotVerticalElement, JKQTPBoxplotHorizontalElement + + \image html JKQTPViolinplotVerticalElement_small.png + JKQTPViolinplotVerticalElement, JKQTPViolinplotHorizontalElement \defgroup jkqtplotter_imagelots Matrix/Image Plotting diff --git a/doc/dox/whatsnew.dox b/doc/dox/whatsnew.dox index 49eeca55ae..944b6d4563 100644 --- a/doc/dox/whatsnew.dox +++ b/doc/dox/whatsnew.dox @@ -30,6 +30,7 @@ Changes, compared to \ref page_whatsnew_V2019_11 "v2019.11" include:
  • improved/breaking change: reworked class hierarchy of range charts.
  • improved/breaking change: reworked class hierarchy of special line (step) graphs.
  • improved/breaking change: reworked class hierarchy of filled line graphs.
  • +
  • improved/breaking change: reworked class hierarchy of range plot elements (JKQTPVerticalRange and JKQTPHorizontalRange).
  • improved/breaking change: reworked graph Base-Classes (promoted several setters to slots, added Q_PROPERTY- and Q_ENUM-declarations...)
  • improved/breaking change: made more functions and function parameters const
  • bugfixed/improved: aspect ratio handling in JKQTPlotter.
  • diff --git a/doc/images/JKQTPRangeBase.png b/doc/images/JKQTPRangeBase.png new file mode 100644 index 0000000000000000000000000000000000000000..f013b5192e32e740dba039651d0044bfffb96102 GIT binary patch literal 15996 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 boxplot as a "geometric element", where the data is directly given to the object and not stored in a column, as in JKQTPBoxplotVerticalGraph \ingroup jkqtplotter_statgraphs - \ingroup jkqtplotter_geoplots + \ingroup jkqtplotter_diverse @@ -421,7 +421,7 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPBoxplotVerticalElement: public JKQTPPlotObject /*! \brief This implements a horizontal (notched) boxplot where the data is directly given to the object and not stored in a column, as in JKQTPBoxplotVerticalGraph \ingroup jkqtplotter_statgraphs - \ingroup jkqtplotter_geoplots + \ingroup jkqtplotter_diverse the x position is given in pos. All other data are given in the median, min, max, percentile25 and percentile75. diff --git a/lib/jkqtplotter/graphs/jkqtpgeoannotations.h b/lib/jkqtplotter/graphs/jkqtpgeoannotations.h index 25815ebf7b..c85a2fe554 100644 --- a/lib/jkqtplotter/graphs/jkqtpgeoannotations.h +++ b/lib/jkqtplotter/graphs/jkqtpgeoannotations.h @@ -34,7 +34,7 @@ /*! \brief This virtual JKQTPGraph descendent may be used to display a single symbol (marker). - \ingroup jkqtplotter_geoplots + \ingroup jkqtplotter_annotations \see \ref JKQTPlotterGeometricGraphs @@ -101,7 +101,7 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPGeoSymbol: public JKQTPPlotObject, public JKQT /*! \brief This JKQTPPlotObject is used to display text. It uses the JKQTMathText class in order to display LaTeX formulas. - \ingroup jkqtplotter_geoplots + \ingroup jkqtplotter_annotations \see \ref JKQTPlotterGeometricGraphs */ diff --git a/lib/jkqtplotter/graphs/jkqtprange.cpp b/lib/jkqtplotter/graphs/jkqtprange.cpp index 6081c0c2b8..5598d84a42 100644 --- a/lib/jkqtplotter/graphs/jkqtprange.cpp +++ b/lib/jkqtplotter/graphs/jkqtprange.cpp @@ -34,8 +34,8 @@ -JKQTPHorizontalRange::JKQTPHorizontalRange(JKQTBasePlotter* parent): - JKQTPGraph(parent) +JKQTPRangeBase::JKQTPRangeBase(JKQTBasePlotter* parent): + JKQTPPlotElement(parent) { centerColor=QColor("red"); centerStyle=Qt::SolidLine; @@ -62,6 +62,185 @@ JKQTPHorizontalRange::JKQTPHorizontalRange(JKQTBasePlotter* parent): fillRange=true; } +QColor JKQTPRangeBase::getKeyLabelColor() const +{ + return centerColor; +} + +void JKQTPRangeBase::setDrawCenterLineOnly() +{ + plotCenterLine=true; + plotRange=false; +} + +void JKQTPRangeBase::setColor(QColor c) +{ + setLineColor(c); + centerColor=c; + setFillColor(JKQTPGetDerivedColor(parent->getCurrentPlotterStyle().graphFillColorDerivationMode, c)); +} + + +void JKQTPRangeBase::setCenterColor(const QColor &__value) +{ + this->centerColor = __value; +} + +QColor JKQTPRangeBase::getCenterColor() const +{ + return this->centerColor; +} + +void JKQTPRangeBase::setCenterStyle(Qt::PenStyle __value) +{ + this->centerStyle = __value; +} + +Qt::PenStyle JKQTPRangeBase::getCenterStyle() const +{ + return this->centerStyle; +} + +void JKQTPRangeBase::setCenterLineWidth(double __value) +{ + this->centerLineWidth = __value; +} + +double JKQTPRangeBase::getCenterLineWidth() const +{ + return this->centerLineWidth; +} + +void JKQTPRangeBase::setRangeMin(double __value) +{ + this->rangeMin = __value; +} + +double JKQTPRangeBase::getRangeMin() const +{ + return this->rangeMin; +} + +void JKQTPRangeBase::setRangeMax(double __value) +{ + this->rangeMax = __value; +} + +double JKQTPRangeBase::getRangeMax() const +{ + return this->rangeMax; +} + +void JKQTPRangeBase::setSizeMin(double __value) +{ + this->unlimitedSizeMin=false; + this->sizeMin = __value; +} + +double JKQTPRangeBase::getSizeMin() const +{ + return this->sizeMin; +} + +void JKQTPRangeBase::setSizeMax(double __value) +{ + this->unlimitedSizeMax=false; + this->sizeMax = __value; +} + +double JKQTPRangeBase::getSizeMax() const +{ + return this->sizeMax; +} + +void JKQTPRangeBase::setUnlimitedSizeMin(bool __value) +{ + this->unlimitedSizeMin = __value; +} + +bool JKQTPRangeBase::getUnlimitedSizeMin() const +{ + return this->unlimitedSizeMin; +} + +void JKQTPRangeBase::setUnlimitedSizeMax(bool __value) +{ + this->unlimitedSizeMax = __value; +} + +bool JKQTPRangeBase::getUnlimitedSizeMax() const +{ + return this->unlimitedSizeMax; +} + +void JKQTPRangeBase::setRangeCenter(double __value) +{ + this->rangeCenter = __value; +} + +double JKQTPRangeBase::getRangeCenter() const +{ + return this->rangeCenter; +} + +void JKQTPRangeBase::setPlotCenterLine(bool __value) +{ + this->plotCenterLine = __value; +} + +bool JKQTPRangeBase::getPlotCenterLine() const +{ + return this->plotCenterLine; +} + +void JKQTPRangeBase::setInvertedRange(bool __value) +{ + this->invertedRange = __value; +} + +bool JKQTPRangeBase::getInvertedRange() const +{ + return this->invertedRange; +} + +void JKQTPRangeBase::setPlotRange(bool __value) +{ + this->plotRange = __value; +} + +bool JKQTPRangeBase::getPlotRange() const +{ + return this->plotRange; +} + +void JKQTPRangeBase::setFillRange(bool __value) +{ + this->fillRange = __value; +} + +bool JKQTPRangeBase::getFillRange() const +{ + return this->fillRange; +} + +void JKQTPRangeBase::setPlotRangeLines(bool __value) +{ + this->plotRangeLines = __value; +} + +bool JKQTPRangeBase::getPlotRangeLines() const +{ + return this->plotRangeLines; +} + + + +JKQTPHorizontalRange::JKQTPHorizontalRange(JKQTBasePlotter* parent): + JKQTPRangeBase(parent) +{ + +} + JKQTPHorizontalRange::JKQTPHorizontalRange(JKQTPlotter* parent): JKQTPHorizontalRange(parent->getPlotter()) @@ -175,175 +354,6 @@ bool JKQTPHorizontalRange::getYMinMax(double &miny, double &maxy, double &smalle return true; } -QColor JKQTPHorizontalRange::getKeyLabelColor() const -{ - return centerColor; -} - -void JKQTPHorizontalRange::setDrawCenterLineOnly() -{ - plotCenterLine=true; - plotRange=false; -} - -void JKQTPHorizontalRange::setColor(QColor c) -{ - setLineColor(c); - centerColor=c; - setFillColor(JKQTPGetDerivedColor(parent->getCurrentPlotterStyle().graphFillColorDerivationMode, c)); -} - - -void JKQTPHorizontalRange::setCenterColor(const QColor &__value) -{ - this->centerColor = __value; -} - -QColor JKQTPHorizontalRange::getCenterColor() const -{ - return this->centerColor; -} - -void JKQTPHorizontalRange::setCenterStyle(Qt::PenStyle __value) -{ - this->centerStyle = __value; -} - -Qt::PenStyle JKQTPHorizontalRange::getCenterStyle() const -{ - return this->centerStyle; -} - -void JKQTPHorizontalRange::setCenterLineWidth(double __value) -{ - this->centerLineWidth = __value; -} - -double JKQTPHorizontalRange::getCenterLineWidth() const -{ - return this->centerLineWidth; -} - -void JKQTPHorizontalRange::setRangeMin(double __value) -{ - this->rangeMin = __value; -} - -double JKQTPHorizontalRange::getRangeMin() const -{ - return this->rangeMin; -} - -void JKQTPHorizontalRange::setRangeMax(double __value) -{ - this->rangeMax = __value; -} - -double JKQTPHorizontalRange::getRangeMax() const -{ - return this->rangeMax; -} - -void JKQTPHorizontalRange::setSizeMin(double __value) -{ - this->sizeMin = __value; -} - -double JKQTPHorizontalRange::getSizeMin() const -{ - return this->sizeMin; -} - -void JKQTPHorizontalRange::setSizeMax(double __value) -{ - this->sizeMax = __value; -} - -double JKQTPHorizontalRange::getSizeMax() const -{ - return this->sizeMax; -} - -void JKQTPHorizontalRange::setUnlimitedSizeMin(bool __value) -{ - this->unlimitedSizeMin = __value; -} - -bool JKQTPHorizontalRange::getUnlimitedSizeMin() const -{ - return this->unlimitedSizeMin; -} - -void JKQTPHorizontalRange::setUnlimitedSizeMax(bool __value) -{ - this->unlimitedSizeMax = __value; -} - -bool JKQTPHorizontalRange::getUnlimitedSizeMax() const -{ - return this->unlimitedSizeMax; -} - -void JKQTPHorizontalRange::setRangeCenter(double __value) -{ - this->rangeCenter = __value; -} - -double JKQTPHorizontalRange::getRangeCenter() const -{ - return this->rangeCenter; -} - -void JKQTPHorizontalRange::setPlotCenterLine(bool __value) -{ - this->plotCenterLine = __value; -} - -bool JKQTPHorizontalRange::getPlotCenterLine() const -{ - return this->plotCenterLine; -} - -void JKQTPHorizontalRange::setInvertedRange(bool __value) -{ - this->invertedRange = __value; -} - -bool JKQTPHorizontalRange::getInvertedRange() const -{ - return this->invertedRange; -} - -void JKQTPHorizontalRange::setPlotRange(bool __value) -{ - this->plotRange = __value; -} - -bool JKQTPHorizontalRange::getPlotRange() const -{ - return this->plotRange; -} - -void JKQTPHorizontalRange::setFillRange(bool __value) -{ - this->fillRange = __value; -} - -bool JKQTPHorizontalRange::getFillRange() const -{ - return this->fillRange; -} - -void JKQTPHorizontalRange::setPlotRangeLines(bool __value) -{ - this->plotRangeLines = __value; -} - -bool JKQTPHorizontalRange::getPlotRangeLines() const -{ - return this->plotRangeLines; -} - @@ -354,12 +364,12 @@ bool JKQTPHorizontalRange::getPlotRangeLines() const JKQTPVerticalRange::JKQTPVerticalRange(JKQTBasePlotter* parent): - JKQTPHorizontalRange(parent) + JKQTPRangeBase(parent) { } JKQTPVerticalRange::JKQTPVerticalRange(JKQTPlotter* parent): - JKQTPHorizontalRange(parent) + JKQTPVerticalRange(parent->getPlotter()) { } diff --git a/lib/jkqtplotter/graphs/jkqtprange.h b/lib/jkqtplotter/graphs/jkqtprange.h index 7ac06cf81a..e8df35c5a0 100644 --- a/lib/jkqtplotter/graphs/jkqtprange.h +++ b/lib/jkqtplotter/graphs/jkqtprange.h @@ -44,119 +44,145 @@ class JKQTPDatastore; -/*! \brief simply marks a range (and possibly a centerline) in a plot. This may be used to display e.g. mean +/- stddev - or a range of interest, or the range of good values, ... - \ingroup jkqtplotter_diverse - - \image html JKQTPHorizontalRange.png +/** \brief simply marks a range (and possibly a centerline) in a plot. This may be used to display e.g. mean +/- stddev + * or a range of interest, or the range of good values, ... + * \ingroup jkqtplotter_annotations + * + * \image html JKQTPRangeBase.png + * + * You can also invert the range, i.e. everything outside the range will be filled (\c setInvertedRange() ): + * + * \image html JKQTPRangeBase_Inverted.png */ -class JKQTPLOTTER_LIB_EXPORT JKQTPHorizontalRange: public JKQTPGraph, public JKQTPGraphLineStyleMixin, public JKQTPGraphFillStyleMixin { +class JKQTPLOTTER_LIB_EXPORT JKQTPRangeBase: public JKQTPPlotElement, public JKQTPGraphLineStyleMixin, public JKQTPGraphFillStyleMixin { Q_OBJECT public: /** \brief class constructor */ - JKQTPHorizontalRange(JKQTBasePlotter* parent=nullptr); - /** \brief class constructor */ - JKQTPHorizontalRange(JKQTPlotter* parent); + JKQTPRangeBase(JKQTBasePlotter* parent=nullptr); - /** \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 get the maximum and minimum x-value of the graph - * - * The result is given in the two parameters which are call-by-reference parameters! - */ - 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! - */ - bool getYMinMax(double& miny, double& maxy, double& smallestGreaterZero) override; /** \brief returns the color to be used for the key label */ virtual QColor getKeyLabelColor() const override; - /** \brief disables all drawing features except the centerline */ - void setDrawCenterLineOnly(); - /*! \brief set the color of the graph (all lines and filling) */ - virtual void setColor(QColor c); - - /*! \copydoc centerColor */ - void setCenterColor(const QColor & __value); /*! \copydoc centerColor */ QColor getCenterColor() const; /*! \copydoc centerStyle */ - void setCenterStyle(Qt::PenStyle __value); - /*! \copydoc centerStyle */ Qt::PenStyle getCenterStyle() const; /*! \copydoc centerLineWidth */ void setCenterLineWidth(double __value); /*! \copydoc centerLineWidth */ double getCenterLineWidth() const; /*! \copydoc rangeMin */ - void setRangeMin(double __value); - /*! \copydoc rangeMin */ double getRangeMin() const; /*! \copydoc rangeMax */ - void setRangeMax(double __value); - /*! \copydoc rangeMax */ double getRangeMax() const; /*! \copydoc sizeMin */ - void setSizeMin(double __value); - /*! \copydoc sizeMin */ double getSizeMin() const; /*! \copydoc sizeMax */ - void setSizeMax(double __value); - /*! \copydoc sizeMax */ double getSizeMax() const; /*! \copydoc unlimitedSizeMin */ - void setUnlimitedSizeMin(bool __value); - /*! \copydoc unlimitedSizeMin */ bool getUnlimitedSizeMin() const; /*! \copydoc unlimitedSizeMax */ - void setUnlimitedSizeMax(bool __value); - /*! \copydoc unlimitedSizeMax */ bool getUnlimitedSizeMax() const; - /*! \copydoc rangeCenter */ - void setRangeCenter(double __value); /*! \copydoc rangeCenter */ double getRangeCenter() const; /*! \copydoc plotCenterLine */ - void setPlotCenterLine(bool __value); - /*! \copydoc plotCenterLine */ bool getPlotCenterLine() const; /*! \copydoc invertedRange */ - void setInvertedRange(bool __value); - /*! \copydoc invertedRange */ bool getInvertedRange() const; /*! \copydoc plotRange */ - void setPlotRange(bool __value); - /*! \copydoc plotRange */ bool getPlotRange() const; /*! \copydoc fillRange */ - void setFillRange(bool __value); - /*! \copydoc fillRange */ bool getFillRange() const; /*! \copydoc plotRangeLines */ - void setPlotRangeLines(bool __value); - /*! \copydoc plotRangeLines */ bool getPlotRangeLines() const; + public slots: + /*! \brief set the color of the graph (all lines and filling) */ + virtual void setColor(QColor c); + + /** \brief disables all drawing features except the centerline */ + void setDrawCenterLineOnly(); + /*! \copydoc centerColor */ + void setCenterColor(const QColor & __value); + /*! \copydoc centerStyle */ + void setCenterStyle(Qt::PenStyle __value); + /*! \copydoc plotRangeLines */ + void setPlotRangeLines(bool __value); + /*! \copydoc fillRange */ + void setFillRange(bool __value); + /*! \copydoc plotRange */ + void setPlotRange(bool __value); + /*! \copydoc invertedRange */ + void setInvertedRange(bool __value); + /*! \copydoc rangeCenter */ + void setRangeCenter(double __value); + /*! \copydoc plotCenterLine */ + void setPlotCenterLine(bool __value); + /*! \copydoc unlimitedSizeMax */ + void setUnlimitedSizeMax(bool __value); + /*! \copydoc unlimitedSizeMin */ + void setUnlimitedSizeMin(bool __value); + /** \copydoc sizeMax + * + * \note this also sets unlimitedSizeMax to \c true + * \see unlimitedSizeMax + */ + void setSizeMax(double __value); + /** \copydoc sizeMin + * + * \note this also sets unlimitedSizeMin to \c true + * \see unlimitedSizeMin + */ + void setSizeMin(double __value); + /** \copydoc rangeMax*/ + void setRangeMax(double __value); + /** \copydoc rangeMin*/ + void setRangeMin(double __value); protected: - /** \brief min-value of range */ + /** \brief min-value of range + * \image html JKQTPRangeBase.png + */ double rangeMin; - /** \brief max-value of range */ + /** \brief max-value of range + * \image html JKQTPRangeBase.png + */ double rangeMax; - /** \brief where to plot the center line */ + /** \brief where to plot the center line + * \image html JKQTPRangeBase.png + */ double rangeCenter; + /** \brief if \c unlimitedSizeMin==false, then the range rectangle only extends to this value on the axis perpendicular to the range axis (towards smaller numbers) + * + * \image html JKQTPRangeBase.png + * \see unlimitedSizeMin + */ double sizeMin; + /** \brief if \c unlimitedSizeMax==false, then the range rectangle only extends to this value on the axis perpendicular to the range axis (towards larger numbers) + * + * \image html JKQTPRangeBase.png + * \see unlimitedSizeMax + */ double sizeMax; + /** \brief if \c true, the range elongates infinitely in the direction perpendicular to the range axis and towards smaller numbers, otherwise the range rectangle stops at rangeMin + * + * \image html JKQTPRangeBase.png + * \see sizeMin + */ bool unlimitedSizeMin; + /** \brief if \c true, the range elongates infinitely in the direction perpendicular to the range axis and towards larger numbers, otherwise the range rectangle stops at rangeMin + * + * \image html JKQTPRangeBase.png + * \see sizeMax + */ bool unlimitedSizeMax; /** \brief indicates whether to plot a center line */ bool plotCenterLine; - /** \brief if \c true, fills the parts outside the given range */ + /** \brief if \c true, fills the parts outside the given range + * + * \image html JKQTPRangeBase_Inverted.png + */ bool invertedRange; /** \brief if \c true, the range is plotted, if \c false, only the center line is plotted (if \a plotCenterLine is \c true ) */ bool plotRange; @@ -177,14 +203,59 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPHorizontalRange: public JKQTPGraph, public JKQ - -/*! \brief simply marks a range (and possibly a centerline) in a plot. This may be used to display e.g. mean +/- stddev - or a range of interest, or the range of good values, ... - \ingroup jkqtplotter_diverse - - \image html JKQTPVerticalRange.png +/** \brief simply marks a range (and possibly a centerline) in a plot. This may be used to display e.g. mean +/- stddev + * or a range of interest, or the range of good values, ... + * \ingroup jkqtplotter_annotations + * + * \image html JKQTPHorizontalRange.png + * + * \see JKQTPVerticalRange + * + * Explanation of basic features: + * + * \copydetails JKQTPRangeBase */ -class JKQTPLOTTER_LIB_EXPORT JKQTPVerticalRange: public JKQTPHorizontalRange { +class JKQTPLOTTER_LIB_EXPORT JKQTPHorizontalRange: public JKQTPRangeBase { + Q_OBJECT +public: + /** \brief class constructor */ + JKQTPHorizontalRange(JKQTBasePlotter* parent=nullptr); + /** \brief class constructor */ + JKQTPHorizontalRange(JKQTPlotter* parent); + + /** \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 get the maximum and minimum x-value of the graph + * + * The result is given in the two parameters which are call-by-reference parameters! + */ + 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! + */ + bool getYMinMax(double& miny, double& maxy, double& smallestGreaterZero) override; +}; + + + + +/** \brief simply marks a range (and possibly a centerline) in a plot. This may be used to display e.g. mean +/- stddev + * or a range of interest, or the range of good values, ... + * \ingroup jkqtplotter_annotations + * + * \image html JKQTPVerticalRange.png + * + * \see JKQTPHorizontalRange + * + * Explanation of basic features (using the example of JKQTPHorizontalRange): + * + * \copydetails JKQTPRangeBase + */ +class JKQTPLOTTER_LIB_EXPORT JKQTPVerticalRange: public JKQTPRangeBase { Q_OBJECT public: /** \brief class constructor */ diff --git a/lib/jkqtplotter/graphs/jkqtpviolinplot.h b/lib/jkqtplotter/graphs/jkqtpviolinplot.h index 0b3c40e1b7..8c1336b0db 100644 --- a/lib/jkqtplotter/graphs/jkqtpviolinplot.h +++ b/lib/jkqtplotter/graphs/jkqtpviolinplot.h @@ -35,7 +35,7 @@ /*! \brief This implements a single vertical Violin Plot as a "geometric element" \ingroup jkqtplotter_statgraphs - \ingroup jkqtplotter_geoplots + \ingroup jkqtplotter_diverse Draws a vertical violin plot in one of the following styles: @@ -167,7 +167,7 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPViolinplotVerticalElement: public JKQTPPlotObj /*! \brief This implements a single horizontal Violin Plot as a "geometric element" \ingroup jkqtplotter_statgraphs - \ingroup jkqtplotter_geoplots + \ingroup jkqtplotter_diverse Draws a horizontal violin plot in one of the following styles: