Skip to content

Commit 2247377

Browse files
committed
use different transFn for polar ticks, grid and labels when convenient
1 parent 38c6ad8 commit 2247377

File tree

2 files changed

+56
-67
lines changed

2 files changed

+56
-67
lines changed

src/plots/cartesian/axes.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2425,12 +2425,13 @@ axes.makeLabelFns = function(ax, shift, angle) {
24252425
labelStandoff += 0.2 * ax.tickfont.size;
24262426
}
24272427

2428-
// TODO get rid of!
2429-
ax._pad = pad;
2430-
ax._labelStandoff = labelStandoff;
2431-
ax._labelShift = labelShift;
2428+
// Used in polar angular label x/y functions
2429+
// TODO generalize makeLabelFns so that it just work for angular axes
2430+
var out = {
2431+
labelStandoff: labelStandoff,
2432+
labelShift: labelShift
2433+
};
24322434

2433-
var out = {};
24342435
var x0, y0, ff, flipIt;
24352436
if(axLetter === 'x') {
24362437
flipIt = ax.side === 'bottom' ? 1 : -1;
@@ -2446,7 +2447,7 @@ axes.makeLabelFns = function(ax, shift, angle) {
24462447
}
24472448
return (a * flipIt < 0) ? 'end' : 'start';
24482449
};
2449-
} else {
2450+
} else if(axLetter === 'y') {
24502451
flipIt = ax.side === 'right' ? 1 : -1;
24512452
x0 = labelStandoff + pad;
24522453
y0 = -labelShift * flipIt;
@@ -2461,6 +2462,7 @@ axes.makeLabelFns = function(ax, shift, angle) {
24612462
return ax.side === 'right' ? 'start' : 'end';
24622463
};
24632464
}
2465+
24642466
return out;
24652467
};
24662468

src/plots/polar/polar.js

Lines changed: 48 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,6 @@ proto.updateRadialAxis = function(fullLayout, polarLayout) {
417417
}
418418

419419
Axes.drawTicks(gd, ax, {
420-
// TODO right? No need to clip here ever?
421420
vals: vals,
422421
layer: layers['radial-axis'],
423422
path: Axes.makeTickPath(ax, 0, tickSign[2]),
@@ -428,7 +427,7 @@ proto.updateRadialAxis = function(fullLayout, polarLayout) {
428427
vals: valsClipped,
429428
layer: layers['radial-grid'],
430429
path: gridPathFn,
431-
transFn: transFn
430+
transFn: Lib.noop
432431
});
433432

434433
Axes.drawLabels(gd, ax, {
@@ -448,23 +447,20 @@ proto.updateRadialAxis = function(fullLayout, polarLayout) {
448447
rad2deg(snapToVertexAngle(deg2rad(radialLayout.angle), _this.vangles)) :
449448
radialLayout.angle;
450449

451-
// TODO no more "draw-and-then-tweak" !!!
452-
var trans = strTranslate(cx, cy) + strRotate(-angle);
450+
var tLayer = strTranslate(cx, cy);
451+
var tLayer2 = tLayer + strRotate(-angle);
453452

454453
updateElement(
455454
layers['radial-axis'],
456455
hasRoomForIt && (radialLayout.showticklabels || radialLayout.ticks),
457-
{transform: trans}
456+
{transform: tLayer2}
458457
);
459458

460-
// TODO !!
461-
// move all grid paths to about circle center,
462-
// undo individual grid lines translations
463459
updateElement(
464460
layers['radial-grid'],
465461
hasRoomForIt && radialLayout.showgrid,
466-
{transform: strTranslate(cx, cy)}
467-
).selectAll('path').attr('transform', null);
462+
{transform: tLayer}
463+
);
468464

469465
updateElement(
470466
layers['radial-line'].select('line'),
@@ -474,7 +470,7 @@ proto.updateRadialAxis = function(fullLayout, polarLayout) {
474470
y1: 0,
475471
x2: radius,
476472
y2: 0,
477-
transform: trans
473+
transform: tLayer2
478474
}
479475
)
480476
.attr('stroke-width', radialLayout.linewidth)
@@ -531,6 +527,7 @@ proto.updateAngularAxis = function(fullLayout, polarLayout) {
531527
_this.fillViewInitialKey('angularaxis.rotation', angularLayout.rotation);
532528

533529
ax.setGeometry();
530+
ax.setScale();
534531

535532
// 't'ick to 'g'eometric radians is used all over the place here
536533
var t2g = function(d) { return ax.t2g(d.x); };
@@ -541,23 +538,17 @@ proto.updateAngularAxis = function(fullLayout, polarLayout) {
541538
ax.dtick = rad2deg(ax.dtick);
542539
}
543540

544-
// TODO break up into two functions!
545-
var transFn = function(d) {
546-
var sel = d3.select(this);
547-
var hasElement = sel && sel.node();
541+
var _transFn = function(rad) {
542+
return strTranslate(cx + radius * Math.cos(rad), cy - radius * Math.sin(rad));
543+
};
548544

549-
// don't translate grid lines
550-
if(hasElement && sel.classed('angularaxisgrid')) return '';
545+
var transFn = function(d) {
546+
return _transFn(t2g(d));
547+
};
551548

549+
var transFn2 = function(d) {
552550
var rad = t2g(d);
553-
var out = strTranslate(cx + radius * Math.cos(rad), cy - radius * Math.sin(rad));
554-
555-
// must also rotate ticks, but don't rotate labels
556-
if(hasElement && sel.classed('ticks')) {
557-
out += strRotate(-rad2deg(rad));
558-
}
559-
560-
return out;
551+
return _transFn(rad) + strRotate(-rad2deg(rad));
561552
};
562553

563554
var gridPathFn = function(d) {
@@ -568,13 +559,14 @@ proto.updateAngularAxis = function(fullLayout, polarLayout) {
568559
'L' + [cx + radius * cosRad, cy - radius * sinRad];
569560
};
570561

571-
Axes.makeLabelFns(ax, 0);
562+
var out = Axes.makeLabelFns(ax, 0);
563+
var labelStandoff = out.labelStandoff;
564+
var labelShift = out.labelShift;
572565
var offset4fontsize = (angularLayout.ticks !== 'outside' ? 0.7 : 0.5);
566+
var pad = (ax.linewidth || 1) / 2;
573567

574568
var labelXFn = function(d) {
575569
var rad = t2g(d);
576-
var labelStandoff = ax._labelStandoff;
577-
var pad = ax._pad;
578570

579571
var offset4tx = signSin(rad) === 0 ?
580572
0 :
@@ -586,9 +578,6 @@ proto.updateAngularAxis = function(fullLayout, polarLayout) {
586578

587579
var labelYFn = function(d) {
588580
var rad = t2g(d);
589-
var labelStandoff = ax._labelStandoff;
590-
var labelShift = ax._labelShift;
591-
var pad = ax._pad;
592581

593582
var offset4tx = d.dy + d.fontSize * MID_SHIFT - labelShift;
594583
var offset4tick = -Math.sin(rad) * (labelStandoff + pad + offset4fontsize * d.fontSize);
@@ -610,15 +599,32 @@ proto.updateAngularAxis = function(fullLayout, polarLayout) {
610599
_this.angularTickLayout = newTickLayout;
611600
}
612601

613-
ax.setScale();
614-
615602
var vals = Axes.calcTicks(ax);
603+
604+
// angle of polygon vertices in geometric radians (null means circles)
605+
// TODO what to do when ax.period > ax._categories ??
606+
var vangles;
607+
if(polarLayout.gridshape === 'linear') {
608+
vangles = vals.map(t2g);
609+
610+
// ax._vals should be always ordered, make them
611+
// always turn counterclockwise for convenience here
612+
if(Lib.angleDelta(vangles[0], vangles[1]) < 0) {
613+
vangles = vangles.slice().reverse();
614+
}
615+
} else {
616+
vangles = null;
617+
}
618+
_this.vangles = vangles;
619+
616620
// Use tickval filter for category axes instead of tweaking
617621
// the range w.r.t sector, so that sectors that cross 360 can
618622
// show all their ticks.
619-
var tickVals = ax.type === 'category' ?
620-
vals.filter(function(d) { return Lib.isAngleInsideSector(t2g(d), _this.sectorInRad); }) :
621-
vals;
623+
if(ax.type === 'category') {
624+
vals = vals.filter(function(d) {
625+
return Lib.isAngleInsideSector(t2g(d), _this.sectorInRad);
626+
});
627+
}
622628

623629
if(ax.visible) {
624630
// TODO dry!!
@@ -628,25 +634,22 @@ proto.updateAngularAxis = function(fullLayout, polarLayout) {
628634
tickSign = tickSign.map(function(v) { return -v; });
629635
}
630636

631-
var pad = tickSign[2] * (ax.linewidth || 1) / 2;
632-
var len = tickSign[2] * ax.ticklen;
633-
634637
Axes.drawTicks(gd, ax, {
635-
vals: tickVals,
638+
vals: vals,
636639
layer: layers['angular-axis'],
637-
path: 'M' + pad + ',0h' + len,
638-
transFn: transFn
640+
path: 'M' + (tickSign[2] * pad) + ',0h' + (tickSign[2] * ax.ticklen),
641+
transFn: transFn2
639642
});
640643

641644
Axes.drawGrid(gd, ax, {
642-
vals: tickVals,
645+
vals: vals,
643646
layer: layers['angular-grid'],
644647
path: gridPathFn,
645-
transFn: transFn
648+
transFn: Lib.noop
646649
});
647650

648651
Axes.drawLabels(gd, ax, {
649-
vals: tickVals,
652+
vals: vals,
650653
layer: layers['angular-axis'],
651654
shift: 0,
652655
transFn: transFn,
@@ -657,22 +660,6 @@ proto.updateAngularAxis = function(fullLayout, polarLayout) {
657660
});
658661
}
659662

660-
// angle of polygon vertices in geometric radians (null means circles)
661-
// TODO what to do when ax.period > ax._categories ??
662-
var vangles;
663-
if(polarLayout.gridshape === 'linear') {
664-
vangles = vals.map(t2g);
665-
666-
// ax._vals should be always ordered, make them
667-
// always turn counterclockwise for convenience here
668-
if(Lib.angleDelta(vangles[0], vangles[1]) < 0) {
669-
vangles = vangles.slice().reverse();
670-
}
671-
} else {
672-
vangles = null;
673-
}
674-
_this.vangles = vangles;
675-
676663
// TODO maybe two arcs is better here?
677664
// maybe split style attributes between inner and outer angular axes?
678665

0 commit comments

Comments
 (0)