Skip to content

Commit

Permalink
NEW: proper data-tooltips for financial graphs
Browse files Browse the repository at this point in the history
  • Loading branch information
jkriege2 committed Feb 14, 2024
1 parent bcc6261 commit 56f930d
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 32 deletions.
64 changes: 32 additions & 32 deletions lib/jkqtplotter/graphs/jkqtpboxplot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,19 +124,19 @@ void JKQTPBoxplotVerticalGraph::draw(JKQTPEnhancedPainter& painter) {
QStringList labelValues, labelNames;
int labMedian=-1, labMean=-1, labMin=-1, labMax=-1, labQ25=-1, labQ75=-1;
labelNames<<"pos";
labelValues<<jkqtp_floattolatexqstr(xv, 3);
if (minColumn>=0 && JKQTPIsOKFloat(minv)) { labelNames<<"\\min"; labelValues<<jkqtp_floattolatexqstr(minv, 3); labMin=labelValues.size()-1; }
if (percentile25Column>=0 && JKQTPIsOKFloat(p25v)) { labelNames<<"q_{25}"; labelValues<<jkqtp_floattolatexqstr(p25v, 3); labQ25=labelValues.size()-1; }
labelValues<<xFloatToString(xv);
if (minColumn>=0 && JKQTPIsOKFloat(minv)) { labelNames<<"\\min"; labelValues<<yFloatToString(minv); labMin=labelValues.size()-1; }
if (percentile25Column>=0 && JKQTPIsOKFloat(p25v)) { labelNames<<"q_{25}"; labelValues<<yFloatToString(p25v); labQ25=labelValues.size()-1; }
if (medianColumn>=0 && JKQTPIsOKFloat(medianv)) {
if (medianConfidenceColumn>=0 && JKQTPIsOKFloat(medConf)) {
labelNames<<"\\median"; labelValues<<(jkqtp_floattolatexqstr(medianv, 3)+"\\:{\\pm}\\:"+jkqtp_floattolatexqstr(medConf, 3)); labMedian=labelValues.size()-1;
labelNames<<"\\median"; labelValues<<(yFloatToString(medianv)+"\\:{\\pm}\\:"+yFloatToString(medConf)); labMedian=labelValues.size()-1;
} else {
labelNames<<"\\median"; labelValues<<jkqtp_floattolatexqstr(medianv, 3); labMedian=labelValues.size()-1;
labelNames<<"\\median"; labelValues<<yFloatToString(medianv); labMedian=labelValues.size()-1;
}
}
if (meanColumn>=0 && JKQTPIsOKFloat(meanv)) { labelNames<<"\\mu"; labelValues<<jkqtp_floattolatexqstr(meanv, 3); labMean=labelValues.size()-1; }
if (percentile75Column>=0 && JKQTPIsOKFloat(p75v)) { labelNames<<"q_{75}"; labelValues<<jkqtp_floattolatexqstr(p75v, 3); labQ75=labelValues.size()-1; }
if (maxColumn>=0 && JKQTPIsOKFloat(maxv)) { labelNames<<"\\max"; labelValues<<jkqtp_floattolatexqstr(maxv, 3); labMax=labelValues.size()-1; }
if (meanColumn>=0 && JKQTPIsOKFloat(meanv)) { labelNames<<"\\mu"; labelValues<<yFloatToString(meanv); labMean=labelValues.size()-1; }
if (percentile75Column>=0 && JKQTPIsOKFloat(p75v)) { labelNames<<"q_{75}"; labelValues<<yFloatToString(p75v); labQ75=labelValues.size()-1; }
if (maxColumn>=0 && JKQTPIsOKFloat(maxv)) { labelNames<<"\\max"; labelValues<<yFloatToString(maxv); labMax=labelValues.size()-1; }

const double x=transformX(xv);
const double p25=transformY(p25v);
Expand Down Expand Up @@ -470,19 +470,19 @@ void JKQTPBoxplotHorizontalGraph::draw(JKQTPEnhancedPainter& painter) {
QStringList labelValues, labelNames;
int labMedian=-1, labMean=-1, labMin=-1, labMax=-1, labQ25=-1, labQ75=-1;
labelNames<<"pos";
labelValues<<jkqtp_floattolatexqstr(yv, 3);
if (minColumn>=0 && JKQTPIsOKFloat(minv)) { labelNames<<"\\min"; labelValues<<jkqtp_floattolatexqstr(minv, 3); labMin=labelValues.size()-1; }
if (percentile25Column>=0 && JKQTPIsOKFloat(p25v)) { labelNames<<"q_{25}"; labelValues<<jkqtp_floattolatexqstr(p25v, 3); labQ25=labelValues.size()-1; }
labelValues<<yFloatToString(yv);
if (minColumn>=0 && JKQTPIsOKFloat(minv)) { labelNames<<"\\min"; labelValues<<xFloatToString(minv); labMin=labelValues.size()-1; }
if (percentile25Column>=0 && JKQTPIsOKFloat(p25v)) { labelNames<<"q_{25}"; labelValues<<xFloatToString(p25v); labQ25=labelValues.size()-1; }
if (medianColumn>=0 && JKQTPIsOKFloat(medianv)) {
if (medianConfidenceColumn>=0 && JKQTPIsOKFloat(medConf)) {
labelNames<<"\\median"; labelValues<<(jkqtp_floattolatexqstr(medianv, 3)+"\\:{\\pm}\\:"+jkqtp_floattolatexqstr(medConf, 3)); labMedian=labelValues.size()-1;
labelNames<<"\\median"; labelValues<<(xFloatToString(medianv)+"\\:{\\pm}\\:"+xFloatToString(medConf)); labMedian=labelValues.size()-1;
} else {
labelNames<<"\\median"; labelValues<<jkqtp_floattolatexqstr(medianv, 3); labMedian=labelValues.size()-1;
labelNames<<"\\median"; labelValues<<xFloatToString(medianv); labMedian=labelValues.size()-1;
}
}
if (meanColumn>=0 && JKQTPIsOKFloat(meanv)) { labelNames<<"\\mu"; labelValues<<jkqtp_floattolatexqstr(meanv, 3); labMean=labelValues.size()-1; }
if (percentile75Column>=0 && JKQTPIsOKFloat(p75v)) { labelNames<<"q_{75}"; labelValues<<jkqtp_floattolatexqstr(p75v, 3); labQ75=labelValues.size()-1; }
if (maxColumn>=0 && JKQTPIsOKFloat(maxv)) { labelNames<<"\\max"; labelValues<<jkqtp_floattolatexqstr(maxv, 3); labMax=labelValues.size()-1; }
if (meanColumn>=0 && JKQTPIsOKFloat(meanv)) { labelNames<<"\\mu"; labelValues<<xFloatToString(meanv); labMean=labelValues.size()-1; }
if (percentile75Column>=0 && JKQTPIsOKFloat(p75v)) { labelNames<<"q_{75}"; labelValues<<xFloatToString(p75v); labQ75=labelValues.size()-1; }
if (maxColumn>=0 && JKQTPIsOKFloat(maxv)) { labelNames<<"\\max"; labelValues<<xFloatToString(maxv); labMax=labelValues.size()-1; }



Expand Down Expand Up @@ -633,19 +633,19 @@ void JKQTPBoxplotVerticalElement::draw(JKQTPEnhancedPainter& painter) {
QStringList labelValues, labelNames;
int labMedian=-1, labMean=-1, labMin=-1, labMax=-1, labQ25=-1, labQ75=-1;
labelNames<<"pos";
labelValues<<jkqtp_floattolatexqstr(xv, 3);
if (JKQTPIsOKFloat(minv)) { labelNames<<"\\min"; labelValues<<jkqtp_floattolatexqstr(minv, 3); labMin=labelValues.size()-1; }
if (JKQTPIsOKFloat(p25v)) { labelNames<<"q_{25}"; labelValues<<jkqtp_floattolatexqstr(p25v, 3); labQ25=labelValues.size()-1; }
labelValues<<xFloatToString(xv);
if (JKQTPIsOKFloat(minv)) { labelNames<<"\\min"; labelValues<<yFloatToString(minv); labMin=labelValues.size()-1; }
if (JKQTPIsOKFloat(p25v)) { labelNames<<"q_{25}"; labelValues<<yFloatToString(p25v); labQ25=labelValues.size()-1; }
if (JKQTPIsOKFloat(medianv)) {
if (JKQTPIsOKFloat(medConf)) {
labelNames<<"\\median"; labelValues<<(jkqtp_floattolatexqstr(medianv, 3)+"\\:{\\pm}\\:"+jkqtp_floattolatexqstr(medConf, 3)); labMedian=labelValues.size()-1;
labelNames<<"\\median"; labelValues<<(yFloatToString(medianv)+"\\:{\\pm}\\:"+yFloatToString(medConf)); labMedian=labelValues.size()-1;
} else {
labelNames<<"\\median"; labelValues<<jkqtp_floattolatexqstr(medianv, 3); labMedian=labelValues.size()-1;
labelNames<<"\\median"; labelValues<<yFloatToString(medianv); labMedian=labelValues.size()-1;
}
}
if (JKQTPIsOKFloat(meanv)) { labelNames<<"\\mu"; labelValues<<jkqtp_floattolatexqstr(meanv, 3); labMean=labelValues.size()-1; }
if (JKQTPIsOKFloat(p75v)) { labelNames<<"q_{75}"; labelValues<<jkqtp_floattolatexqstr(p75v, 3); labQ75=labelValues.size()-1; }
if (JKQTPIsOKFloat(maxv)) { labelNames<<"\\max"; labelValues<<jkqtp_floattolatexqstr(maxv, 3); labMax=labelValues.size()-1; }
if (JKQTPIsOKFloat(meanv)) { labelNames<<"\\mu"; labelValues<<yFloatToString(meanv); labMean=labelValues.size()-1; }
if (JKQTPIsOKFloat(p75v)) { labelNames<<"q_{75}"; labelValues<<yFloatToString(p75v); labQ75=labelValues.size()-1; }
if (JKQTPIsOKFloat(maxv)) { labelNames<<"\\max"; labelValues<<yFloatToString(maxv); labMax=labelValues.size()-1; }

double w=parent->pt2px(painter,getBoxWidthAbsolute());
double xma=x+w/2.0;
Expand Down Expand Up @@ -877,19 +877,19 @@ void JKQTPBoxplotHorizontalElement::draw(JKQTPEnhancedPainter& painter) {
QStringList labelValues, labelNames;
int labMedian=-1, labMean=-1, labMin=-1, labMax=-1, labQ25=-1, labQ75=-1;
labelNames<<"pos";
labelValues<<jkqtp_floattolatexqstr(yv, 3);
if (JKQTPIsOKFloat(minv)) { labelNames<<"\\min"; labelValues<<jkqtp_floattolatexqstr(minv, 3); labMin=labelValues.size()-1; }
if (JKQTPIsOKFloat(p25v)) { labelNames<<"q_{25}"; labelValues<<jkqtp_floattolatexqstr(p25v, 3); labQ25=labelValues.size()-1; }
labelValues<<yFloatToString(yv);
if (JKQTPIsOKFloat(minv)) { labelNames<<"\\min"; labelValues<<xFloatToString(minv); labMin=labelValues.size()-1; }
if (JKQTPIsOKFloat(p25v)) { labelNames<<"q_{25}"; labelValues<<xFloatToString(p25v); labQ25=labelValues.size()-1; }
if (JKQTPIsOKFloat(medianv)) {
if (JKQTPIsOKFloat(medConf)) {
labelNames<<"\\median"; labelValues<<(jkqtp_floattolatexqstr(medianv, 3)+"\\:{\\pm}\\:"+jkqtp_floattolatexqstr(medConf, 3)); labMedian=labelValues.size()-1;
labelNames<<"\\median"; labelValues<<(xFloatToString(medianv)+"\\:{\\pm}\\:"+xFloatToString(medConf)); labMedian=labelValues.size()-1;
} else {
labelNames<<"\\median"; labelValues<<jkqtp_floattolatexqstr(medianv, 3); labMedian=labelValues.size()-1;
labelNames<<"\\median"; labelValues<<xFloatToString(medianv); labMedian=labelValues.size()-1;
}
}
if (JKQTPIsOKFloat(meanv)) { labelNames<<"\\mu"; labelValues<<jkqtp_floattolatexqstr(meanv, 3); labMean=labelValues.size()-1; }
if (JKQTPIsOKFloat(p75v)) { labelNames<<"q_{75}"; labelValues<<jkqtp_floattolatexqstr(p75v, 3); labQ75=labelValues.size()-1; }
if (JKQTPIsOKFloat(maxv)) { labelNames<<"\\max"; labelValues<<jkqtp_floattolatexqstr(maxv, 3); labMax=labelValues.size()-1; }
if (JKQTPIsOKFloat(meanv)) { labelNames<<"\\mu"; labelValues<<xFloatToString(meanv); labMean=labelValues.size()-1; }
if (JKQTPIsOKFloat(p75v)) { labelNames<<"q_{75}"; labelValues<<xFloatToString(p75v); labQ75=labelValues.size()-1; }
if (JKQTPIsOKFloat(maxv)) { labelNames<<"\\max"; labelValues<<xFloatToString(maxv); labMax=labelValues.size()-1; }

double w=parent->pt2px(painter,getBoxWidthAbsolute());
double yma=y+w/2.0;
Expand Down
21 changes: 21 additions & 0 deletions lib/jkqtplotter/graphs/jkqtpfinancial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ void JKQTPFinancialGraph::draw(JKQTPEnhancedPainter &painter)
#ifdef JKQTBP_AUTOTIMER
JKQTPAutoOutputTimer jkaaot("JKQTPFinancialGraph::draw");
#endif
clearHitTestData();
if (parent==nullptr) return;
const JKQTPDatastore* datastore=parent->getDatastore();
if (datastore==nullptr) return;
Expand All @@ -144,6 +145,7 @@ void JKQTPFinancialGraph::draw(JKQTPEnhancedPainter &painter)
double right=1e6;
bool firstXY=true;
if (getIndexRange(imin, imax)) {
reserveHitTestData(imax-imin);
painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();});

double delta=1;
Expand Down Expand Up @@ -212,6 +214,25 @@ void JKQTPFinancialGraph::draw(JKQTPEnhancedPainter &painter)
}
break;
}

auto addUlAt=[](QStringList sl, int i) { sl[i]="\\ul{"+sl[i]+"}"; return sl; };
auto addVerbAll=[](QStringList sl) { for (int i=0; i<sl.size();i++) { sl[i]="\\mbox{"+sl[i]+"}"; }; return sl; };
QStringList labelValues, labelNames;
labelNames<<"pos";
labelValues<<xFloatToString(xv);
labelNames<<"open";
labelValues<<yFloatToString(vO);
labelNames<<"high";
labelValues<<yFloatToString(vH);
labelNames<<"low";
labelValues<<yFloatToString(vL);
labelNames<<"close";
labelValues<<yFloatToString(vC);
labelNames=addVerbAll(labelNames);
addHitTestData(xv, vO, i, "\\ensuremath{\\begin{bmatrix}"+addUlAt(labelNames,1).join(" \\\\ ")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+addUlAt(labelValues,1).join("\\\\")+"\\end{bmatrix}}");
addHitTestData(xv, vH, i, "\\ensuremath{\\begin{bmatrix}"+addUlAt(labelNames,2).join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+addUlAt(labelValues,2).join("\\\\")+"\\end{bmatrix}}");
addHitTestData(xv, vL, i, "\\ensuremath{\\begin{bmatrix}"+addUlAt(labelNames,3).join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+addUlAt(labelValues,3).join("\\\\")+"\\end{bmatrix}}");
addHitTestData(xv, vC, i, "\\ensuremath{\\begin{bmatrix}"+addUlAt(labelNames,4).join("\\\\")+"\\end{bmatrix}\\;=\\;\\begin{bmatrix}"+addUlAt(labelValues,4).join("\\\\")+"\\end{bmatrix}}");
}
}
}
Expand Down

0 comments on commit 56f930d

Please sign in to comment.