Return the spine transform.
(self)
| 354 | return self._position |
| 355 | |
| 356 | def get_spine_transform(self): |
| 357 | """Return the spine transform.""" |
| 358 | self._ensure_position_is_set() |
| 359 | |
| 360 | position = self._position |
| 361 | if isinstance(position, str): |
| 362 | if position == 'center': |
| 363 | position = ('axes', 0.5) |
| 364 | elif position == 'zero': |
| 365 | position = ('data', 0) |
| 366 | assert len(position) == 2, 'position should be 2-tuple' |
| 367 | position_type, amount = position |
| 368 | _api.check_in_list(['axes', 'outward', 'data'], |
| 369 | position_type=position_type) |
| 370 | if self.spine_type in ['left', 'right']: |
| 371 | base_transform = self.axes.get_yaxis_transform(which='grid') |
| 372 | elif self.spine_type in ['top', 'bottom']: |
| 373 | base_transform = self.axes.get_xaxis_transform(which='grid') |
| 374 | else: |
| 375 | raise ValueError(f'unknown spine spine_type: {self.spine_type!r}') |
| 376 | |
| 377 | if position_type == 'outward': |
| 378 | if amount == 0: # short circuit commonest case |
| 379 | return base_transform |
| 380 | else: |
| 381 | offset_vec = {'left': (-1, 0), 'right': (1, 0), |
| 382 | 'bottom': (0, -1), 'top': (0, 1), |
| 383 | }[self.spine_type] |
| 384 | # calculate x and y offset in dots |
| 385 | offset_dots = amount * np.array(offset_vec) / 72 |
| 386 | return (base_transform |
| 387 | + mtransforms.ScaledTranslation( |
| 388 | *offset_dots, self.get_figure(root=False).dpi_scale_trans)) |
| 389 | elif position_type == 'axes': |
| 390 | if self.spine_type in ['left', 'right']: |
| 391 | # keep y unchanged, fix x at amount |
| 392 | return (mtransforms.Affine2D.from_values(0, 0, 0, 1, amount, 0) |
| 393 | + base_transform) |
| 394 | elif self.spine_type in ['bottom', 'top']: |
| 395 | # keep x unchanged, fix y at amount |
| 396 | return (mtransforms.Affine2D.from_values(1, 0, 0, 0, 0, amount) |
| 397 | + base_transform) |
| 398 | elif position_type == 'data': |
| 399 | if self.spine_type in ('right', 'top'): |
| 400 | # The right and top spines have a default position of 1 in |
| 401 | # axes coordinates. When specifying the position in data |
| 402 | # coordinates, we need to calculate the position relative to 0. |
| 403 | amount -= 1 |
| 404 | if self.spine_type in ('left', 'right'): |
| 405 | return mtransforms.blended_transform_factory( |
| 406 | mtransforms.Affine2D().translate(amount, 0) |
| 407 | + self.axes.transData, |
| 408 | self.axes.transData) |
| 409 | elif self.spine_type in ('bottom', 'top'): |
| 410 | return mtransforms.blended_transform_factory( |
| 411 | self.axes.transData, |
| 412 | mtransforms.Affine2D().translate(0, amount) |
| 413 | + self.axes.transData) |
no test coverage detected