doc update and many bugfixes

This commit is contained in:
jkriege2 2024-02-12 15:01:46 +01:00
parent 503ef13275
commit dd940ab569
20 changed files with 284 additions and 284 deletions

View File

@ -100,7 +100,7 @@ All test-projects are Qt-projects that use qmake to build. You can load them int
<tr><td> \image html paramvectorfield_small.png <tr><td> \image html paramvectorfield_small.png
<td> \subpage JKQTPParametrizedVectorFieldGraphExample <td> \subpage JKQTPParametrizedVectorFieldGraphExample
<td> `JKQTPParametrizedVectorFieldGraph` <td> `JKQTPParametrizedVectorFieldGraph`
<tr><td> \image html financialgraph_small.png <tr><td> \image html financialgraphs_small.png
<td> \subpage JKQTPlotterFinancialChartExample <td> \subpage JKQTPlotterFinancialChartExample
<td> `JKQTPFinancialGraph` (Candlestick/OHLC graphs), date-axis, rotated labels <td> `JKQTPFinancialGraph` (Candlestick/OHLC graphs), date-axis, rotated labels
</table> </table>

View File

@ -133,7 +133,7 @@
\section JKQTMathTextSuppoertedLaTeXVerbatim Verbatim Text \section JKQTMathTextSuppoertedLaTeXVerbatim Verbatim Text
Sometimes it is necessary to typeset text withou interpreting it as LaTeX markup. These instructions are implemented for that: Sometimes it is necessary to typeset text withou interpreting it as LaTeX markup. These instructions are implemented for that:
- <code>\\verb!...!</code>: interpret enclosed text between \c ! as verbose. Instead of \ ! you can choose ANY character! \image html jkqtmathtext/jkqtmathtext_verb.png generated by <code>\\verb!\\LaTeX{} is not pares inside \\verb~..~! outside {\\backslash}verb</code> - <code>\\verb!...!</code>: interpret enclosed text between \c ! as verbose. Instead of \ ! you can choose ANY character! \image html jkqtmathtext/jkqtmathtext_verb.png "generated by <code>\\verb!\\LaTeX{} is not pares inside \\verb~..~! outside {\\backslash}verb</code>"
- <code>\\begin{verbatim}...\\end{verbatim}</code>: interpret enclosed multi-line text as verbatim. \image html jkqtmathtext/jkqtmathtext_verbatim.png - <code>\\begin{verbatim}...\\end{verbatim}</code>: interpret enclosed multi-line text as verbatim. \image html jkqtmathtext/jkqtmathtext_verbatim.png
- <code>\\begin{lstlisting}...\\end{lstlisting}</code>: actually menat for highlighted code, for now this is the same as \c \\begin{verbatim}...\\end{verbatim}. \image html jkqtmathtext/jkqtmathtext_lstlisting.png - <code>\\begin{lstlisting}...\\end{lstlisting}</code>: actually menat for highlighted code, for now this is the same as \c \\begin{verbatim}...\\end{verbatim}. \image html jkqtmathtext/jkqtmathtext_lstlisting.png
- <code>\\begin{verbatim*}...\\end{verbatim*}</code>: interpret enclosed multi-line text as verbatim. Print with visible whitespace and tab characters \image html jkqtmathtext/jkqtmathtext_verbatimast.png - <code>\\begin{verbatim*}...\\end{verbatim*}</code>: interpret enclosed multi-line text as verbatim. Print with visible whitespace and tab characters \image html jkqtmathtext/jkqtmathtext_verbatimast.png
@ -146,9 +146,9 @@
- \c \\alpha ... : display the according greek letter in italic style (see \ref jkqtmathtext_supportedlatexsymbols ) \image html jkqtmathtext/jkqtmathtext_greek.png - \c \\alpha ... : display the according greek letter in italic style (see \ref jkqtmathtext_supportedlatexsymbols ) \image html jkqtmathtext/jkqtmathtext_greek.png
- \c \\upalpha ... : display the according upright greek letter. This letter is always upright, independent of the surrounding environment (see \ref jkqtmathtext_supportedlatexsymbols ) \image html jkqtmathtext/jkqtmathtext_upgreek.png - \c \\upalpha ... : display the according upright greek letter. This letter is always upright, independent of the surrounding environment (see \ref jkqtmathtext_supportedlatexsymbols ) \image html jkqtmathtext/jkqtmathtext_upgreek.png
- \c \\textalpha ... : display the according greek letter with italic style defined by the current environment (i.e. italic in mathmode or inside \c \\textit{\\alpha} and upright in text mode). (see \ref jkqtmathtext_supportedlatexsymbols ) \image html jkqtmathtext/jkqtmathtext_textgreek.png - \c \\textalpha ... : display the according greek letter with italic style defined by the current environment (i.e. italic in mathmode or inside \c \\textit{\\alpha} and upright in text mode). (see \ref jkqtmathtext_supportedlatexsymbols ) \image html jkqtmathtext/jkqtmathtext_textgreek.png
- \c \\charDECIMAL and \c \\char\"HEX and \c \\char\'OCTAL : draws a unicode character from its 32-bit codepoint \image html jkqtmathtext/jkqtmathtext_char.png (generated by <code>A: \\char65, circonflex: \\char\"109 accent: \\char\'351</code>) - \c \\charDECIMAL and \c \\char\"HEX and \c \\char\'OCTAL : draws a unicode character from its 32-bit codepoint \image html jkqtmathtext/jkqtmathtext_char.png "(generated by <code>A: \\char65, circonflex: \\char\"109 accent: \\char\'351</code>)"
- \c \\unicode{HEX} and \c \\usym{HEX} : draws a unicode character from its 32-bit codepoint \image html jkqtmathtext/jkqtmathtext_unicode.png (generated by <code>star: \\unicode{2605}, circonflex: \\unicode{109} emoticons: \\usym{1F440} \\usym{1F929}</code>) - \c \\unicode{HEX} and \c \\usym{HEX} : draws a unicode character from its 32-bit codepoint \image html jkqtmathtext/jkqtmathtext_unicode.png "(generated by <code>star: \\unicode{2605}, circonflex: \\unicode{109} emoticons: \\usym{1F440} \\usym{1F929}</code>)"
- \c \\utfeight{HEX} : draws a unicode character from its UTF-8 encoding \image html jkqtmathtext/jkqtmathtext_utf8.png (generated by <code>star: \\utfeight{e29885} emoticons \\utfeight{F09F9881} \\utfeight{f09f98bb}</code>) - \c \\utfeight{HEX} : draws a unicode character from its UTF-8 encoding \image html jkqtmathtext/jkqtmathtext_utf8.png "(generated by <code>star: \\utfeight{e29885} emoticons \\utfeight{F09F9881} \\utfeight{f09f98bb}</code>)"
- The usual LaTeX-accent commands are also implemented here and work as expected in text-mode, provided the matching unicode characters are available in the current font. - The usual LaTeX-accent commands are also implemented here and work as expected in text-mode, provided the matching unicode characters are available in the current font.
\image html jkqtmathtext/jkqtmathtext_textaccents.png \image html jkqtmathtext/jkqtmathtext_textaccents.png
- In math-mode the text-accent commands do not work. here you have to use the math-mode commands: - In math-mode the text-accent commands do not work. here you have to use the math-mode commands:

View File

@ -1,186 +0,0 @@
/*!
\defgroup jkqtplotter_graphsgroup_classstructure Graphs
\ingroup jkqtplotter_general
\section jkqtplotter_graphsgroup_classstructure_basics Graph Class Structure
Each type of graph is represented by another class, which has to be derived from JKQTPPlotElement. This class provides a basic virtual interface
that allows JKQTPlotter to draw the graphs represented by them. This interface consists of these functions:
- JKQTPPlotElement::draw() draws the graph onto a given JKQTPEnhancedPainter (derived from <a href="http://doc.qt.io/qt-5/qpainter.html">QPainter</a>)
- JKQTPPlotElement::drawKeyMarker() draws the small marker image in the plot legend
- JKQTPPlotElement::getKeyLabelColor() returns a color for the legend entry for the graph
- JKQTPPlotElement::getXMinMax() returns the extent of the graph in x-direction (e.g. for auto-zooming)
- JKQTPPlotElement::getYMinMax() returns the extent of the graph in Y-direction (e.g. for auto-zooming)
.
In addition to these basic functions, there are additional functions that can be used to draw something outside the actual plot rectangle.
These are used to e.g. add color-scales to the side of the graph:
- JKQTPPlotElement::getOutsideSize() returns the amount of space required outside the plot rectangle
- JKQTPPlotElement::drawOutside() draws the elements outside the plot rectangle
.
Usually if writing a new graph, one would not directly
derive from JKQTPPlotElement, but from a cass in it's hirarchy of children. These children already provide certain facilities for certain types of graphs.
\dot
digraph
{
// LATEX_PDF_SIZE
bgcolor="transparent";
edge [fontname="FreeSans",fontsize="10",labelfontname="FreeSans",labelfontsize="10"];
node [fontname="FreeSans",fontsize="10"];
rankdir="LR";
{
rank=same;
JKQTPPlotElement [URL="\ref JKQTPPlotElement"];
noteJKQTPPlotElement [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nelements drawn\nonto a plot"];
JKQTPPlotElement -> noteJKQTPPlotElement [style=dashed,arrowhead=none];
}
{
rank=same;
JKQTPGraph [URL="\ref JKQTPPlotElement"];
noteJKQTPGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nactual graphs"];
JKQTPGraph -> noteJKQTPGraph [style=dashed,arrowhead=none];
JKQTPGeometricPlotElement [URL="\ref JKQTPGeometricPlotElement"];
noteJKQTPGeometricPlotElement [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nnon-graph elements,\ne.g. geometric elements"];
JKQTPGeometricPlotElement -> noteJKQTPGeometricPlotElement [style=dashed,arrowhead=none];
JKQTPPlotAnnotationElement [URL="\ref JKQTPPlotAnnotationElement"];
noteJKQTPPlotAnnotationElement [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraph annotation elements,\ne.g. text, symbols, ranges ..."];
JKQTPPlotAnnotationElement -> noteJKQTPPlotAnnotationElement [style=dashed,arrowhead=none];
}
{
rank=same;
JKQTPXYGraph [URL="\ref JKQTPXYGraph"]
noteJKQTPXYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x,y) data pairs"];
JKQTPXYGraph -> noteJKQTPXYGraph [style=dashed,arrowhead=none];
JKQTPSingleColumnGraph [URL="\ref JKQTPSingleColumnGraph"]
noteJKQTPSingleColumnGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on only\n a single column of data"];
JKQTPSingleColumnGraph -> noteJKQTPSingleColumnGraph [style=dashed,arrowhead=none];
JKQTPImageBase [URL="\ref JKQTPImageBase"]
noteJKQTPImageBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs that represent \n2D images/matrices"];
JKQTPImageBase -> noteJKQTPImageBase [style=dashed,arrowhead=none];
}
{
rank=same;
JKQTPXYYGraph [URL="\ref JKQTPXYYGraph"]
noteJKQTPXYYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x, y1, y2) data triples"];
JKQTPXYYGraph -> noteJKQTPXYYGraph [style=dashed,arrowhead=none];
JKQTPXXYGraph [URL="\ref JKQTPXXYGraph"]
noteJKQTPXXYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x1, x2, y) data triples"];
JKQTPXXYGraph -> noteJKQTPXXYGraph [style=dashed,arrowhead=none];
JKQTPXYAndVectorGraph [URL="\ref JKQTPXYAndVectorGraph"]
noteJJKQTPXYAndVectorGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nvector field graphs based on\n (x, y, dx, dy) data quadruples"];
JKQTPXYAndVectorGraph -> noteJJKQTPXYAndVectorGraph [style=dashed,arrowhead=none];
JKQTPXYBaselineGraph [URL="\ref JKQTPXYBaselineGraph"]
noteJJKQTPXYBaselineGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x,y) data pairs and a baseline"];
JKQTPXYBaselineGraph -> noteJJKQTPXYBaselineGraph [style=dashed,arrowhead=none];
JKQTPEvaluatedFunctionGraphBase [URL="\ref JKQTPEvaluatedFunctionGraphBase"]
noteJKQTPEvaluatedFunctionGraphBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs that represent \ndynamically evaluated functions"];
JKQTPEvaluatedFunctionGraphBase -> noteJKQTPEvaluatedFunctionGraphBase [style=dashed,arrowhead=none];
JKQTPMathImageBase [URL="\ref JKQTPMathImageBase"]
noteJKQTPMathImageBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ndata-based images"];
JKQTPMathImageBase -> noteJKQTPMathImageBase [style=dashed,arrowhead=none];
}
{
rank=same;
JKQTPBarGraphBase [URL="\ref JKQTPBarGraphBase"]
noteJKQTPBarGraphBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nbarcharts"];
JKQTPBarGraphBase -> noteJKQTPBarGraphBase [style=dashed,arrowhead=none];
JKQTPFilledCurveGraphBase [URL="\ref JKQTPFilledCurveGraphBase"]
noteJKQTPFilledCurveGraphBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nfilled graphs"];
JKQTPFilledCurveGraphBase -> noteJKQTPFilledCurveGraphBase [style=dashed,arrowhead=none];
JKQTPImpulsesGraphBase [URL="\ref JKQTPImpulsesGraphBase"]
noteJKQTPImpulsesGraphBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nimpulse graphs"];
JKQTPImpulsesGraphBase -> noteJKQTPImpulsesGraphBase [style=dashed,arrowhead=none];
JKQTPSpecialLineGraphBase [URL="\ref JKQTPSpecialLineGraphBase"]
noteJKQTPSpecialLineGraphBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nspecial line graphs"];
JKQTPSpecialLineGraphBase -> noteJKQTPSpecialLineGraphBase [style=dashed,arrowhead=none];
JKQTPBoxplotGraphBase [URL="\ref JKQTPBoxplotGraphBase"]
noteJKQTPBoxplotGraphBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs that represent \na set of boxplots"];
JKQTPBoxplotGraphBase -> noteJKQTPBoxplotGraphBase [style=dashed,arrowhead=none];
JKQTPRangeBase [URL="\ref JKQTPRangeBase"];
noteJKQTPRangeBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nrange annotations"];
JKQTPRangeBase -> noteJKQTPRangeBase [style=dashed,arrowhead=none];
JKQTPBoxplotElementBase [URL="\ref JKQTPBoxplotElementBase"]
noteJKQTPBoxplotElementBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs that represent \na single boxplot"];
JKQTPBoxplotElementBase -> noteJKQTPBoxplotElementBase [style=dashed,arrowhead=none];
JKQTPViolinplotElementBase [URL="\ref JKQTPViolinplotElementBase"]
noteJKQTPViolinplotElementBase [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs that represent \na single violin plot"];
JKQTPViolinplotElementBase -> noteJKQTPViolinplotElementBase [style=dashed,arrowhead=none];
}
JKQTPPlotElement -> JKQTPGraph
JKQTPPlotElement -> JKQTPGeometricPlotElement
JKQTPPlotElement -> JKQTPPlotAnnotationElement
JKQTPPlotElement -> JKQTPRangeBase
JKQTPPlotElement -> JKQTPBoxplotElementBase
JKQTPPlotElement -> JKQTPViolinplotElementBase
JKQTPGraph -> JKQTPXYGraph
JKQTPGraph -> JKQTPSingleColumnGraph
JKQTPGraph -> JKQTPImageBase -> JKQTPMathImageBase
JKQTPGraph -> JKQTPEvaluatedFunctionGraphBase
JKQTPGraph -> JKQTPBoxplotGraphBase
JKQTPXYGraph -> JKQTPXYYGraph
JKQTPXYGraph -> JKQTPXXYGraph
JKQTPXYGraph -> JKQTPXYBaselineGraph
JKQTPXYBaselineGraph -> JKQTPBarGraphBase
JKQTPXYBaselineGraph -> JKQTPFilledCurveGraphBase
JKQTPXYBaselineGraph -> JKQTPImpulsesGraphBase
JKQTPXYBaselineGraph -> JKQTPSpecialLineGraphBase
}
\enddot
\section jkqtplotter_graphsgroup_classstructure_mixins Mix-In Classes for Graphs
\see \ref jkqtplotter_mixins
In addition there are mix-in classes that are used via multiple inheritance
that add additional features and properties to a graph. A prominent example are the classes for \ref jkqtplotter_basegraphserrors "error indicators".
With these there are usually two variants of one type of graph: One without error indicators and one with error indicators, e.g.:
- JKQTPXYLineGraph shows lines+symbols graphs made up from x/y-value pairs for each data point.
- JKQTPXYLineErrorGraph extends JKQTPXYLineGraph with error indicator drawing/properties provided by JKQTPXYGraphErrors
.
This approach allows to keep interfaces and appearance recognizeable over different graph classes and locates the source code
for a feature like error indicators in a single/in few class(es).
Another example of such a class is JKQTPColorPaletteStyleAndToolsMixin, which provides functions that allow to use color palettes. It is
mainly used for the \ref jkqtplotter_imagelots "Image/Matrix graphs", but also by e.g. JKQTPXYParametrizedScatterGraph.
*/

View File

@ -62,6 +62,10 @@
noteJKQTPXYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x,y) data pairs"]; noteJKQTPXYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x,y) data pairs"];
JKQTPXYGraph -> noteJKQTPXYGraph [style=dashed,arrowhead=none]; JKQTPXYGraph -> noteJKQTPXYGraph [style=dashed,arrowhead=none];
JKQTPXGraph [URL="\ref JKQTPXGraph"]
noteJKQTPXGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x,....) data e.g. JKQTPFinancialGraph"];
JKQTPXGraph -> noteJKQTPXGraph [style=dashed,arrowhead=none];
JKQTPSingleColumnGraph [URL="\ref JKQTPSingleColumnGraph"] JKQTPSingleColumnGraph [URL="\ref JKQTPSingleColumnGraph"]
noteJKQTPSingleColumnGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on only\n a single column of data"]; noteJKQTPSingleColumnGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on only\n a single column of data"];
JKQTPSingleColumnGraph -> noteJKQTPSingleColumnGraph [style=dashed,arrowhead=none]; JKQTPSingleColumnGraph -> noteJKQTPSingleColumnGraph [style=dashed,arrowhead=none];
@ -75,13 +79,17 @@
rank=same; rank=same;
JKQTPXYYGraph [URL="\ref JKQTPXYYGraph"] JKQTPXYYGraph [URL="\ref JKQTPXYYGraph"]
noteJKQTPXYYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x, y1, y2) data tripels"]; noteJKQTPXYYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x, y1, y2) data triples"];
JKQTPXYYGraph -> noteJKQTPXYYGraph [style=dashed,arrowhead=none]; JKQTPXYYGraph -> noteJKQTPXYYGraph [style=dashed,arrowhead=none];
JKQTPXXYGraph [URL="\ref JKQTPXXYGraph"] JKQTPXXYGraph [URL="\ref JKQTPXXYGraph"]
noteJKQTPXXYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x1, x2, y) data tripels"]; noteJKQTPXXYGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x1, x2, y) data triples"];
JKQTPXXYGraph -> noteJKQTPXXYGraph [style=dashed,arrowhead=none]; JKQTPXXYGraph -> noteJKQTPXXYGraph [style=dashed,arrowhead=none];
JKQTPXYAndVectorGraph [URL="\ref JKQTPXYAndVectorGraph"]
noteJJKQTPXYAndVectorGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\nvector field graphs based on\n (x, y, dx, dy) data quadruples"];
JKQTPXYAndVectorGraph -> noteJJKQTPXYAndVectorGraph [style=dashed,arrowhead=none];
JKQTPXYBaselineGraph [URL="\ref JKQTPXYBaselineGraph"] JKQTPXYBaselineGraph [URL="\ref JKQTPXYBaselineGraph"]
noteJJKQTPXYBaselineGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x,y) data pairs and a baseline"]; noteJJKQTPXYBaselineGraph [shape="note", color="lightyellow",style=filled,fontsize=8,label="base class for all\ngraphs based on\n (x,y) data pairs and a baseline"];
JKQTPXYBaselineGraph -> noteJJKQTPXYBaselineGraph [style=dashed,arrowhead=none]; JKQTPXYBaselineGraph -> noteJJKQTPXYBaselineGraph [style=dashed,arrowhead=none];
@ -139,6 +147,7 @@
JKQTPPlotElement -> JKQTPViolinplotElementBase JKQTPPlotElement -> JKQTPViolinplotElementBase
JKQTPGraph -> JKQTPXYGraph JKQTPGraph -> JKQTPXYGraph
JKQTPGraph -> JKQTPXGraph
JKQTPGraph -> JKQTPSingleColumnGraph JKQTPGraph -> JKQTPSingleColumnGraph
JKQTPGraph -> JKQTPImageBase -> JKQTPMathImageBase JKQTPGraph -> JKQTPImageBase -> JKQTPMathImageBase
JKQTPGraph -> JKQTPEvaluatedFunctionGraphBase JKQTPGraph -> JKQTPEvaluatedFunctionGraphBase
@ -147,6 +156,7 @@
JKQTPXYGraph -> JKQTPXYYGraph JKQTPXYGraph -> JKQTPXYYGraph
JKQTPXYGraph -> JKQTPXXYGraph JKQTPXYGraph -> JKQTPXXYGraph
JKQTPXYGraph -> JKQTPXYBaselineGraph JKQTPXYGraph -> JKQTPXYBaselineGraph
JKQTPXYGraph -> JKQTPXYAndVectorGraph
JKQTPXYBaselineGraph -> JKQTPBarGraphBase JKQTPXYBaselineGraph -> JKQTPBarGraphBase
JKQTPXYBaselineGraph -> JKQTPFilledCurveGraphBase JKQTPXYBaselineGraph -> JKQTPFilledCurveGraphBase

