@@ -13,18 +13,19 @@ const defaults = {
13
13
} ;
14
14
15
15
// width factor (allows the hexbin transform to work with circular dots!)
16
- const w0 = 1 / Math . sin ( Math . PI / 3 ) ;
16
+ const w0 = Math . sin ( Math . PI / 3 ) ;
17
17
18
18
function hbin ( I , X , Y , r ) {
19
- const dx = r * 2 / w0 ;
19
+ const dx = r * 2 * w0 ;
20
20
const dy = r * 1.5 ;
21
+ const keys = new Map ( ) ;
21
22
return groups ( I , i => {
22
- let px = X [ i ] / dy ;
23
- let py = Y [ i ] / dx ;
23
+ let px = X [ i ] / dx ;
24
+ let py = Y [ i ] / dy ;
24
25
if ( isNaN ( px ) || isNaN ( py ) ) return ;
25
26
let pj = Math . round ( py ) ,
26
- pi = Math . round ( px - ( pj & 1 ) / 2 ) ,
27
- py1 = py - pj ;
27
+ pi = Math . round ( px = px - ( pj & 1 ) / 2 ) ,
28
+ py1 = py - pj ;
28
29
if ( Math . abs ( py1 ) * 3 > 1 ) {
29
30
let px1 = px - pi ,
30
31
pi2 = pi + ( px < pi ? - 1 : 1 ) / 2 ,
@@ -33,30 +34,32 @@ function hbin(I, X, Y, r) {
33
34
py2 = py - pj2 ;
34
35
if ( px1 * px1 + py1 * py1 > px2 * px2 + py2 * py2 ) pi = pi2 + ( pj & 1 ? 1 : - 1 ) / 2 , pj = pj2 ;
35
36
}
36
- return `${ pi } |${ pj } ` ;
37
+ const key = `${ pi } |${ pj } ` ;
38
+ keys . set ( key , [ pi , pj ] ) ;
39
+ return key ;
37
40
} )
38
41
. filter ( ( [ p ] ) => p )
39
42
. map ( ( [ p , bin ] ) => {
40
- const [ pi , pj ] = p . split ( "|" ) ;
41
- bin . x = ( + pi + ( pj & 1 ) / 2 ) * dx ;
42
- bin . y = + pj * dy ;
43
+ const [ pi , pj ] = keys . get ( p ) ;
44
+ bin . x = ( pi + ( pj & 1 ) / 2 ) * dx ;
45
+ bin . y = pj * dy ;
43
46
return bin ;
44
47
} ) ;
45
48
}
46
49
47
- function hexbinLayout ( { _store, radius, r : _r , opacity : _o , fill : _f , text : _t , title : _l , value : _v } , options ) {
50
+ function hexbinLayout ( _store , { radius, r : _r , opacity : _o , fill : _f , text : _t , title : _l , value : _v } , options ) {
48
51
radius = + radius ;
49
52
_r = ! ! _r ;
50
53
_o = ! ! _o ;
51
54
_f = ! ! _f ;
52
- return layout ( { _store , ... options } , function ( I , { r, color, opacity} , { x : X , y : Y } ) {
55
+ return layout ( options , function ( I , { r, color, opacity} , { x : X , y : Y } ) {
53
56
if ( ! _store . channels ) {
54
57
const bins = _store . facets . map ( I => hbin ( I , X , Y , radius ) ) ;
55
58
const values = bins . map ( b => valueof ( b , _v ) ) ;
56
59
const maxValue = max ( values . flat ( ) ) ;
57
60
color = _f && color . copy ( ) . domain ( [ 1 , maxValue ] ) ;
58
61
opacity = _o && opacity . copy ( ) . domain ( [ 1 , maxValue ] ) ;
59
- r = _r && r && r . copy ( ) . domain ( [ 0 , maxValue ] ) . range ( [ 0 , radius / w0 ] ) ;
62
+ r = _r && r && r . copy ( ) . domain ( [ 0 , maxValue ] ) . range ( [ 0 , radius * w0 ] ) ;
60
63
const { data} = this ;
61
64
_store . channels = Array . from ( bins , ( bin , i ) => ( {
62
65
x : valueof ( bin , "x" ) ,
@@ -87,7 +90,7 @@ function hexbinLayout({_store, radius, r: _r, opacity: _o, fill: _f, text: _t, t
87
90
// going to splice them
88
91
export function hexbinTransform ( hexbinOptions , options ) {
89
92
const _store = { } ;
90
- return basic ( hexbinLayout ( { _store, ... hexbinOptions } , options ) , ( data , facets ) => {
93
+ return basic ( hexbinLayout ( _store , hexbinOptions , options ) , ( data , facets ) => {
91
94
facets = Array . from ( facets , facet => Array . from ( facet ) ) ;
92
95
_store . facets = facets ;
93
96
return { data, facets} ;
0 commit comments