Skip to content

Commit 4a6c7c9

Browse files
committed
waterfall text info
1 parent 4f7592e commit 4a6c7c9

File tree

5 files changed

+196
-4
lines changed

5 files changed

+196
-4
lines changed

src/traces/bar/plot.js

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ var Registry = require('../../registry');
2222
var attributes = require('./attributes');
2323
var attributeText = attributes.text;
2424
var attributeTextPosition = attributes.textposition;
25-
var helpers = require('./helpers');
2625
var style = require('./style');
26+
var helpers = require('./helpers');
27+
var pieHelpers = require('../pie/helpers');
2728

2829
// padding in pixels around text
2930
var TEXTPAD = 3;
@@ -204,7 +205,7 @@ function appendBarText(gd, plotinfo, bar, calcTrace, i, x0, x1, y0, y1) {
204205
var trace = calcTrace[0].trace;
205206
var orientation = trace.orientation;
206207

207-
var text = getText(trace, i);
208+
var text = getText(calcTrace, i, fullLayout);
208209
textPosition = getTextPosition(trace, i);
209210

210211
// compute text position
@@ -475,12 +476,51 @@ function getTransform(textX, textY, targetX, targetY, scale, rotate) {
475476
return transformTranslate + transformScale + transformRotate;
476477
}
477478

478-
function getText(trace, index) {
479-
var value = helpers.getValue(trace.text, index);
479+
function getText(calcTrace, index, fullLayout) {
480+
var trace = calcTrace[0].trace;
481+
482+
var value;
483+
if(!trace.textinfo || trace.textinfo === 'none') {
484+
value = helpers.getValue(trace.text, index);
485+
} else {
486+
value = calcTextinfo(calcTrace, index, fullLayout);
487+
}
488+
480489
return helpers.coerceString(attributeText, value);
481490
}
482491

483492
function getTextPosition(trace, index) {
484493
var value = helpers.getValue(trace.textposition, index);
485494
return helpers.coerceEnumerated(attributeTextPosition, value);
486495
}
496+
497+
function calcTextinfo(calcTrace, index, fullLayout) {
498+
var trace = calcTrace[0].trace;
499+
var textinfo = trace.textinfo;
500+
var cdi = calcTrace[index];
501+
502+
var separators = fullLayout.separators;
503+
var parts = textinfo.split('+');
504+
var hasFlag = function(flag) { return parts.indexOf(flag) !== -1; };
505+
var thisText = [];
506+
507+
var delta = +cdi.rawS || cdi.s;
508+
var final = cdi.v;
509+
var initial = final - delta;
510+
511+
if(hasFlag('delta')) {
512+
thisText.push(pieHelpers.formatPieValue(delta, separators));
513+
}
514+
if(hasFlag('final')) {
515+
thisText.push(pieHelpers.formatPieValue(final, separators));
516+
}
517+
if(hasFlag('initial')) {
518+
thisText.push(pieHelpers.formatPieValue(initial, separators));
519+
}
520+
if(hasFlag('text')) {
521+
var tx = Lib.castOption(trace, cdi.i, 'text');
522+
if(tx) thisText.push(tx);
523+
}
524+
525+
return thisText.join('<br>'); // TODO: ' | ' may be a better dividor for bar
526+
}

src/traces/waterfall/attributes.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
'use strict';
1010

11+
var pieAtts = require('../pie/attributes');
1112
var barAttrs = require('../bar/attributes');
1213
var lineAttrs = require('../scatter/attributes').line;
1314
var extendFlat = require('../../lib/extend').extendFlat;
@@ -76,6 +77,15 @@ module.exports = {
7677
hovertext: barAttrs.hovertext,
7778
hovertemplate: barAttrs.hovertemplate,
7879

80+
// labels (legend is handled by plots.attributes.showlegend and layout.hiddenlabels)
81+
textinfo: extendFlat({}, pieAtts.textinfo, {
82+
editType: 'plot',
83+
flags: ['text', 'delta', 'initial', 'final'],
84+
description: [
85+
'Determines which trace information appear on the graph.'
86+
].join(' ')
87+
}),
88+
7989
text: barAttrs.text,
8090
textposition: barAttrs.textposition,
8191
textfont: barAttrs.textfont,

src/traces/waterfall/defaults.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
4545
coerce('width');
4646

4747
coerce('text');
48+
coerce('textinfo');
49+
4850
coerce('hovertext');
4951
coerce('hovertemplate');
5052

Loading
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
{
2+
"data": [
3+
{
4+
"name": "2018",
5+
"type": "waterfall",
6+
"orientation": "h",
7+
"opacity": 0.5,
8+
"measure": [
9+
"relative",
10+
"relative",
11+
"relative",
12+
"relative",
13+
"total",
14+
"relative",
15+
"relative",
16+
"relative",
17+
"relative",
18+
"total",
19+
"relative",
20+
"relative",
21+
"total",
22+
"relative",
23+
"total"
24+
],
25+
"y": [
26+
"Sales",
27+
"Consulting",
28+
"Maintenance",
29+
"Other revenue",
30+
"Net revenue",
31+
"Purchases",
32+
"Material expenses",
33+
"Personnel expenses",
34+
"Other expenses",
35+
"Operating profit",
36+
"Investment income",
37+
"Financial income",
38+
"Profit before tax",
39+
"Income tax (15%)",
40+
"Profit after tax"
41+
],
42+
"x": [
43+
375,
44+
128,
45+
78,
46+
27,
47+
null,
48+
-327,
49+
-12,
50+
-78,
51+
-12,
52+
null,
53+
32,
54+
89,
55+
null,
56+
-45,
57+
null
58+
],
59+
"base": 0,
60+
"textinfo": "delta",
61+
"textposition": "outside"
62+
},
63+
{
64+
"name": "2019",
65+
"type": "waterfall",
66+
"orientation": "h",
67+
"measure": [
68+
"relative",
69+
"relative",
70+
"relative",
71+
"relative",
72+
"total",
73+
"relative",
74+
"relative",
75+
"relative",
76+
"relative",
77+
"total",
78+
"relative",
79+
"relative",
80+
"total",
81+
"relative",
82+
"total"
83+
],
84+
"y": [
85+
"Sales",
86+
"Consulting",
87+
"Maintenance",
88+
"Other revenue",
89+
"Net revenue",
90+
"Purchases",
91+
"Material expenses",
92+
"Personnel expenses",
93+
"Other expenses",
94+
"Operating profit",
95+
"Investment income",
96+
"Financial income",
97+
"Profit before tax",
98+
"Income tax (15%)",
99+
"Profit after tax"
100+
],
101+
"x": [
102+
307,
103+
102,
104+
187,
105+
172,
106+
null,
107+
-302,
108+
-121,
109+
-187,
110+
-121,
111+
null,
112+
123,
113+
198,
114+
null,
115+
-53.7,
116+
null
117+
],
118+
"base": 255,
119+
"textinfo": "delta",
120+
"textposition": "outside"
121+
}
122+
],
123+
"layout": {
124+
"title": {
125+
"text": "Profit and loss statement 2018 vs 2019<br>waterfall chart"
126+
},
127+
"yaxis": {
128+
"type": "category",
129+
"autorange": "reversed"
130+
},
131+
"xaxis": {
132+
"type": "linear"
133+
},
134+
"margin": { "l": 150 },
135+
"height": 800,
136+
"width": 800,
137+
"hovermode": "closest",
138+
"showlegend": true
139+
}
140+
}

0 commit comments

Comments
 (0)