8000 Separate out 3D axis label and ticks positions · matplotlib/matplotlib@823adeb · GitHub
[go: up one dir, main page]

Skip to content

Commit 823adeb

Browse files
Separate out 3D axis label and ticks positions
1 parent 7be6747 commit 823adeb

File tree

1 file changed

+98
-35
lines changed

1 file changed

+98
-35
lines changed

lib/mpl_toolkits/mplot3d/axis3d.py

Lines changed: 98 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ def __init__(self, *args, **kwargs):
7676

7777
name = self.axis_name
7878

79-
self.position = 'auto'
79+
self._label_position = 'default'
80+
self._tick_position = 'default'
8081

8182
# This is a temporary member variable.
8283
# Do not depend on this existing in future releases!
@@ -185,6 +186,54 @@ def get_minor_ticks(self, numticks=None):
185186
obj.set_transform(self.axes.transData)
186187
return ticks
187188

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+
188237
def set_pane_color(self, color, alpha=None):
189238
"""
190239
Set pane color.
@@ -262,7 +311,7 @@ def _get_axis_line_edge_points(self, minmax, maxmin, position=None):
262311
# When changing vertical axis some of the axes has to be
263312
# moved to the other plane so it looks the same as if the z-axis
264313
# 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
266315
mb_rev = mb[::-1]
267316
mm = [[mb, mb_rev, mb_rev], [mb_rev, mb_rev, mb], [mb, mb, mb]]
268317
mm = mm[self.axes._vertical_axis][self._axinfo["i"]]
@@ -283,6 +332,25 @@ def _get_axis_line_edge_points(self, minmax, maxmin, position=None):
283332

284333
return edge_point_0, edge_point_1
285334

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+
286354
def _get_tickdir(self):
287355
"""
288356
Get the direction of the tick.
@@ -337,8 +405,8 @@ def _axmask(self):
337405
return axmask
338406

339407

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):
342410
ticks = self._update_ticks()
343411
info = self._axinfo
344412
index = info["i"]
@@ -378,10 +446,8 @@ def _draw_ticks(self, renderer, edgep1, deltas_per_point):
378446
tick.draw(renderer)
379447

380448

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):
385451
# Get general axis information:
386452
info = self._axinfo
387453
index = info["i"]
@@ -451,9 +517,9 @@ def _draw_offset_text(self, renderer, edgep1, edgep2, labeldeltas, pep,
451517
self.offsetText.draw(renderer)
452518

453519

454-
def _draw_labels(self, renderer, edgep1, edgep2, labeldeltas, dx, dy):
520+
def _draw_labels(self, renderer, edgep1, edgep2, labeldeltas, centers,
521+
dx, dy):
455522
info = self._axinfo
456-
mins, maxs, centers, deltas, tc, highs = self._get_coord_info(renderer)
457523

458524
# Draw labels
459525
lxyz = 0.5 * (edgep1 + edgep2)
@@ -488,31 +554,14 @@ def draw(self, renderer):
488554
(self.labelpad + default_offset) * deltas_per_point * deltas)
489555

490556
# Determine edge points for the axis lines
491-
edgep1s = []
492-
edgep2s = []
493557
minmax = np.where(highs, maxs, mins) # "origin" point
494558
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)
508559

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)):
511562
# Project the edge points along the current position
512563
pep = proj3d._proj_trans_points([edgep1, edgep2], self.axes.M)
513564
pep = np.asarray(pep)
514-
self.line.set_data(pep[0], pep[1])
515-
self.line.draw(renderer)
516565

517566
# The transAxes transform is used because the Text object
518567
# rotates the text relative to the display coordinate system.
@@ -524,15 +573,29 @@ def draw(self, renderer):
524573
dx, dy = (self.axes.transAxes.transform([pep[0:2, 1]]) -
525574
self.axes.transAxes.transform([pep[0:2, 0]]))[0]
526575

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)
529583

530584
# 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)
533587

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)
536599

537600
renderer.close_group('axis3d')
538601
self.stale = False

0 commit comments

Comments
 (0)
0