View File

@ -40,22 +40,99 @@ These classes are used by JKQTPlotterBase to output the plot.
\ingroup jkqtplotter_elements \ingroup jkqtplotter_elements
<table>
<tr>
<th>Icon
<th>
<th>Topic/Chapter
<tr>
<td>\link jkqtplotter_linesymbolgraphs &nbsp; \image{inline} html symbols_and_styles_small.png "" \endlink
<td>\link jkqtplotter_linesymbolgraphs &nbsp; \image{inline} html stepplots_small.png "" \endlink
<td>\ref jkqtplotter_linesymbolgraphs
<tr>
<td>\link jkqtplotter_filledgraphs &nbsp; \image{inline} html JKQTPFilledCurveXGraph_small.png "" \endlink
<td>\link jkqtplotter_filledgraphs &nbsp; \image{inline} html JKQTPfilledVerticalRangeGraph_WithLines_small.png "" \endlink
<td>\ref jkqtplotter_filledgraphs
<tr>
<td>&nbsp;
<td>\link jkqtplotter_sticks &nbsp; \image{inline} html JKQTPImpulsesVerticalGraph_Symbols_small.png "" \endlink
<td>\ref jkqtplotter_sticks
<tr>
<td>\link jkqtplotter_barcharts &nbsp; \image{inline} html JKQTPBarVerticalGraph_small.png "" \endlink
<td>\link jkqtplotter_barcharts &nbsp; \image{inline} html JKQTPbarVerticalGraphStacked_small.png "" \endlink
<td>\ref jkqtplotter_barcharts
<tr>
<td>\link jkqtplotter_statgraphs &nbsp; \image{inline} html boxplot_small.png "" \endlink
<td>\link jkqtplotter_statgraphs &nbsp; \image{inline} html JKQTPViolinplotVerticalElement_small.png "" \endlink
<td>\ref jkqtplotter_statgraphs
<tr>
<td>&nbsp;
<td>\link jkqtplotter_eventgraphs &nbsp; \image{inline} html JKQTPPeakStreamGraphY_small.png "" \endlink
<td>\ref jkqtplotter_eventgraphs
<tr>
<td>\link jkqtplotter_imagelots &nbsp; \image{inline} html JKQTPMathImageBaseModifyNone_small.png "" \endlink
<td>\link jkqtplotter_imagelots &nbsp; \image{inline} html overlayimageenhanced_small.png "" \endlink
<td>\ref jkqtplotter_imagelots
<tr>
<td>&nbsp;
<td>\link jkqtplotter_imagelots_contour &nbsp; \image{inline} html JKQTPColumnContourPlot_small.png "" \endlink
<td>\ref jkqtplotter_imagelots_contour
<tr>
<td>&nbsp;
<td>\link jkqtplotter_vectorfieldgraphs &nbsp; \image{inline} html paramvectorfield_small.png "" \endlink
<td>\ref jkqtplotter_vectorfieldgraphs
<tr>
<td>&nbsp;
<td>\link jkqtplotter_financialgraphs &nbsp; \image{inline} html financialgraphs_small.png "" \endlink
<td>\ref jkqtplotter_financialgraphs
<tr>
<td>\link jkqtplotter_geoplots &nbsp; \image{inline} html geo_coordinateaxis0_small.png "" \endlink
<td>\link jkqtplotter_geoplots &nbsp; \image{inline} html geo_text_small.png "" \endlink
<td>\ref jkqtplotter_geoplots
<tr>
<td>&nbsp;
<td>\link jkqtplotter_annotations &nbsp; \image{inline} html JKQTPHorizontalRange_small.png "" \endlink
<td>\ref jkqtplotter_annotations
<tr>
<td>&nbsp;
<td>\link jkqtplotter_graphlabels &nbsp; \image{inline} html JKQTPGLSimpleBoxAndLineONLYLABELS_small.png "" \endlink
<td>\ref jkqtplotter_graphlabels
</table>
\defgroup jkqtplotter_linesymbolgraphs Line/Symbol Graphs \defgroup jkqtplotter_linesymbolgraphs Line/Symbol Graphs
\ingroup jkqtplotter_concretegraphs \ingroup jkqtplotter_concretegraphs
This group assembles graphs that show their data with symbols and optionally with connecting lines in diferent styles: This group assembles graphs that show their data with symbols and optionally with connecting lines in diferent styles:
<table> <table>
<tr> <tr>
<th> Screenshot <td>\link jkqtplotter_linesymbolgraphs_scatter &nbsp; \image{inline} html JKQTPXYScatterGraph_small.png "" \endlink
<th> Classes <td>\link jkqtplotter_linesymbolgraphs_scatter &nbsp; \image{inline} html beeswarmplot_small.png "" \endlink
<td>\ref jkqtplotter_linesymbolgraphs_scatter
<tr> <tr>
<td>\image html symbols_and_styles_small.png <td>\link jkqtplotter_linesymbolgraphs_line &nbsp; \image{inline} html symbols_and_styles_small.png "" \endlink
<td> JKQTPXYLineGraph, JKQTPXYLineErrorGraph <td>\link jkqtplotter_linesymbolgraphs_line &nbsp; \image{inline} html stepplots_small.png "" \endlink
<td>\ref jkqtplotter_linesymbolgraphs_line
<tr> <tr>
<td>\image html stepplots_small.png <td>&nbsp;
<td> JKQTPSpecialLineHorizontalGraph, JKQTPSpecialLineVerticalGraph <td>\link jkqtplotter_linesymbolgraphs_param &nbsp; \image{inline} html paramscatterplot_small.png "" \endlink\endlink
<td>\ref jkqtplotter_linesymbolgraphs_param
<tr>
<td>\link jkqtplotter_functiongraphs &nbsp; \image{inline} html functionplot_small.png "" \endlink
<td>\link jkqtplotter_functiongraphs &nbsp; \image{inline} html evalcurve_small.png "" \endlink
<td>\ref jkqtplotter_functiongraphs
</table> </table>
\defgroup jkqtplotter_linesymbolgraphs_scatter Scatter Graphs \defgroup jkqtplotter_linesymbolgraphs_scatter Scatter Graphs
\ingroup jkqtplotter_linesymbolgraphs \ingroup jkqtplotter_linesymbolgraphs
@ -170,6 +247,7 @@ This group assembles graphs that add (textual) labels to the datapoints in a plo
<td> JKQTPBarVerticalStackableGraph, JKQTPBarHorizontalStackableGraph <td> JKQTPBarVerticalStackableGraph, JKQTPBarHorizontalStackableGraph
</table> </table>
\defgroup jkqtplotter_sticks Impulse-Charts \defgroup jkqtplotter_sticks Impulse-Charts
\ingroup jkqtplotter_concretegraphs \ingroup jkqtplotter_concretegraphs
@ -201,7 +279,7 @@ This group assembles graphs that add (textual) labels to the datapoints in a plo
<tr> <tr>
<td>\image html JKQTPViolinplotVerticalElement_small.png <td>\image html JKQTPViolinplotVerticalElement_small.png
<td> JKQTPViolinplotVerticalElement, JKQTPViolinplotHorizontalElement <td> JKQTPViolinplotVerticalElement, JKQTPViolinplotHorizontalElement
/table> </table>
\see \ref jkqtptools_math_statistics_adaptors for shortcuts to calculate statistical properties of data and then adding a plot with the results. \see \ref jkqtptools_math_statistics_adaptors for shortcuts to calculate statistical properties of data and then adding a plot with the results.
@ -273,6 +351,7 @@ Examples:
- \ref JKQTPlotterGeometricGraphs - \ref JKQTPlotterGeometricGraphs
. .
\defgroup jkqtplotter_eventgraphs Event Graphs \defgroup jkqtplotter_eventgraphs Event Graphs
\ingroup jkqtplotter_concretegraphs \ingroup jkqtplotter_concretegraphs
@ -317,28 +396,32 @@ This group assembles graphs that represent financial data (such as price mmoveme
<td> JKQTPFinancialGraph <td> JKQTPFinancialGraph
</table> </table>
\defgroup jkqtplotter_imagelots Matrix/Image Plotting \defgroup jkqtplotter_imagelots Matrix/Image Plotting
\ingroup jkqtplotter_concretegraphs \ingroup jkqtplotter_concretegraphs
<table> <table>
<tr> <tr>
<th> Screenshot <td>\link jkqtplotter_imagelots_elements &nbsp; \image{inline} html rgbimageplot_qt_small.png "" \endlink
<th> Classes <td>\link jkqtplotter_imagelots_elements &nbsp; \image{inline} html JKQTPMathImageBaseModifyNone_small.png "" \endlink
<td>\ref jkqtplotter_imagelots_elements
<tr> <tr>
<td>\image html rgbimageplot_qt_small.png <td>&nbsp;
<td> JKQTPImage <td>\link jkqtplotter_imagelots_overlays &nbsp; \image{inline} html overlayimageenhanced_small.png "" \endlink\endlink
<td>\ref jkqtplotter_imagelots_overlays
<tr> <tr>
<td>\image html JKQTPMathImageBaseModifyNone_small.png <td>&nbsp;
<td> JKQTPMathImage, JKQTPColumnMathImage <td>\link jkqtplotter_imagelots_contour &nbsp; \image{inline} html JKQTPColumnContourPlot_small.png "" \endlink\endlink
<td>\ref jkqtplotter_imagelots_contour
<tr> <tr>
<td>\image html rgbimageplots_small.png <td>&nbsp;
<td> JKQTPRGBMathImage, JKQTPColumnRGBMathImage <td>\link jkqtplotter_vectorfieldgraphs &nbsp; \image{inline} html paramvectorfield_small.png "" \endlink\endlink
<td>\ref jkqtplotter_vectorfieldgraphs
<tr> <tr>
<td>\image html overlayimage_small.png <td>&nbsp;
<td> JKQTPOverlayImage <td>\link jkqtplotter_imagelots_tools_LUTS &nbsp; \image{inline} html logo_palette_luts.png "" \endlink\endlink
<tr> <td>\ref jkqtplotter_imagelots_tools_LUTS
<td>\image html overlayimageenhanced_small.png
<td> JKQTPOverlayImageEnhanced, JKQTPColumnOverlayImageEnhanced
</table> </table>
\defgroup jkqtplotter_imagelots_elements Image Graphs \defgroup jkqtplotter_imagelots_elements Image Graphs

View File

@ -31,10 +31,10 @@
- C++ standard iterator interface - C++ standard iterator interface
- \ref jkqtptools_math_statistics (basic statistics, boxplots, histograms, kernel density estimates, regression analysis, polynomial fitting) - \ref jkqtptools_math_statistics (basic statistics, boxplots, histograms, kernel density estimates, regression analysis, polynomial fitting)
- <b>\ref jkqtplotter_elements "large variety of graphs that can be added to a plot", e.g.:</b> - <b>\ref jkqtplotter_elements "large variety of graphs that can be added to a plot", e.g.:</b>
- \ref jkqtplotter_linesymbolgraphs_simple "scatter-plots" (also \ref jkqtplotter_linesymbolgraphs_param "parametrized color/size/symbol by a third data-column") - \ref jkqtplotter_linesymbolgraphs_scatter "scatter-plots" (also \ref jkqtplotter_linesymbolgraphs_param "parametrized color/size/symbol by a third data-column")
- \ref jkqtplotter_linesymbolgraphs "line graphs, step graphs", \ref jkqtplotter_barssticks "impulses" - \ref jkqtplotter_linesymbolgraphs "line graphs, step graphs", \ref jkqtplotter_sticks "impulses"
- \ref jkqtplotter_filledgraphs "filled curves" - \ref jkqtplotter_filledgraphs "filled curves"
- \ref jkqtplotter_barssticks "barcharts (also stacked)" - \ref jkqtplotter_barcharts "barcharts (also stacked)"
- extensive support for different styles of error indicators - extensive support for different styles of error indicators
- \ref jkqtptools_math_parser "integrated mathematical function parser for function plots (with intelligent rendering algorithm)" - \ref jkqtptools_math_parser "integrated mathematical function parser for function plots (with intelligent rendering algorithm)"
- \ref jkqtplotter_functiongraphs "line/scatter graphs can also be based on C/C++ functions instead of data series (C++11 support!)" - \ref jkqtplotter_functiongraphs "line/scatter graphs can also be based on C/C++ functions instead of data series (C++11 support!)"
@ -75,6 +75,6 @@
\image html screenshotsbanner.png \link exampleTutorialProjects &nbsp; \image html examplesbanner.png "" \endlink
*/ */

View File

@ -53,8 +53,8 @@ Changes, compared to \ref page_whatsnew_V4_0_0 "v4.0.0" include:
<li>FIXED: fixes strange rendering with distortions (especially in text!), by correcting size calculation of internal image buffer</li> <li>FIXED: fixes strange rendering with distortions (especially in text!), by correcting size calculation of internal image buffer</li>
<li>FIXED: exporting gridPrinting plots when using only a JKQTBasePlotter</li> <li>FIXED: exporting gridPrinting plots when using only a JKQTBasePlotter</li>
<li>FIXED: fixed impleentations of JKQTPlotter::beginGraphs(), which actually returned the end-iterator (COPY-PASTE-ERROR!!!)</li> <li>FIXED: fixed impleentations of JKQTPlotter::beginGraphs(), which actually returned the end-iterator (COPY-PASTE-ERROR!!!)</li>
<li>FIXED issue <a href="https://github.com/jkriege2/JKQtPlotter/pull/99">#99: Clipping of Tick Labels</a>: for horizontal axes, additional space at the left and/or right of the plot is allowed so labels are no longer clipped (thanks to <a href="https://github.com/allenbarnett5">user:allenbarnett5/a> for reporting)</li> <li>FIXED issue <a href="https://github.com/jkriege2/JKQtPlotter/pull/99">#99: Clipping of Tick Labels</a>: for horizontal axes, additional space at the left and/or right of the plot is allowed so labels are no longer clipped (thanks to <a href="https://github.com/allenbarnett5">user:allenbarnett5</a> for reporting)</li>
<li>FIXED issue <a href="https://github.com/jkriege2/JKQtPlotter/pull/99">#99: Height of one-column key/legend was too large</a> (thanks to <a href="https://github.com/allenbarnett5">user:allenbarnett5/a> for reporting)</li> <li>FIXED issue <a href="https://github.com/jkriege2/JKQtPlotter/pull/99">#99: Height of one-column key/legend was too large</a> (thanks to <a href="https://github.com/allenbarnett5">user:allenbarnett5</a> for reporting)</li>
<li>FIXED issue mentioned in <a href="https://github.com/jkriege2/JKQtPlotter/pull/110">#110: Lock the panning action to certain values: View zooms in, when panning close to AbosluteXY</a> (thanks to <a href="https://github.com/sim186">user:sim186</a> for reporting)</li> <li>FIXED issue mentioned in <a href="https://github.com/jkriege2/JKQtPlotter/pull/110">#110: Lock the panning action to certain values: View zooms in, when panning close to AbosluteXY</a> (thanks to <a href="https://github.com/sim186">user:sim186</a> for reporting)</li>
<li>FIXED: jkqtpstatSum() and jkqtpstatSumSqr() did not work, as a non-existing function is called internally</li> <li>FIXED: jkqtpstatSum() and jkqtpstatSumSqr() did not work, as a non-existing function is called internally</li>
<li>FIXED removed unnecessary operators (<,>,<=,>=) from JKQTPColumnIterator and JKQTPColumnConstIterator, which lead to exceptions on some compilers (MSVC)</li> <li>FIXED removed unnecessary operators (<,>,<=,>=) from JKQTPColumnIterator and JKQTPColumnConstIterator, which lead to exceptions on some compilers (MSVC)</li>
@ -72,7 +72,7 @@ Changes, compared to \ref page_whatsnew_V4_0_0 "v4.0.0" include:
<li>IMPROVED/REWORKED: reworked JKQTPCADrawMode and coordinate axis drawing so the draw mide can be specified as ORed combination of flags from JKQTPCADrawModeElements, added flags to draw arrows at the end of the axis line</li> <li>IMPROVED/REWORKED: reworked JKQTPCADrawMode and coordinate axis drawing so the draw mide can be specified as ORed combination of flags from JKQTPCADrawModeElements, added flags to draw arrows at the end of the axis line</li>
<li>IMPROVED/REWORKED: coordinate axis code was refactored</li> <li>IMPROVED/REWORKED: coordinate axis code was refactored</li>
<li>IMPROVED/REWORKED: zomm/pan by mouse-wheel: now there are modes that support zoomin AND panning by trakpad and mouse-wheel simultaneously! This can only be implemented using heuristics, due to the way that Qt handles track-pad events, but the current solution should at least improve the behaviour seen before. Mainly <code>jkqtpmwaZoomByWheelAndTrackpadPan</code> was introduced into <code>JKQTPMouseWheelActions</code> und is set as default mode: Here JKQTPlotter tries to distinguish the QWheelEvent s sent by an actual mouse wheel and a trackpad.</li> <li>IMPROVED/REWORKED: zomm/pan by mouse-wheel: now there are modes that support zoomin AND panning by trakpad and mouse-wheel simultaneously! This can only be implemented using heuristics, due to the way that Qt handles track-pad events, but the current solution should at least improve the behaviour seen before. Mainly <code>jkqtpmwaZoomByWheelAndTrackpadPan</code> was introduced into <code>JKQTPMouseWheelActions</code> und is set as default mode: Here JKQTPlotter tries to distinguish the QWheelEvent s sent by an actual mouse wheel and a trackpad.</li>
<li>IMPROVED/REWORKED: better example graphs in \link JKQTPlotterStyling.</li> <li>IMPROVED/REWORKED: better example graphs in \ref JKQTPlotterStyling .</li>
<li>IMPROVED/REWORKED: legend/key positioning as combination of 3 values, e.g. \c JKQTPKeyOutsideTop|JKQTPKeyTop|JKQTPKeyRight or \c JKQTPKeyInside|JKQTPKeyTopJKQTPKeyRight</li> <li>IMPROVED/REWORKED: legend/key positioning as combination of 3 values, e.g. \c JKQTPKeyOutsideTop|JKQTPKeyTop|JKQTPKeyRight or \c JKQTPKeyInside|JKQTPKeyTopJKQTPKeyRight</li>
<li>IMPROVED/REWORKED: The functions JKQTBasePlotter::saveImage(), JKQTBasePlotter::saveAsPixelImage(), JKQTBasePlotter::saveAsPDF(), JKQTBasePlotter::saveSVG(), ... gained a bool return value to indicate whether sacing was successful.</li> <li>IMPROVED/REWORKED: The functions JKQTBasePlotter::saveImage(), JKQTBasePlotter::saveAsPixelImage(), JKQTBasePlotter::saveAsPDF(), JKQTBasePlotter::saveSVG(), ... gained a bool return value to indicate whether sacing was successful.</li>
<li>IMPROVED/REWORKED: More <code>save...()</code> functions will appear in the API of JKQTPlotter, so you don't have to go via JKQTPlotter::getPlotter(). These are merely forwarding the call to the internel JKQTBasePlotter instance.</li> <li>IMPROVED/REWORKED: More <code>save...()</code> functions will appear in the API of JKQTPlotter, so you don't have to go via JKQTPlotter::getPlotter(). These are merely forwarding the call to the internel JKQTBasePlotter instance.</li>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -5,23 +5,119 @@ The source code of the main application is (see [`financialgraphs.cpp`](https://
Here is a short summary of the important parts of the code: Here is a short summary of the important parts of the code:
First we need to set up the plotter and then generate some data for our plot. Here we use a simple random walk (with normally distributed steps) to simulate the price of some virtual stock. We simulate severals steps ofer <code>NDays</code> days and then calculate the necessary statistics over each day (i.e. the opening and closing price, as well as the daily maximum and minimum). Alternatively you could of course also load actual stock price data and read it in youself.
```.cpp ```.cpp
// 1. setup a plotter window and get a pointer to the internal datastore (for convenience)
JKQTPlotter plot;
JKQTPDatastore* ds=plot.getDatastore();
// 2. now we create 5 datacolumns with length Ndays entries in the datastore
// these will later hold the time-step and simulated market data of two stocks
const size_t NDays=31;
const size_t columnT=ds->addColumn("time");
const size_t columnO1=ds->addColumn("open(stock 1)");
const size_t columnC1=ds->addColumn("close(stock 1)");
const size_t columnL1=ds->addColumn("low(stock 1)");
const size_t columnH1=ds->addColumn("high(stock 1)");
const size_t columnO2=ds->addColumn("open(stock 2)");
const size_t columnC2=ds->addColumn("close(stock 2)");
const size_t columnL2=ds->addColumn("low(stock 2)");
const size_t columnH2=ds->addColumn("high(stock 2)");
const QDate t0(2024,1,8); // start date
// 3. now we simulate stock market data with a simple random walk
// with a few steps per day that are summmarized into the four
// properties Open,Close,Low,High for each day
double price1=30; // start price of stock 1
double price2=25; // start price of stock 2
const size_t stepsPerDay=20;
std::random_device rd; // random number generators:
std::mt19937 gen{rd()};
gen.seed(12352);
std::normal_distribution<double> dist1(0.001, 0.6);
std::normal_distribution<double> dist2(-0.0001, 0.4);
for (size_t t=0; t<NDays; t+=1) {// iterate over all simulated days (we don't care for weekends)
// step time from noon to noon in steps of days
const QDate d=t0.addDays(t);
ds->appendToColumn(columnT, QDateTime(d,QTime(12,0,0)).toMSecsSinceEpoch());
// the open-Value is the start-price of each day:
ds->appendToColumn(columnO1, price1);
ds->appendToColumn(columnO2, price2);
// now we iterate the market over the day
double L1=price1, L2=price2, H1=price1, H2=price2;
for (size_t i=0; i<stepsPerDay; i++) { // iterate over week days (Mon-Fri)
// prices are calculated from a sinple random walk (the while-loops ensure that we have positive prices only
double np;
while ((np=price1+dist1(gen))<=0.0); price1=np;
while ((np=price2+dist2(gen))<=0.0); price2=np;
// now we track the highest/lowest prices
L1=qMin(L1, price1);
L2=qMin(L2, price2);
H1=qMax(H1, price1);
H2=qMax(H2, price2);
}
// the close-Value is the final price of each day:
ds->appendToColumn(columnC1, price1);
ds->appendToColumn(columnC2, price2);
// finally we just have to add the highest and lowest prices of each day:
ds->appendToColumn(columnL1, L1);
ds->appendToColumn(columnL2, L2);
ds->appendToColumn(columnH1, H1);
ds->appendToColumn(columnH2, H2);
}
``` ```
Now we have all columns necessary for two JKQTPFinancialGraph graphs.The first graph will be drawn in the CandleStick style and the second in the OHLC-sytle:
```.cpp
// 3. create two JKQTPFinancialGraph to display the data:
JKQTPFinancialGraph* graphCandleStick=new JKQTPFinancialGraph(&plot);
graphCandleStick->setXColumn(columnT);
graphCandleStick->setOpenColumn(columnO1);
graphCandleStick->setHighColumn(columnH1);
graphCandleStick->setLowColumn(columnL1);
graphCandleStick->setCloseColumn(columnC1);
graphCandleStick->setGraphType(JKQTPFinancialGraph::CandleStick);
graphCandleStick->setTitle(QObject::tr("stock 1 (candlestick)"));
graphCandleStick->setCandlestickTwoColor(QColor("darkgreen"), QColor("maroon"));
JKQTPFinancialGraph* graphOHLC=new JKQTPFinancialGraph(&plot);
graphOHLC->setXColumn(columnT);
graphOHLC->setOpenColumn(columnO2);
graphOHLC->setHighColumn(columnH2);
graphOHLC->setLowColumn(columnL2);
graphOHLC->setCloseColumn(columnC2);
graphOHLC->setGraphType(JKQTPFinancialGraph::OHLC);
graphOHLC->setTitle(QObject::tr("stock 2 (OHLC)"));
graphOHLC->setOHLCTwoColor(QColor("darkgreen"), QColor("maroon"));
// 4. add the graphs to the plot, so it is actually displayed
plot.addGraph(graphCandleStick);
plot.addGraph(graphOHLC);
```
Finally we only have to format the plot and coordinate axes slightly to produce a nicer and better readable plot:
```.cpp
// 5. scale the plot so the graph is contained and make x-axis a date-axis
plot.getXAxis()->setTickLabelType(JKQTPCALTdate);
plot.getXAxis()->setAxisLabel("time");
plot.getXAxis()->setTickLabelAngle(35); // rotate axis tick label by 35°, so they are readable
plot.getYAxis()->setAxisLabel("stock price [\\$]");
plot.getMainKey()->setPosition(JKQTPKeyInsideTopLeft);
plot.zoomToFit();```
The result looks like this: The result looks like this:
![financialgraphs](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/financialgraphs.png) ![financialgraphs](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/financialgraphs.png)
By default, the length of the drawn vector is determined from the actual length in the data via an autoscaling algorithm that is supposed to prevent the vectors from overlapping.
But you can modify this behaviour by adding a line
```.cpp
graph1->setVectorLengthMode(JKQTPVectorFieldGraph::LengthFromData);
```
which will use the given lengths directly (only scaled by an optional factor defined by JKQTPVectorFieldGraph::setLengthScaleFactor() ). The result then looks like this:
![financialgraphs](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/doc/images/JKQTPVectorFieldGraphLengthFromData.png)

View File

@ -43,7 +43,7 @@
<gradientstop> -> <color> (<number><b>%</b>)? <gradientstop> -> <color> (<number><b>%</b>)?
<color> -> NAME <color> -> NAME
| <b>#</b><hexnumber> | <b>#</b><hexnumber>
| (<b>rgb</b> | <b>rgba</a> | <b>hsl</a> | <b>hsv</a> | <b>gray</a> | <b>grey</a> | <b>red</a> | <b>green</a> | <b>blue</a>) <b>(</b> (<numberwithunit> [<b>,/</b>]? ){1-4} <b>)</b> | (<b>rgb</b> | <b>rgba</b> | <b>hsl</b> | <b>hsv</b> | <b>gray</b> | <b>grey</b> | <b>red</b> | <b>green</b> | <b>blue</b>) <b>(</b> (<numberwithunit> [<b>,/</b>]? ){1-4} <b>)</b>
<number> -> floating-point-number, i.e. "[+-]?\d+\.?\d*" <number> -> floating-point-number, i.e. "[+-]?\d+\.?\d*"
<hexnumber> -> RGB | RRGGBB | RGBA | RRGGBBAA <hexnumber> -> RGB | RRGGBB | RGBA | RRGGBBAA

View File

@ -58,7 +58,6 @@ JKQTCOMMON_LIB_EXPORT Qt::BrushStyle jkqtp_String2QBrushStyle(const QString& sty
* \param style the string to be parsed * \param style the string to be parsed
* \param[out] gradient output parameter for a parsed gradient * \param[out] gradient output parameter for a parsed gradient
* \param[out] image output parameter for a parsed image * \param[out] image output parameter for a parsed image
* \param[out] rotationAngleDeg output parameter for a parsed rotation angle of the pattern in degrees, where the direction equals the direction of a clock hand, i.e. 0=12o'clock, 180=6o'clock, ...
* *
* \see jkqtp_String2QBrushStyle() * \see jkqtp_String2QBrushStyle()
*/ */
@ -234,7 +233,7 @@ JKQTCOMMON_LIB_EXPORT QString jkqtp_QColor2String(QColor color, bool useSpecialT
* *
* \param color the color name to convert * \param color the color name to convert
* \param namesOnly if \c true , the function only compares against the list of CSS colors; otherwise it passes the string also on to QColor()-constructor, which interprets e.g. \c #AABBCC * \param namesOnly if \c true , the function only compares against the list of CSS colors; otherwise it passes the string also on to QColor()-constructor, which interprets e.g. \c #AABBCC
* \param nameFound[out] optional return value that signifies whether a name was found * \param[out] nameFound optional return value that signifies whether a name was found
*/ */
JKQTCOMMON_LIB_EXPORT QColor jkqtp_lookupQColorName(const QString& color, bool namesOnly=false, bool* nameFound=nullptr); JKQTCOMMON_LIB_EXPORT QColor jkqtp_lookupQColorName(const QString& color, bool namesOnly=false, bool* nameFound=nullptr);

View File

@ -66,13 +66,13 @@
* \image html financialgraphs_width.png * \image html financialgraphs_width.png
* *
* *
* \section JKQTPFinancialGraphSideBySide Severyl Financial Graphs side-by-side * \section JKQTPFinancialGraphSideBySide Several Financial Graphs side-by-side
* In case you want to display several of these graphs in the same plot, you can make them appear side-by-side, even * In case you want to display several of these graphs in the same plot, you can make them appear side-by-side, even
* if they all cover the same x-values and would thus be draw atop each other. We apply the same principles that * if they all cover the same x-values and would thus be draw atop each other. We apply the same principles that
* were used for barcharts in JKQTPBarGraphBase and add a shift-parameter (setShift() ) that shifts each element * were used for barcharts in JKQTPBarGraphBase and add a shift-parameter (setShift() ) that shifts each element
* in the available space: * in the available space:
* *
* \image html financialgraphs_basics.png * \image html financialgraphs_shiftwidth.png
* *
* For example for two financial graph elements per x-value one would set: * For example for two financial graph elements per x-value one would set:
* \verbatim * \verbatim
@ -80,8 +80,6 @@
* shift=-0.5 / +0.5 * shift=-0.5 / +0.5
* \endverbatim * \endverbatim
* *
* \image html financialgraphs_shiftwidth.png
*
* Two functions are provided (JKQTPFinancialGraph::autoscaleBoxWidthAndShift(), JKQTPFinancialGraph::autoscaleBoxWidthAndShiftSeparatedGroups() ) * Two functions are provided (JKQTPFinancialGraph::autoscaleBoxWidthAndShift(), JKQTPFinancialGraph::autoscaleBoxWidthAndShiftSeparatedGroups() )
* that can be applied to any JKQTPFinancialGraph in the plot and will calculate all JKQTPFinancialGraphs' shift and width parameter * that can be applied to any JKQTPFinancialGraph in the plot and will calculate all JKQTPFinancialGraphs' shift and width parameter
* in such a way that the graphs appear tidied up into groups by x-value. With these functions you don't have to calculate * in such a way that the graphs appear tidied up into groups by x-value. With these functions you don't have to calculate

View File

@ -466,22 +466,22 @@ void JKQTPXYLabelsGeneratorMixin::setYMaxNoExponent(double v)
m_yMaxNoExponent=v; m_yMaxNoExponent=v;
} }
QString JKQTPXYLabelsGeneratorMixin::getXDateTimeFormmat() const QString JKQTPXYLabelsGeneratorMixin::getXDateTimeFormat() const
{ {
return m_xDateTimeFormat; return m_xDateTimeFormat;
} }
void JKQTPXYLabelsGeneratorMixin::setXDateTimeFormmat(const QString &v) void JKQTPXYLabelsGeneratorMixin::setXDateTimeFormat(const QString &v)
{ {
m_xDateTimeFormat=v; m_xDateTimeFormat=v;
} }
QString JKQTPXYLabelsGeneratorMixin::getYDateTimeFormmat() const QString JKQTPXYLabelsGeneratorMixin::getYDateTimeFormat() const
{ {
return m_yDateTimeFormat; return m_yDateTimeFormat;
} }
void JKQTPXYLabelsGeneratorMixin::setYDateTimeFormmat(const QString &v) void JKQTPXYLabelsGeneratorMixin::setYDateTimeFormat(const QString &v)
{ {
m_yDateTimeFormat=v; m_yDateTimeFormat=v;
} }

View File

@ -384,14 +384,14 @@ public:
/** \copydoc m_xDateTimeFormmat */ /** \copydoc m_xDateTimeFormat */
QString getXDateTimeFormmat() const; QString getXDateTimeFormat() const;
/** \copydoc m_xDateTimeFormmat */ /** \copydoc m_xDateTimeFormat */
void setXDateTimeFormmat(const QString& v); void setXDateTimeFormat(const QString& v);
/** \copydoc m_yDateTimeFormmat */ /** \copydoc m_yDateTimeFormat */
QString getYDateTimeFormmat() const; QString getYDateTimeFormat() const;
/** \copydoc m_yDateTimeFormmat */ /** \copydoc m_yDateTimeFormat */
void setYDateTimeFormmat(const QString& v); void setYDateTimeFormat(const QString& v);
protected: protected:
@ -405,7 +405,7 @@ protected:
QString xValToString(double x) const; QString xValToString(double x) const;
/** \brief converts \a y to a string, using several of the formatting properties set in this class for y-values */ /** \brief converts \a y to a string, using several of the formatting properties set in this class for y-values */
QString yValToString(double y) const; QString yValToString(double y) const;
/** \rief converts \a x to a QString, using the provided options */ /** \brief converts \a x to a QString, using the provided options */
static QString valToString(double x, JKQTPGraphLabelConverterType m_xDefaultConverter, int m_xDefaultPrecision, double m_xBelowIsZero, double m_xMinNoExponent, double m_xMaxNoExponent, const QString& m_xDateTimeFormat); static QString valToString(double x, JKQTPGraphLabelConverterType m_xDefaultConverter, int m_xDefaultPrecision, double m_xBelowIsZero, double m_xMinNoExponent, double m_xMaxNoExponent, const QString& m_xDateTimeFormat);
private: private:
/** \brief format string for the x-label, use \c %1 as placeholder for the numeric value */ /** \brief format string for the x-label, use \c %1 as placeholder for the numeric value */

View File

@ -1996,7 +1996,7 @@ JKQTPLOTTER_LIB_EXPORT JKQTPXFunctionLineGraph* jkqtpstatAddLinearWeightedRegres
jkqtpstatRegression(plot1->getPlotter(), JKQTPStatRegressionModelType::Exponential, datastore1->begin(colLinX), datastore1->end(colLinX), datastore1->begin(colLinY), datastore1->end(colLinY)); jkqtpstatRegression(plot1->getPlotter(), JKQTPStatRegressionModelType::Exponential, datastore1->begin(colLinX), datastore1->end(colLinX), datastore1->begin(colLinY), datastore1->end(colLinY));
\endcode \endcode
\image html datastore_regression_nonlinreg.png \image html datastore_regression_nonlinreg_exp.png
\see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatRegression() \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatRegression()
*/ */
@ -2038,7 +2038,7 @@ inline JKQTPXFunctionLineGraph* jkqtpstatAddRegression(JKQTBasePlotter* plotter,
jkqtpstatRegression(graphD, JKQTPStatRegressionModelType::Exponential); jkqtpstatRegression(graphD, JKQTPStatRegressionModelType::Exponential);
\endcode \endcode
\image html datastore_regression_nonlinreg.png \image html datastore_regression_nonlinreg_exp.png
\note The line graph is added to the same plotter that is the parent of \a datagraph ! \note The line graph is added to the same plotter that is the parent of \a datagraph !

View File

@ -317,15 +317,15 @@ public:
virtual bool usesColumn(int c) const override; virtual bool usesColumn(int c) const override;
/** \copydoc colorColumn */ /** \copydoc m_colorColumn */
void setColorColumn(int __value); void setColorColumn(int __value);
/** \copydoc colorColumn */ /** \copydoc m_colorColumn */
int getColorColumn() const; int getColorColumn() const;
/** \copydoc colorColumn */ /** \copydoc m_colorColumn */
void setColorColumn (size_t __value); void setColorColumn (size_t __value);
/** \copydoc colorColumnContainsRGB */ /** \copydoc m_colorColumnContainsRGB */
void setColorColumnContainsRGB(bool __value); void setColorColumnContainsRGB(bool __value);
/** \copydoc colorColumnContainsRGB */ /** \copydoc m_colorColumnContainsRGB */
bool getColorColumnContainsRGB() const; bool getColorColumnContainsRGB() const;
/** \copydoc m_vectorColorMode */ /** \copydoc m_vectorColorMode */
void setVectorColorMode(VectorColorMode __value); void setVectorColorMode(VectorColorMode __value);

View File

@ -1206,7 +1206,7 @@ class JKQTPLOTTER_LIB_EXPORT JKQTBasePlotter: public QObject {
/** \brief adds a secondary x-axis /** \brief adds a secondary x-axis
* *
* \params axis the JKQTPHorizontalAxisBase object to add * \param axis the JKQTPHorizontalAxisBase object to add
* \returns a reference to this axis * \returns a reference to this axis
* *
* Usage is simple: * Usage is simple:
@ -1231,7 +1231,7 @@ class JKQTPLOTTER_LIB_EXPORT JKQTBasePlotter: public QObject {
JKQTPCoordinateAxisRef addSecondaryXAxis(JKQTPHorizontalAxisBase* axis); JKQTPCoordinateAxisRef addSecondaryXAxis(JKQTPHorizontalAxisBase* axis);
/** \brief adds a secondary y-axis /** \brief adds a secondary y-axis
* *
* \params axis the JKQTPVerticalAxisBase object to add * \param axis the JKQTPVerticalAxisBase object to add
* \returns a reference to this axis * \returns a reference to this axis
* *
* Usage is simple: * Usage is simple:
@ -1663,7 +1663,7 @@ public Q_SLOTS:
* *
* \param filename name of the stored file, if no \a outputFormat is given, the file format is deduced by the file extension in \a filename * \param filename name of the stored file, if no \a outputFormat is given, the file format is deduced by the file extension in \a filename
* \param displayPreview if \c true a dialog is shown that allows to modify the generated output (zoo, scaling, ...) * \param displayPreview if \c true a dialog is shown that allows to modify the generated output (zoo, scaling, ...)
* \param outputFormmat specify the file format for the generated file * \param outputFormat specify the file format for the generated file
* \param outputSizeIncrease if given, the size of the generated pixel image is increased by this number of pixels in addition to the required space * \param outputSizeIncrease if given, the size of the generated pixel image is increased by this number of pixels in addition to the required space
* \return returns \c true on success * \return returns \c true on success
* *
@ -1686,7 +1686,7 @@ public Q_SLOTS:
/** \brief save the current plot as a SVG file, with the current widget aspect ratio, if filename is empty a file selection dialog is displayed /** \brief save the current plot as a SVG file, with the current widget aspect ratio, if filename is empty a file selection dialog is displayed
* *
* \param filename the filename to save to, if empty a file save dialog is displayed * \param filename the filename to save to, if empty a file save dialog is displayed
* \param displayPreview if \C true, a save/print-preview dialog is displayed that allows to make some modifications to the generated image, otherwise the image is saved with default settings. * \param displayPreview if \c true, a save/print-preview dialog is displayed that allows to make some modifications to the generated image, otherwise the image is saved with default settings.
* \return Returns \c true if the file was save successfully * \return Returns \c true if the file was save successfully
* *
* \note Exporting to SVG requires QPrinter-support, if it is not available on your platform, this function will not be available either! * \note Exporting to SVG requires QPrinter-support, if it is not available on your platform, this function will not be available either!
@ -1696,7 +1696,7 @@ public Q_SLOTS:
/** \brief save the current plot as a PDF file, with the current widget aspect ratio, if filename is empty a file selection dialog is displayed /** \brief save the current plot as a PDF file, with the current widget aspect ratio, if filename is empty a file selection dialog is displayed
* *
* \param filename the filename to save to, if empty a file save dialog is displayed * \param filename the filename to save to, if empty a file save dialog is displayed
* \param displayPreview if \C true, a save/print-preview dialog is displayed that allows to make some modifications to the generated image, otherwise the image is saved with default settings. * \param displayPreview if \c true, a save/print-preview dialog is displayed that allows to make some modifications to the generated image, otherwise the image is saved with default settings.
* \return Returns \c true if the file was save successfully * \return Returns \c true if the file was save successfully
* *
* \note Exporting to PDF requires QPrinter-support, if it is not available on your platform, this function will not be available either! * \note Exporting to PDF requires QPrinter-support, if it is not available on your platform, this function will not be available either!
@ -1708,7 +1708,7 @@ public Q_SLOTS:
* The image format is extracted from the file extension (jpeg, tiff, png, pdf, ...) * The image format is extracted from the file extension (jpeg, tiff, png, pdf, ...)
* *
* \param filename the filename to save to, if empty a file save dialog is displayed * \param filename the filename to save to, if empty a file save dialog is displayed
* \param displayPreview if \C true, a save/print-preview dialog is displayed that allows to make some modifications to the generated image, otherwise the image is saved with default settings. * \param displayPreview if \c true, a save/print-preview dialog is displayed that allows to make some modifications to the generated image, otherwise the image is saved with default settings.
* \return Returns \c true if the file was save successfully * \return Returns \c true if the file was save successfully
* *
* This function is comparable to saveAsPixelImage(), but it allows to save into any graphics format, including SVG and PF (if printer-support is compiled into the library). * This function is comparable to saveAsPixelImage(), but it allows to save into any graphics format, including SVG and PF (if printer-support is compiled into the library).

View File

@ -217,7 +217,7 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPBaseKey: public QObject {
inline Qt::PenStyle getFrameLineStyle() const { return keyStyle().frameLineStyle; } inline Qt::PenStyle getFrameLineStyle() const { return keyStyle().frameLineStyle; }
/** \copydoc JKQTPKeyStyle::textColor */ /** \copydoc JKQTPKeyStyle::textColor */
inline QColor getTextColor() const { return keyStyle().textColor; } inline QColor getTextColor() const { return keyStyle().textColor; }
/** \copydoc JKQTPKeyStyle::backgroundColor */ /** \copydoc JKQTPKeyStyle::backgroundBrush */
inline QColor getBackgroundColor() const { return keyStyle().backgroundBrush.color(); } inline QColor getBackgroundColor() const { return keyStyle().backgroundBrush.color(); }
/** \copydoc JKQTPKeyStyle::backgroundBrush */ /** \copydoc JKQTPKeyStyle::backgroundBrush */
inline const QBrush& getBackgroundBrush() const { return keyStyle().backgroundBrush; } inline const QBrush& getBackgroundBrush() const { return keyStyle().backgroundBrush; }
@ -266,9 +266,9 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPBaseKey: public QObject {
inline void setFrameLineStyle(Qt::PenStyle __value) { keyStyle().frameLineStyle = __value; redrawPlot(); } inline void setFrameLineStyle(Qt::PenStyle __value) { keyStyle().frameLineStyle = __value; redrawPlot(); }
/** \copydoc JKQTPKeyStyle::textColor */ /** \copydoc JKQTPKeyStyle::textColor */
inline void setTextColor(QColor __value) { keyStyle().textColor = __value; redrawPlot(); } inline void setTextColor(QColor __value) { keyStyle().textColor = __value; redrawPlot(); }
/** \copydoc JKQTPKeyStyle::backgroundColor */ /** \copydoc JKQTPKeyStyle::backgroundBrush */
inline void setBackgroundColor(QColor __value) { keyStyle().backgroundBrush = __value; redrawPlot(); } inline void setBackgroundColor(QColor __value) { keyStyle().backgroundBrush = __value; redrawPlot(); }
/** \copydoc JKQTPKeyStyle::backgroundColor */ /** \copydoc JKQTPKeyStyle::backgroundBrush */
inline void setBackgroundColor(QColor __value, Qt::BrushStyle __style) { keyStyle().backgroundBrush = QBrush(__value, __style); redrawPlot(); } inline void setBackgroundColor(QColor __value, Qt::BrushStyle __style) { keyStyle().backgroundBrush = QBrush(__value, __style); redrawPlot(); }
/** \copydoc JKQTPKeyStyle::backgroundBrush */ /** \copydoc JKQTPKeyStyle::backgroundBrush */
inline void setBackgroundBrush(const QBrush& __value) { keyStyle().backgroundBrush = __value; redrawPlot(); } inline void setBackgroundBrush(const QBrush& __value) { keyStyle().backgroundBrush = __value; redrawPlot(); }

View File

@ -922,8 +922,8 @@ class JKQTPLOTTER_LIB_EXPORT JKQTPlotter: public QWidget {
/** \copydoc JKQTBasePlotter::zoom() /** \copydoc JKQTBasePlotter::zoom()
* \deprecated The function JKQTPlotter::zoom() is deprecated and will be removed in future version, use JKQTPlotter::setXY() instead! * \deprecated The function JKQTPlotter::zoom() is deprecated and will be removed in future version, use JKQTPlotter::setXY() instead!
*/ */
inline void zoom(double nxmin, double nxmax, double nymin, double nymax, bool affectsSecondaryAxes=false) { inline void zoom(double xminn, double xmaxn, double yminn, double ymaxn, bool affectsSecondaryAxes=false) {
plotter->zoom(nxmin, nxmax, nymin, nymax, affectsSecondaryAxes); plotter->zoom(xminn, xmaxn, yminn, ymaxn, affectsSecondaryAxes);
} }
/** \copydoc JKQTBasePlotter::setGrid() */ /** \copydoc JKQTBasePlotter::setGrid() */

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB