@@ -15,6 +15,7 @@ var map1dArray = require('./map_1d_array');
15
15
var makepath = require ( './makepath' ) ;
16
16
var orientText = require ( './orient_text' ) ;
17
17
var svgTextUtils = require ( '../../lib/svg_text_utils' ) ;
18
+ var alignmentConstants = require ( '../../constants/alignment' ) ;
18
19
19
20
module . exports = function plot ( gd , plotinfo , cdcarpet ) {
20
21
for ( var i = 0 ; i < cdcarpet . length ; i ++ ) {
@@ -58,10 +59,10 @@ function plotOne(gd, plotinfo, cd) {
58
59
drawGridLines ( xa , ya , boundaryLayer , aax , 'a-boundary' , aax . _boundarylines ) ;
59
60
drawGridLines ( xa , ya , boundaryLayer , bax , 'b-boundary' , bax . _boundarylines ) ;
60
61
61
- var maxAExtent = drawAxisLabels ( gd , xa , ya , trace , t , labelLayer , aax . _labels , 'a-label' ) ;
62
- var maxBExtent = drawAxisLabels ( gd , xa , ya , trace , t , labelLayer , bax . _labels , 'b-label' ) ;
62
+ var labelOrientationA = drawAxisLabels ( gd , xa , ya , trace , t , labelLayer , aax . _labels , 'a-label' ) ;
63
+ var labelOrientationB = drawAxisLabels ( gd , xa , ya , trace , t , labelLayer , bax . _labels , 'b-label' ) ;
63
64
64
- drawAxisTitles ( gd , labelLayer , trace , t , xa , ya , maxAExtent , maxBExtent ) ;
65
+ drawAxisTitles ( gd , labelLayer , trace , t , xa , ya , labelOrientationA , labelOrientationB ) ;
65
66
66
67
drawClipPath ( trace , t , clipLayer , xa , ya ) ;
67
68
}
@@ -131,8 +132,9 @@ function drawAxisLabels(gd, xaxis, yaxis, trace, t, layer, labels, labelClass) {
131
132
. classed ( labelClass , true ) ;
132
133
133
134
var maxExtent = 0 ;
135
+ var labelOrientation ;
134
136
135
- labelJoin . each ( function ( label ) {
137
+ labelJoin . each ( function ( label , i ) {
136
138
// Most of the positioning is done in calc_labels. Only the parts that depend upon
137
139
// the screen space representation of the x and y axes are here:
138
140
var orientation ;
@@ -142,6 +144,11 @@ function drawAxisLabels(gd, xaxis, yaxis, trace, t, layer, labels, labelClass) {
142
144
var angle = ( label . axis . tickangle + 180.0 ) * Math . PI / 180.0 ;
143
145
orientation = orientText ( trace , xaxis , yaxis , label . xy , [ Math . cos ( angle ) , Math . sin ( angle ) ] ) ;
144
146
}
147
+
148
+ if ( ! i ) {
149
+ // TODO: offsetMultiplier? Not currently used anywhere...
150
+ labelOrientation = { angle : orientation . angle , flip : orientation . flip } ;
151
+ }
145
152
var direction = ( label . endAnchor ? - 1 : 1 ) * orientation . flip ;
146
153
147
154
var labelEl = d3 . select ( this )
@@ -169,29 +176,34 @@ function drawAxisLabels(gd, xaxis, yaxis, trace, t, layer, labels, labelClass) {
169
176
170
177
labelJoin . exit ( ) . remove ( ) ;
171
178
172
- return maxExtent ;
179
+ labelOrientation . maxExtent = maxExtent ;
180
+ return labelOrientation ;
173
181
}
174
182
175
- function drawAxisTitles ( gd , layer , trace , t , xa , ya , maxAExtent , maxBExtent ) {
183
+ function drawAxisTitles ( gd , layer , trace , t , xa , ya , labelOrientationA , labelOrientationB ) {
176
184
var a , b , xy , dxy ;
177
185
178
186
a = 0.5 * ( trace . a [ 0 ] + trace . a [ trace . a . length - 1 ] ) ;
179
187
b = trace . b [ 0 ] ;
180
188
xy = trace . ab2xy ( a , b , true ) ;
181
189
dxy = trace . dxyda_rough ( a , b ) ;
182
- drawAxisTitle ( gd , layer , trace , t , xy , dxy , trace . aaxis , xa , ya , maxAExtent , 'a-title' ) ;
190
+ drawAxisTitle ( gd , layer , trace , t , xy , dxy , trace . aaxis , xa , ya , labelOrientationA , 'a-title' ) ;
183
191
184
192
a = trace . a [ 0 ] ;
185
193
b = 0.5 * ( trace . b [ 0 ] + trace . b [ trace . b . length - 1 ] ) ;
186
194
xy = trace . ab2xy ( a , b , true ) ;
187
195
dxy = trace . dxydb_rough ( a , b ) ;
188
- drawAxisTitle ( gd , layer , trace , t , xy , dxy , trace . baxis , xa , ya , maxBExtent , 'b-title' ) ;
196
+ drawAxisTitle ( gd , layer , trace , t , xy , dxy , trace . baxis , xa , ya , labelOrientationB , 'b-title' ) ;
189
197
}
190
198
191
- function drawAxisTitle ( gd , layer , trace , t , xy , dxy , axis , xa , ya , offset , labelClass ) {
199
+ var lineSpacing = alignmentConstants . LINE_SPACING ;
200
+ var midShift = ( ( 1 - alignmentConstants . MID_SHIFT ) / lineSpacing ) + 1 ;
201
+
202
+ function drawAxisTitle ( gd , layer , trace , t , xy , dxy , axis , xa , ya , labelOrientation , labelClass ) {
192
203
var data = [ ] ;
193
204
if ( axis . title ) data . push ( axis . title ) ;
194
205
var titleJoin = layer . selectAll ( 'text.' + labelClass ) . data ( data ) ;
206
+ var offset = labelOrientation . maxExtent ;
195
207
196
208
titleJoin . enter ( ) . append ( 'text' )
197
209
. classed ( labelClass , true ) ;
@@ -205,14 +217,23 @@ function drawAxisTitle(gd, layer, trace, t, xy, dxy, axis, xa, ya, offset, label
205
217
}
206
218
207
219
// In addition to the size of the labels, add on some extra padding:
208
- offset += axis . titlefont . size + axis . titleoffset ;
220
+ var titleSize = axis . titlefont . size ;
221
+ offset += titleSize + axis . titleoffset ;
209
222
223
+ var labelNorm = labelOrientation . angle + ( labelOrientation . flip < 0 ? 180 : 0 ) ;
224
+ var angleDiff = ( labelNorm - orientation . angle + 450 ) % 360 ;
225
+ var reverseTitle = angleDiff > 90 && angleDiff < 270 ;
210
226
211
227
var el = d3 . select ( this ) ;
212
228
213
229
el . text ( axis . title || '' )
214
- . call ( svgTextUtils . convertToTspans , gd )
215
- . attr ( 'transform' ,
230
+ . call ( svgTextUtils . convertToTspans , gd ) ;
231
+
232
+ if ( reverseTitle ) {
233
+ offset = ( - svgTextUtils . lineCount ( el ) + midShift ) * lineSpacing * titleSize - offset ;
234
+ }
235
+
236
+ el . attr ( 'transform' ,
216
237
'translate(' + orientation . p [ 0 ] + ',' + orientation . p [ 1 ] + ') ' +
217
238
'rotate(' + orientation . angle + ') ' +
218
239
'translate(0,' + offset + ')'
0 commit comments