From c44db77b9fb1318934767cfa01397ba6b81e30f7 Mon Sep 17 00:00:00 2001 From: Wiliam Date: Tue, 26 Nov 2024 19:24:26 +0100 Subject: [PATCH] Fix center of rotation with rotation_mode='anchor' --- lib/matplotlib/backends/backend_agg.py | 18 ++++++++++++++---- .../test_text/rotation_anchor.png | Bin 0 -> 15484 bytes lib/matplotlib/tests/test_text.py | 16 ++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_text/rotation_anchor.png diff --git a/lib/matplotlib/backends/backend_agg.py b/lib/matplotlib/backends/backend_agg.py index b435ae565ce4..f25b89e2b053 100644 --- a/lib/matplotlib/backends/backend_agg.py +++ b/lib/matplotlib/backends/backend_agg.py @@ -197,10 +197,20 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False, mtext=None): xo, yo = font.get_bitmap_offset() xo /= 64.0 yo /= 64.0 - xd = d * sin(radians(angle)) - yd = d * cos(radians(angle)) - x = round(x + xo + xd) - y = round(y + yo + yd) + + rad = radians(angle) + xd = d * sin(rad) + yd = d * cos(rad) + # Rotating the offset vector ensures text rotates around the anchor point. + # Without this, rotated text offsets incorrectly, causing a horizontal shift. + # Applying the 2D rotation matrix. + rotated_xo = xo * cos(rad) - yo * sin(rad) + rotated_yo = xo * sin(rad) + yo * cos(rad) + # Subtract rotated_yo to account for the inverted y-axis in computer graphics, + # compared to the mathematical convention. + x = round(x + rotated_xo + xd) + y = round(y - rotated_yo + yd) + self._renderer.draw_text_image(font, x, y + 1, angle, gc) def get_text_width_height_descent(self, s, prop, ismath): diff --git a/lib/matplotlib/tests/baseline_images/test_text/rotation_anchor.png b/lib/matplotlib/tests/baseline_images/test_text/rotation_anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..3dad1f9a19f754558bcaae58122536d4544bd710 GIT binary patch literal 15484 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

e-(#m58!y>EXEBxmOCkFyGfXFjdMYq~`*< z6WjNf@2x3a@_dzxJM|ldFxN`-l9a5g*FRV2tC>occ?1-)J1k=bCX*Nx>iNx|t@h3E zMW#dpd8n0*tlw0nn9;ut4mTu$fyfHz&=fnKJa~nay?DO0X%tV`42tke49HXI|INX{ znodkW@SCZbnSkYt7)JhDIr)z&XGS2D(Nlm(JlRy{-L--6Pj z1|{`}cok227M%XmqTGaVbsY~}u9aQY`u?8ot>+@5&H1k~OPUt8EP?t=jF=THtRK<6 z>^LJC{J*C@PEP6Hdi|q@w$53!p+o_BG*xE+I!gpe`XG?5(dyW=JqaBYBt_QS;R!<> z?{hw=b5m^8=KEDXG4(0gsr9@K))9%Wa3d+yU+YP98% z2Ral7yEdXgbM0N~;^3ahh12xSl+e)C20CmAZJidu02hwf!X78mM-%xJ4oCg8C_O2B zO946W_0g}XK5T0*-Esfox2d72S>SfG+#X|UdiG|#fWbKCT0RU5Yj>mGBiGqb0Cj(l z+IlOPh>#^nIf{{OptSTXrD2_qJLBSV{?DI?;Tqv%0ngmhW%JJ3^9vb~%xhfjD5Q5g z4$cf$erCj5Fogg&j$VD1cNcIlxmSaY0p5)Q&0MG`Am8ddP~I#!-%Jm|gBA7S71>~8 z-!$^t1~#;C9f%^nZ>`pyogZ;w?&Jb@O7!&=!!7G`+kE zH0|lJYfVtNxOY5;S3ua_Xa~Gv6-B5arr@+{am35 zms~L*fEEY)r)#Z= z>}S=TjfQg)&WUY$j*OWF3d{eYp+s`Ud8HPwR&%M{DW9cbImr5H^X-OJSc`Snmvp_^ z+HiF?ZWrIZlZ;$f{a!(j`lKI8$#k+Fznj5FPms)%*rD!4^_QD%-8nUbDTkLfZtqe& z+%8Tx$19}I7lBzg+k_xXNJzkGpt;zcIB9N8y0W9)V|?s)urTU8ryS`i)+J4eZh70- z1fCL2=x&Q-v^Ra4i(idOFzfa^KV0DIZhluSLio6wra)zfbx4W?s~4qX)#KP?MH@ATUqM;WYv54?EJDPNz`W8 zBvD3C#p$5<_3HlNV42g};k%k6Hmwv*S)Wxie&D^1Go|$YVt)%$jI6ia)pimmyBl-u zle@kZ(e{#(1HYb&Bpo`u!P~yEjURXG2O}bw4W-70z`Ww&2>5OY9()I~2{>yeFq;Vq zqC&GM45g@}m5JJ!`FgDWgf7{<_u-9utlBZ=@Pl0!RL8|vP?-eK@0{#zH CCYEdf literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_text.py b/lib/matplotlib/tests/test_text.py index 407d7a96be4d..906484c8a526 100644 --- a/lib/matplotlib/tests/test_text.py +++ b/lib/matplotlib/tests/test_text.py @@ -301,6 +301,22 @@ def test_alignment(): ax.set_yticks([]) +@image_comparison(baseline_images=['rotation_anchor.png'], style='mpl20', + remove_text=True) +def test_rotation_mode_anchor(): + fig, ax = plt.subplots() + + ax.plot([0, 1], lw=0) + ax.axvline(.5, linewidth=.5, color='.5') + ax.axhline(.5, linewidth=.5, color='.5') + + N = 4 + for r in range(N): + ax.text(.5, .5, 'pP', color=f'C{r}', size=100, + rotation=r/N*360, rotation_mode='anchor', + verticalalignment='center_baseline') + + @image_comparison(['axes_titles.png']) def test_axes_titles(): # Related to issue #3327