@@ -271,6 +271,7 @@ function sankeyModel(layout, d, traceIndex) {
271
271
nodeLineWidth : trace . node . line . width ,
272
272
linkLineColor : trace . link . line . color ,
273
273
linkLineWidth : trace . link . line . width ,
274
+ linkArrowLength : trace . link . arrowlen ,
274
275
valueFormat : trace . valueformat ,
275
276
valueSuffix : trace . valuesuffix ,
276
277
textFont : trace . textfont ,
@@ -309,6 +310,7 @@ function linkModel(d, l, i) {
309
310
linkPath : linkPath ,
310
311
linkLineColor : d . linkLineColor ,
311
312
linkLineWidth : d . linkLineWidth ,
313
+ linkArrowLength : d . linkArrowLength ,
312
314
valueFormat : d . valueFormat ,
313
315
valueSuffix : d . valueSuffix ,
314
316
sankey : d . sankey ,
@@ -318,7 +320,7 @@ function linkModel(d, l, i) {
318
320
} ;
319
321
}
320
322
321
- function createCircularClosedPathString ( link ) {
323
+ function createCircularClosedPathString ( link , arrowLen ) {
322
324
// Using coordinates computed by d3-sankey-circular
323
325
var pathString = '' ;
324
326
var offset = link . width / 2 ;
@@ -328,17 +330,17 @@ function createCircularClosedPathString(link) {
328
330
pathString =
329
331
// start at the left of the target node
330
332
'M ' +
331
- coords . targetX + ' ' + ( coords . targetY + offset ) + ' ' +
333
+ ( coords . targetX - arrowLen ) + ' ' + ( coords . targetY + offset ) + ' ' +
332
334
'L' +
333
- coords . rightInnerExtent + ' ' + ( coords . targetY + offset ) +
335
+ ( coords . rightInnerExtent - arrowLen ) + ' ' + ( coords . targetY + offset ) +
334
336
'A' +
335
337
( coords . rightLargeArcRadius + offset ) + ' ' + ( coords . rightSmallArcRadius + offset ) + ' 0 0 1 ' +
336
- ( coords . rightFullExtent - offset ) + ' ' + ( coords . targetY - coords . rightSmallArcRadius ) +
338
+ ( coords . rightFullExtent - offset - arrowLen ) + ' ' + ( coords . targetY - coords . rightSmallArcRadius ) +
337
339
'L' +
338
- ( coords . rightFullExtent - offset ) + ' ' + coords . verticalRightInnerExtent +
340
+ ( coords . rightFullExtent - offset - arrowLen ) + ' ' + coords . verticalRightInnerExtent +
339
341
'A' +
340
342
( coords . rightLargeArcRadius + offset ) + ' ' + ( coords . rightLargeArcRadius + offset ) + ' 0 0 1 ' +
341
- coords . rightInnerExtent + ' ' + ( coords . verticalFullExtent - offset ) +
343
+ ( coords . rightInnerExtent - arrowLen ) + ' ' + ( coords . verticalFullExtent - offset ) +
342
344
'L' +
343
345
coords . leftInnerExtent + ' ' + ( coords . verticalFullExtent - offset ) +
344
346
'A' +
@@ -366,34 +368,35 @@ function createCircularClosedPathString(link) {
366
368
( coords . leftLargeArcRadius - offset ) + ' ' + ( coords . leftLargeArcRadius - offset ) + ' 0 0 0 ' +
367
369
coords . leftInnerExtent + ' ' + ( coords . verticalFullExtent + offset ) +
368
370
'L' +
369
- coords . rightInnerExtent + ' ' + ( coords . verticalFullExtent + offset ) +
371
+ ( coords . rightInnerExtent - arrowLen ) + ' ' + ( coords . verticalFullExtent + offset ) +
370
372
'A' +
371
373
( coords . rightLargeArcRadius - offset ) + ' ' + ( coords . rightLargeArcRadius - offset ) + ' 0 0 0 ' +
372
- ( coords . rightFullExtent + offset ) + ' ' + coords . verticalRightInnerExtent +
374
+ ( coords . rightFullExtent + offset - arrowLen ) + ' ' + coords . verticalRightInnerExtent +
373
375
'L' +
374
- ( coords . rightFullExtent + offset ) + ' ' + ( coords . targetY - coords . rightSmallArcRadius ) +
376
+ ( coords . rightFullExtent + offset - arrowLen ) + ' ' + ( coords . targetY - coords . rightSmallArcRadius ) +
375
377
'A' +
376
378
( coords . rightLargeArcRadius - offset ) + ' ' + ( coords . rightSmallArcRadius - offset ) + ' 0 0 0 ' +
377
- coords . rightInnerExtent + ' ' + ( coords . targetY - offset ) +
379
+ ( coords . rightInnerExtent - arrowLen ) + ' ' + ( coords . targetY - offset ) +
378
380
'L' +
379
- coords . targetX + ' ' + ( coords . targetY - offset ) +
381
+ ( coords . targetX - arrowLen ) + ' ' + ( coords . targetY - offset ) +
382
+ ( arrowLen > 0 ? 'L' + coords . targetX + ' ' + ( coords . targetY ) : '' ) +
380
383
'Z' ;
381
384
} else {
382
385
// Bottom path
383
386
pathString =
384
387
// start at the left of the target node
385
388
'M ' +
386
- coords . targetX + ' ' + ( coords . targetY - offset ) + ' ' +
389
+ ( coords . targetX - arrowLen ) + ' ' + ( coords . targetY - offset ) + ' ' +
387
390
'L' +
388
- coords . rightInnerExtent + ' ' + ( coords . targetY - offset ) +
391
+ ( coords . rightInnerExtent - arrowLen ) + ' ' + ( coords . targetY - offset ) +
389
392
'A' +
390
393
( coords . rightLargeArcRadius + offset ) + ' ' + ( coords . rightSmallArcRadius + offset ) + ' 0 0 0 ' +
391
- ( coords . rightFullExtent - offset ) + ' ' + ( coords . targetY + coords . rightSmallArcRadius ) +
394
+ ( coords . rightFullExtent - offset - arrowLen ) + ' ' + ( coords . targetY + coords . rightSmallArcRadius ) +
392
395
'L' +
393
- ( coords . rightFullExtent - offset ) + ' ' + coords . verticalRightInnerExtent +
396
+ ( coords . rightFullExtent - offset - arrowLen ) + ' ' + coords . verticalRightInnerExtent +
394
397
'A' +
395
398
( coords . rightLargeArcRadius + offset ) + ' ' + ( coords . rightLargeArcRadius + offset ) + ' 0 0 0 ' +
396
- coords . rightInnerExtent + ' ' + ( coords . verticalFullExtent + offset ) +
399
+ ( coords . rightInnerExtent - arrowLen ) + ' ' + ( coords . verticalFullExtent + offset ) +
397
400
'L' +
398
401
coords . leftInnerExtent + ' ' + ( coords . verticalFullExtent + offset ) +
399
402
'A' +
@@ -421,17 +424,18 @@ function createCircularClosedPathString(link) {
421
424
( coords . leftLargeArcRadius - offset ) + ' ' + ( coords . leftLargeArcRadius - offset ) + ' 0 0 1 ' +
422
425
coords . leftInnerExtent + ' ' + ( coords . verticalFullExtent - offset ) +
423
426
'L' +
424
- coords . rightInnerExtent + ' ' + ( coords . verticalFullExtent - offset ) +
427
+ ( coords . rightInnerExtent - arrowLen ) + ' ' + ( coords . verticalFullExtent - offset ) +
425
428
'A' +
426
429
( coords . rightLargeArcRadius - offset ) + ' ' + ( coords . rightLargeArcRadius - offset ) + ' 0 0 1 ' +
427
- ( coords . rightFullExtent + offset ) + ' ' + coords . verticalRightInnerExtent +
430
+ ( coords . rightFullExtent + offset - arrowLen ) + ' ' + coords . verticalRightInnerExtent +
428
431
'L' +
429
- ( coords . rightFullExtent + offset ) + ' ' + ( coords . targetY + coords . rightSmallArcRadius ) +
432
+ ( coords . rightFullExtent + offset - arrowLen ) + ' ' + ( coords . targetY + coords . rightSmallArcRadius ) +
430
433
'A' +
431
434
( coords . rightLargeArcRadius - offset ) + ' ' + ( coords . rightSmallArcRadius - offset ) + ' 0 0 1 ' +
432
- coords . rightInnerExtent + ' ' + ( coords . targetY + offset ) +
435
+ ( coords . rightInnerExtent - arrowLen ) + ' ' + ( coords . targetY + offset ) +
433
436
'L' +
434
- coords . targetX + ' ' + ( coords . targetY + offset ) +
437
+ ( coords . targetX - arrowLen ) + ' ' + ( coords . targetY + offset ) +
438
+ ( arrowLen > 0 ? 'L' + coords . targetX + ' ' + ( coords . targetY ) : '' ) +
435
439
'Z' ;
436
440
}
437
441
return pathString ;
@@ -440,27 +444,34 @@ function createCircularClosedPathString(link) {
440
444
function linkPath ( ) {
441
445
var curvature = 0.5 ;
442
446
function path ( d ) {
447
+ var arrowLen = d . linkArrowLength ;
443
448
if ( d . link . circular ) {
444
- return createCircularClosedPathString ( d . link ) ;
449
+ return createCircularClosedPathString ( d . link , arrowLen ) ;
445
450
} else {
451
+ var maxArrowLength = Math . abs ( ( d . link . target . x0 - d . link . source . x1 ) / 2 ) ;
452
+ if ( arrowLen > maxArrowLength ) {
453
+ arrowLen = maxArrowLength ;
454
+ }
446
455
var x0 = d . link . source . x1 ;
447
- var x1 = d . link . target . x0 ;
456
+ var x1 = d . link . target . x0 - arrowLen ;
448
457
var xi = interpolateNumber ( x0 , x1 ) ;
449
458
var x2 = xi ( curvature ) ;
450
459
var x3 = xi ( 1 - curvature ) ;
451
460
var y0a = d . link . y0 - d . link . width / 2 ;
452
461
var y0b = d . link . y0 + d . link . width / 2 ;
453
462
var y1a = d . link . y1 - d . link . width / 2 ;
454
463
var y1b = d . link . y1 + d . link . width / 2 ;
455
- return 'M' + x0 + ',' + y0a +
456
- 'C' + x2 + ',' + y0a +
457
- ' ' + x3 + ',' + y1a +
458
- ' ' + x1 + ',' + y1a +
459
- 'L' + x1 + ',' + y1b +
460
- 'C' + x3 + ',' + y1b +
461
- ' ' + x2 + ',' + y0b +
462
- ' ' + x0 + ',' + y0b +
463
- 'Z' ;
464
+ var start = 'M' + x0 + ',' + y0a ;
465
+ var upperCurve = 'C' + x2 + ',' + y0a +
466
+ ' ' + x3 + ',' + y1a +
467
+ ' ' + x1 + ',' + y1a ;
468
+ var lowerCurve = 'C' + x3 + ',' + y1b +
469
+ ' ' + x2 + ',' + y0b +
470
+ ' ' + x0 + ',' + y0b ;
471
+
472
+ var rightEnd = arrowLen > 0 ? 'L' + ( x1 + arrowLen ) + ',' + ( y1a + d . link . width / 2 ) : '' ;
473
+ rightEnd += 'L' + x1 + ',' + y1b ;
474
+ return start + upperCurve + rightEnd + lowerCurve + 'Z' ;
464
475
}
465
476
}
466
477
return path ;
0 commit comments