@@ -76,7 +76,8 @@ def __init__(self, *args, **kwargs):
76
76
77
77
name = self .axis_name
78
78
79
- self .position = 'auto'
79
+ self ._label_position = 'default'
80
+ self ._tick_position = 'default'
80
81
81
82
# This is a temporary member variable.
82
83
# Do not depend on this existing in future releases!
@@ -185,6 +186,54 @@ def get_minor_ticks(self, numticks=None):
185
186
obj .set_transform (self .axes .transData )
186
187
return ticks
187
188
189
+ def set_ticks_position (self , position ):
190
+ """
191
+ Set the ticks position.
192
+
193
+ Parameters
194
+ ----------
195
+ position : {'lower', 'upper', 'both', 'default', 'none'}
196
+ The position of the bolded axis lines, ticks, and tick labels.
197
+ """
198
+ _api .check_in_list (['lower' , 'upper' , 'both' , 'default' , 'none' ],
199
+ position = position )
200
+ self ._tick_position = position
201
+
202
+ def get_ticks_position (self ):
203
+ """
204
+ Get the ticks position.
205
+
206
+ Returns
207
+ -------
208
+ position : {'lower', 'upper', 'both', 'default', 'none'}
209
+ The position of the bolded axis lines, ticks, and tick labels.
210
+ """
211
+ return self ._tick_position
212
+
213
+ def set_label_position (self , position ):
214
+ """
215
+ Set the label position.
216
+
217
+ Parameters
218
+ ----------
219
+ position : {'lower', 'upper', 'both', 'default', 'none'}
220
+ The position of the axis label.
221
+ """
222
+ _api .check_in_list (['lower' , 'upper' , 'both' , 'default' , 'none' ],
223
+ position = position )
224
+ self ._label_position = position
225
+
226
+ def get_label_position (self ):
227
+ """
228
+ Get the label position.
229
+
230
+ Returns
231
+ -------
232
+ position : {'lower', 'upper', 'both', 'default', 'none'}
233
+ The position of the axis label.
234
+ """
235
+ return self ._label_position
236
+
188
237
def set_pane_color (self , color , alpha = None ):
189
238
"""
190
239
Set pane color.
@@ -262,7 +311,7 @@ def _get_axis_line_edge_points(self, minmax, maxmin, position=None):
262
311
# When changing vertical axis some of the axes has to be
263
312
# moved to the other plane so it looks the same as if the z-axis
264
313
# was the vertical axis.
265
- mb = [minmax , maxmin ] # line from origin to near invisible corner
314
+ mb = [minmax , maxmin ] # line from origin to nearest corner to camera
266
315
mb_rev = mb [::- 1 ]
267
316
mm = [[mb , mb_rev , mb_rev ], [mb_rev , mb_rev , mb ], [mb , mb , mb ]]
268
317
mm = mm [self .axes ._vertical_axis ][self ._axinfo ["i" ]]
@@ -283,6 +332,25 @@ def _get_axis_line_edge_points(self, minmax, maxmin, position=None):
283
332
284
333
return edge_point_0 , edge_point_1
285
334
335
+ def _get_all_axis_line_edge_points (self , minmax , maxmin , position = None ):
336
+ # Determine edge points for the axis lines
337
+ edgep1s = []
338
+ edgep2s = []
339
+ if position in (None , 'default' ):
340
+ edgep1 , edgep2 = self ._get_axis_line_edge_points (minmax , maxmin )
341
+ edgep1s = [edgep1 ]
342
+ edgep2s = [edgep2 ]
343
+ else :
344
+ edgep1_l , edgep2_l = self ._get_axis_line_edge_points (minmax , maxmin , position = 'lower' )
345
+ edgep1_u , edgep2_u = self ._get_axis_line_edge_points (minmax , maxmin , position = 'upper' )
346
+ if position in ('lower' , 'both' ):
347
+ edgep1s .append (edgep1_l )
348
+ edgep2s .append (edgep2_l )
349
+ if position in ('upper' , 'both' ):
350
+ edgep1s .append (edgep1_u )
351
+ edgep2s .append (edgep2_u )
352
+ return edgep1s , edgep2s
353
+
286
354
def _get_tickdir (self ):
287
355
"""
288
356
Get the direction of the tick.
@@ -337,8 +405,8 @@ def _axmask(self):
337
405
return axmask
338
406
339
407
340
- def _draw_ticks (self , renderer , edgep1 , deltas_per_point ):
341
- mins , maxs , centers , deltas , tc , highs = self . _get_coord_info ( renderer )
408
+ def _draw_ticks (self , renderer , edgep1 , centers , deltas , highs ,
409
+ deltas_per_point ):
342
410
ticks = self ._update_ticks ()
343
411
info = self ._axinfo
344
412
index = info ["i" ]
@@ -378,10 +446,8 @@ def _draw_ticks(self, renderer, edgep1, deltas_per_point):
378
446
tick .draw (renderer )
379
447
380
448
381
- def _draw_offset_text (self , renderer , edgep1 , edgep2 , labeldeltas , pep ,
382
- dx , dy ):
383
- mins , maxs , centers , deltas , tc , highs = self ._get_coord_info (renderer )
384
-
449
+ def _draw_offset_text (self , renderer , edgep1 , edgep2 , labeldeltas , centers ,
450
+ highs , pep , dx , dy ):
385
451
# Get general axis information:
386
452
info = self ._axinfo
387
453
index = info ["i" ]
@@ -451,9 +517,9 @@ def _draw_offset_text(self, renderer, edgep1, edgep2, labeldeltas, pep,
451
517
self .offsetText .draw (renderer )
452
518
453
519
454
- def _draw_labels (self , renderer , edgep1 , edgep2 , labeldeltas , dx , dy ):
520
+ def _draw_labels (self , renderer , edgep1 , edgep2 , labeldeltas , centers ,
521
+ dx , dy ):
455
522
info = self ._axinfo
456
- mins , maxs , centers , deltas , tc , highs = self ._get_coord_info (renderer )
457
523
458
524
# Draw labels
459
525
lxyz = 0.5 * (edgep1 + edgep2 )
@@ -488,31 +554,14 @@ def draw(self, renderer):
488
554
(self .labelpad + default_offset ) * deltas_per_point * deltas )
489
555
490
556
# Determine edge points for the axis lines
491
- edgep1s = []
492
- edgep2s = []
493
557
minmax = np .where (highs , maxs , mins ) # "origin" point
494
558
maxmin = np .where (~ highs , maxs , mins ) # "opposite" corner near camera
495
- if self .position == 'auto' :
496
- edgep1 , edgep2 = self ._get_axis_line_edge_points (minmax , maxmin )
497
- edgep1s = [edgep1 ]
498
- edgep2s = [edgep2 ]
499
- else :
500
- edgep1_l , edgep2_l = self ._get_axis_line_edge_points (minmax , maxmin , position = 'lower' )
501
- edgep1_u , edgep2_u = self ._get_axis_line_edge_points (minmax , maxmin , position = 'upper' )
502
- if self .position in ('lower' , 'both' ):
503
- edgep1s .append (edgep1_l )
504
- edgep2s .append (edgep2_l )
505
- if self .position in ('upper' , 'both' ):
506
- edgep1s .append (edgep1_u )
507
- edgep2s .append (edgep2_u )
508
559
509
- for edgep1 , edgep2 in zip (edgep1s , edgep2s ):
510
- # Draw the lines
560
+ for edgep1 , edgep2 in zip (* self . _get_all_axis_line_edge_points (
561
+ minmax , maxmin , self . _tick_position )):
511
562
# Project the edge points along the current position
512
563
pep = proj3d ._proj_trans_points ([edgep1 , edgep2 ], self .axes .M )
513
564
pep = np .asarray (pep )
514
- self .line .set_data (pep [0 ], pep [1 ])
515
- self .line .draw (renderer )
516
565
517
566
# The transAxes transform is used because the Text object
518
567
# rotates the text relative to the display coordinate system.
@@ -524,15 +573,29 @@ def draw(self, renderer):
524
573
dx , dy = (self .axes .transAxes .transform ([pep [0 :2 , 1 ]]) -
525
574
self .axes .transAxes .transform ([pep [0 :2 , 0 ]]))[0 ]
526
575
527
- # Draw labels
528
- self ._draw_labels (renderer , edgep1 , edgep2 , labeldeltas , dx , dy )
576
+ # Draw the lines
577
+ self .line .set_data (pep [0 ], pep [1 ])
578
+ self .line .draw (renderer )
579
+
580
+ # Draw ticks
581
+ self ._draw_ticks (renderer , edgep1 , centers , deltas , highs ,
582
+ deltas_per_point )
529
583
530
584
# Draw Offset text
531
- self ._draw_offset_text (renderer , edgep1 , edgep2 , labeldeltas , pep ,
532
- dx , dy )
585
+ self ._draw_offset_text (renderer , edgep1 , edgep2 , labeldeltas ,
586
+ centers , highs , pep , dx , dy )
533
587
534
- # Draw ticks
535
- self ._draw_ticks (renderer , edgep1 , deltas_per_point )
588
+ for edgep1 , edgep2 in zip (* self ._get_all_axis_line_edge_points (
589
+ minmax , maxmin , self ._label_position )):
590
+ # See comments above
591
+ pep = proj3d ._proj_trans_points ([edgep1 , edgep2 ], self .axes .M )
592
+ pep = np .asarray (pep )
593
+ dx , dy = (self .axes .transAxes .transform ([pep [0 :2 , 1 ]]) -
594
+ self .axes .transAxes .transform ([pep [0 :2 , 0 ]]))[0 ]
595
+
596
+ # Draw labels
597
+ self ._draw_labels (renderer , edgep1 , edgep2 , labeldeltas , centers ,
598
+ dx , dy )
536
599
537
600
renderer .close_group ('axis3d' )
538
601
self .stale = False
0 commit comments