@@ -310,7 +310,7 @@ def set_rotation_mode(self, m):
310310 if m is None :
311311 m = "default"
312312 else :
313- _api .check_in_list (("anchor" , "default" ), rotation_mode = m )
313+ _api .check_in_list (("anchor" , "default" , "xtick" , "ytick" ), rotation_mode = m )
314314 self ._rotation_mode = m
315315 self .stale = True
316316
@@ -454,6 +454,12 @@ def _get_layout(self, renderer):
454454
455455 rotation_mode = self .get_rotation_mode ()
456456 if rotation_mode != "anchor" :
457+ if rotation_mode == 'xtick' :
458+ angle = self .get_rotation ()
459+ halign = self .ha_for_angle (angle )
460+ elif rotation_mode == 'ytick' :
461+ angle = self .get_rotation ()
462+ valign = self .va_for_angle (angle )
457463 # compute the text location in display coords and the offsets
458464 # necessary to align the bbox with that location
459465 if halign == 'center' :
@@ -1380,6 +1386,30 @@ def set_fontname(self, fontname):
13801386 """
13811387 self .set_fontfamily (fontname )
13821388
1389+ def ha_for_angle (self , angle ):
1390+ """
1391+ Determines horizontal alignment ('ha') based on the angle of rotation.
1392+ """
1393+ if (angle < 5 or 85 <= angle < 105 or 355 <= angle <= 360 or
1394+ 170 <= angle < 190 or 265 <= angle < 275 ):
1395+ return 'center'
1396+ elif 5 <= angle < 85 or 190 <= angle < 265 :
1397+ return 'right'
1398+ elif 105 <= angle < 170 or 275 <= angle < 355 :
1399+ return 'left'
1400+
1401+ def va_for_angle (self , angle ):
1402+ """
1403+ Determines vertical alignment ('va') based on the angle of rotation.
1404+ """
1405+ if (angle < 5 or 355 <= angle <= 360 or 170 <= angle < 190
1406+ or 85 <= angle < 105 or 265 <= angle < 275 ):
1407+ return 'center'
1408+ elif 190 <= angle < 265 or 5 <= angle < 85 :
1409+ return 'top'
1410+ elif 105 <= angle < 170 or 275 <= angle < 355 :
1411+ return 'baseline'
1412+
13831413
13841414class OffsetFrom :
13851415 """Callable helper class for working with `Annotation`."""
0 commit comments