Skip to content

Commit 8cea8e7

Browse files
committed
animation: do not display SI prefix if not present in start and end
1 parent 68c2aef commit 8cea8e7

File tree

1 file changed

+43
-14
lines changed

1 file changed

+43
-14
lines changed

src/traces/indicator/plot.js

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ var position = {
3434
'right': 1
3535
};
3636

37+
var SI_PREFIX = /[yzafpnµmkMGTPEZY]/;
38+
3739
module.exports = function plot(gd, cdModule, transitionOpts, makeOnCompleteCallback) {
3840
var fullLayout = gd._fullLayout;
3941
var onComplete;
@@ -547,6 +549,25 @@ function drawNumbers(gd, plotGroup, cd, opts) {
547549
.attr('dy', null);
548550
sel.exit().remove();
549551

552+
// Function to override the number formatting used during transitions
553+
function transitionFormat(valueformat, fmt, from, to) {
554+
// For now, do not display SI prefix if start and end value do not have any
555+
if(valueformat.match('s') && // If using SI prefix
556+
(from >= 0 !== to >= 0) && // If sign change
557+
(!fmt(from).slice(-1).match(SI_PREFIX) && !fmt(to).slice(-1).match(SI_PREFIX)) // Has no SI prefix
558+
) {
559+
var transitionValueFormat = valueformat.slice().replace('s', 'f').replace(/\d+/, function(m) { return parseInt(m) - 1;});
560+
var transitionAx = mockAxis(gd, {tickformat: transitionValueFormat});
561+
return function(v) {
562+
// Switch to fixed precision if number is smaller than one
563+
if(Math.abs(v) < 1) return Axes.tickText(transitionAx, v).text;
564+
return fmt(v);
565+
};
566+
} else {
567+
return fmt;
568+
}
569+
}
570+
550571
function drawBignumber() {
551572
// bignumber
552573
var bignumberAx = mockAxis(gd, {tickformat: trace.number.valueformat});
@@ -558,23 +579,28 @@ function drawNumbers(gd, plotGroup, cd, opts) {
558579
number
559580
.call(Drawing.font, trace.number.font);
560581

582+
function writeNumber() {
583+
number.text(bignumberPrefix + fmt(cd[0].y) + bignumberSuffix);
584+
}
561585
if(hasTransition) {
562586
number
563587
.transition()
564588
.duration(transitionOpts.duration)
565589
.ease(transitionOpts.easing)
566-
.each('end', function() { onComplete && onComplete(); })
567-
.each('interrupt', function() { onComplete && onComplete(); })
590+
.each('end', function() { writeNumber(); onComplete && onComplete(); })
591+
.each('interrupt', function() { writeNumber(); onComplete && onComplete(); })
568592
.attrTween('text', function() {
569593
var that = d3.select(this);
570594
var interpolator = d3.interpolateNumber(cd[0].lastY, cd[0].y);
571595
trace._lastValue = cd[0].y;
596+
597+
var transitionFmt = transitionFormat(trace.number.valueformat, fmt, cd[0].lastY, cd[0].y);
572598
return function(t) {
573-
that.text(bignumberPrefix + fmt(interpolator(t)) + bignumberSuffix);
599+
that.text(bignumberPrefix + transitionFmt(interpolator(t)) + bignumberSuffix);
574600
};
575601
});
576602
} else {
577-
number.text(bignumberPrefix + fmt(cd[0].y) + bignumberSuffix);
603+
writeNumber();
578604
}
579605

580606
bignumberbBox = measureText(bignumberPrefix + fmt(cd[0].y) + bignumberSuffix, trace.number.font, numbersAnchor);
@@ -589,9 +615,9 @@ function drawNumbers(gd, plotGroup, cd, opts) {
589615
var value = trace.delta.relative ? d.relativeDelta : d.delta;
590616
return value;
591617
};
592-
var deltaFormatText = function(value) {
618+
var deltaFormatText = function(value, numberFmt) {
593619
if(value === 0) return '-';
594-
return (value > 0 ? trace.delta.increasing.symbol : trace.delta.decreasing.symbol) + deltaFmt(value);
620+
return (value > 0 ? trace.delta.increasing.symbol : trace.delta.decreasing.symbol) + numberFmt(value);
595621
};
596622
var deltaFill = function(d) {
597623
return d.delta >= 0 ? trace.delta.increasing.color : trace.delta.decreasing.color;
@@ -604,6 +630,11 @@ function drawNumbers(gd, plotGroup, cd, opts) {
604630
.call(Drawing.font, trace.delta.font)
605631
.call(Color.fill, deltaFill({delta: trace._deltaLastValue}));
606632

633+
function writeDelta() {
634+
delta.text(function() { return deltaFormatText(deltaValue(cd[0]), deltaFmt);})
635+
.call(Color.fill, deltaFill(cd[0]));
636+
}
637+
607638
if(hasTransition) {
608639
delta
609640
.transition()
@@ -613,23 +644,21 @@ function drawNumbers(gd, plotGroup, cd, opts) {
613644
var that = d3.select(this);
614645
var to = deltaValue(cd[0]);
615646
var from = trace._deltaLastValue;
647+
var transitionFmt = transitionFormat(trace.delta.valueformat, deltaFmt, from, to);
616648
var interpolator = d3.interpolateNumber(from, to);
617649
trace._deltaLastValue = to;
618650
return function(t) {
619-
that.text(deltaFormatText(interpolator(t)));
651+
that.text(deltaFormatText(interpolator(t), transitionFmt));
620652
that.call(Color.fill, deltaFill({delta: interpolator(t)}));
621653
};
622654
})
623-
.each('end', function() { onComplete && onComplete(); })
624-
.each('interrupt', function() { onComplete && onComplete(); });
655+
.each('end', function() { writeDelta(); onComplete && onComplete(); })
656+
.each('interrupt', function() { writeDelta(); onComplete && onComplete(); });
625657
} else {
626-
delta.text(function() {
627-
return deltaFormatText(deltaValue(cd[0]));
628-
})
629-
.call(Color.fill, deltaFill(cd[0]));
658+
writeDelta();
630659
}
631660

632-
deltabBox = measureText(deltaFormatText(deltaValue(cd[0])), trace.delta.font, numbersAnchor);
661+
deltabBox = measureText(deltaFormatText(deltaValue(cd[0]), deltaFmt), trace.delta.font, numbersAnchor);
633662
return delta;
634663
}
635664

0 commit comments

Comments
 (0)