Skip to content

Commit ffe8b2c

Browse files
committed
no binning for <20 discrete values, fixed % labels
1 parent cdc4264 commit ffe8b2c

File tree

6 files changed

+88
-41
lines changed

6 files changed

+88
-41
lines changed

scout-ui/src/minicharts/d3fns/few.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var d3 = require('d3');
22
var _ = require('lodash');
33
var tooltipHtml = require('./tooltip.jade');
4+
var shared = require('./shared');
45
var debug = require('debug')('scout-ui:minicharts:few');
56

67
require('d3-tip')(d3);
@@ -25,7 +26,7 @@ module.exports = function(data, g, width, height, options) {
2526
}
2627
return d.tooltip || tooltipHtml({
2728
label: d.label,
28-
value: Math.round(d.value / sumValues * 100)
29+
value: shared.percentFormat(d.value / sumValues)
2930
});
3031
})
3132
.direction('n')

scout-ui/src/minicharts/d3fns/many.js

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var d3 = require('d3');
22
var _ = require('lodash');
33
var tooltipHtml = require('./tooltip.jade');
4+
var shared = require('./shared');
45
var debug = require('debug')('scout-ui:minicharts:many');
56

67
require('d3-tip')(d3);
@@ -18,13 +19,13 @@ module.exports = function(data, g, width, height, options) {
1819
.rangeBands([0, width], 0.3, 0.0);
1920

2021
var values = _.pluck(data, 'value');
22+
var maxValue = d3.max(values);
23+
var sumValues = d3.sum(values);
2124

2225
var y = d3.scale.linear()
23-
.domain([0, d3.max(values)])
26+
.domain([0, maxValue])
2427
.range([height, 0]);
2528

26-
var sumY = d3.sum(values);
27-
2829
// set up tooltips
2930
var tip = d3.tip()
3031
.attr('class', 'd3-tip')
@@ -34,7 +35,7 @@ module.exports = function(data, g, width, height, options) {
3435
}
3536
return d.tooltip || tooltipHtml({
3637
label: d.label,
37-
value: d.value
38+
value: shared.percentFormat(d.value / sumValues)
3839
});
3940
})
4041
.direction('n')
@@ -46,8 +47,6 @@ module.exports = function(data, g, width, height, options) {
4647

4748
if (options.scale) {
4849
var maxVal = d3.max(y.domain());
49-
var format = d3.format('%.1f');
50-
var legendValues = [format(maxVal), format(maxVal / 2)];
5150

5251
// @todo use a scale and wrap both text and line in g element
5352
var legend = g.append('g')
@@ -60,7 +59,7 @@ module.exports = function(data, g, width, height, options) {
6059
.attr('y', 0)
6160
.attr('dy', '0.3em')
6261
.attr('text-anchor', 'end')
63-
.text(d3.max(y.domain()) + '%');
62+
.text(shared.percentFormat(maxValue / sumValues));
6463

6564
legend.append('text')
6665
.attr('class', 'legend')
@@ -69,7 +68,7 @@ module.exports = function(data, g, width, height, options) {
6968
.attr('y', height / 2)
7069
.attr('dy', '0.3em')
7170
.attr('text-anchor', 'end')
72-
.text(d3.max(y.domain()) / 2 + '%');
71+
.text(shared.percentFormat(maxValue / sumValues / 2));
7372

7473
legend.append('text')
7574
.attr('class', 'legend')

scout-ui/src/minicharts/d3fns/number.js

Lines changed: 62 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,37 +13,61 @@ module.exports = function(opts) {
1313
var height = opts.height - margin.top - margin.bottom;
1414
var el = opts.el;
1515

16-
// use the linear scale just to get nice binning values
17-
var x = d3.scale.linear()
18-
.domain(d3.extent(values))
19-
.range([0, width]);
16+
if (opts.data.unique < 20) {
17+
var data = _(values)
18+
.groupBy(function(d) {
19+
return d;
20+
})
21+
.map(function(v, k) {
22+
v.label = k;
23+
v.value = v.length;
24+
return v;
25+
})
26+
.value();
2027

21-
// Generate a histogram using approx. twenty uniformly-spaced bins
22-
var ticks = x.ticks(20);
28+
// var sumY = d3.sum(_.pluck(data, 'value'));
29+
// debug(data, sumY);
30+
// in a second pass, add tooltips
31+
// _.each(data, function(d) {
32+
// d.percent = Math.round(d.value / sumY * 100);
33+
// d.tooltip = tooltipHtml({
34+
// label: d.label,
35+
// value: Math.round(d.percent)
36+
// });
37+
// });
2338

24-
var hist = d3.layout.histogram()
25-
.bins(ticks);
39+
} else {
40+
// use the linear scale just to get nice binning values
41+
var x = d3.scale.linear()
42+
.domain(d3.extent(values))
43+
.range([0, width]);
2644

27-
var data = hist(values);
28-
var sumY = d3.sum(_.pluck(data, 'y'));
45+
// Generate a histogram using approx. twenty uniformly-spaced bins
46+
var ticks = x.ticks(20);
47+
var hist = d3.layout.histogram()
48+
.bins(ticks);
2949

30-
_.each(data, function(d, i) {
31-
var label;
32-
if (i === 0) {
33-
label = '< ' + (d.x + d.dx);
34-
} else if (i === data.length - 1) {
35-
label = '&ge; ' + d.x;
36-
} else {
37-
label = d.x + '-' + (d.x + d.dx);
38-
}
39-
// remapping keys to conform with all other types
40-
d.value = d.y;
41-
d.label = label;
42-
d.tooltip = tooltipHtml({
43-
label: label,
44-
value: Math.round(d.y / sumY * 100)
50+
var data = hist(values);
51+
var sumY = d3.sum(_.pluck(data, 'y'));
52+
53+
_.each(data, function(d, i) {
54+
var label;
55+
if (i === 0) {
56+
label = '< ' + (d.x + d.dx);
57+
} else if (i === data.length - 1) {
58+
label = '&ge; ' + d.x;
59+
} else {
60+
label = d.x + '-' + (d.x + d.dx);
61+
}
62+
// remapping keys to conform with all other types
63+
d.value = d.y;
64+
d.label = label;
65+
// d.tooltip = tooltipHtml({
66+
// label: label,
67+
// value: Math.round(d.value / sumY * 100)
68+
// });
4569
});
46-
});
70+
}
4771

4872
// clear element first
4973
d3.select(el).selectAll('*').remove();
@@ -52,16 +76,23 @@ module.exports = function(opts) {
5276
.append('g')
5377
.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
5478

55-
many(data, g, width, height - 10, {
56-
scale: true,
57-
bgbars: false,
58-
labels: {
79+
var labels;
80+
if (opts.data.unique < 20) {
81+
labels = true;
82+
} else {
83+
labels = {
5984
text: function(d, i) {
6085
if (i === 0) return 'min: ' + d3.min(values);
6186
if (i === data.length - 1) return 'max: ' + d3.max(values);
6287
return '';
6388
}
64-
}
89+
};
90+
}
91+
92+
many(data, g, width, height - 10, {
93+
scale: true,
94+
bgbars: false,
95+
labels: labels
6596
});
6697
};
6798

scout-ui/src/minicharts/d3fns/shared.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
var d3 = require('d3');
2+
13
module.exports = {
24

35
margin: {
@@ -7,4 +9,6 @@ module.exports = {
79
left: 40
810
},
911

12+
percentFormat: d3.format('%.1f')
13+
1014
};

scout-ui/src/minicharts/d3fns/string.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,18 @@ module.exports = function(opts) {
2727
.sortByOrder('value', [false]) // descending on value
2828
.value();
2929

30+
// var sumY = d3.sum(_.pluck(data, 'value'));
31+
32+
// in a second pass, add tooltips
33+
// _.each(data, function(d) {
34+
// d.percent = Math.round(d.value / sumY * 100);
35+
// d.tooltip = tooltipHtml({
36+
// label: d.label,
37+
// value: Math.round(d.percent)
38+
// });
39+
// });
40+
41+
3042
// clear element first
3143
d3.select(el).selectAll('*').remove();
3244

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
.tooltip-wrapper
22
.tooltip-label!= label
3-
.tooltip-value #{value}%
3+
.tooltip-value #{value}

0 commit comments

Comments
 (0)