@@ -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 = '≥ ' + 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 = '≥ ' + 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
0 commit comments