From 162239fe7323831b71973d38c6b9e05855e0d8b8 Mon Sep 17 00:00:00 2001 From: Matt Shen Date: Tue, 20 Jan 2015 17:03:56 +0100 Subject: [PATCH] Fix negative annotations xycoords. Use top-right as translation reference point when xycoords are given in "point" or "pixel" and x or y are negative. Logic based on _get_xy_legacy removed in a65151be33b7b50fd9f40c72c5b3e965685cc13b. --- .../test_text/annotation_negative_coords.pdf | Bin 0 -> 7411 bytes .../test_text/annotation_negative_coords.png | Bin 0 -> 18308 bytes .../test_text/annotation_negative_coords.svg | 694 ++++++++++++++++++ lib/matplotlib/tests/test_text.py | 16 + lib/matplotlib/text.py | 23 +- 5 files changed, 727 insertions(+), 6 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.png create mode 100644 lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.svg diff --git a/lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.pdf b/lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e54d7738f739e5a09d8239456029e80041a54f3d GIT binary patch literal 7411 zcmb_B2|SeB+mxcg6{67cDobUVclH^itPzvF_-ip3TbMC3mbg&~DN2@Bl%z9P=wEw zP6C#IjgW;1ocvhc{=vQoRfyh_6D&YT*z*r|2q+j339y{U3FRVC6f-9TZ_W<$_hLIP z2gJaeGmjO_=dyV0V6TlLQHAiv#!yx;ArK0S!!z05{wz~Y1YjMar_iVfnM8y8R(=^qG`gy1a$fu!baFOD}@Y0D1w75E_p zXbnu+d;yQm3c^KX#<|p=z z#y^o}p>(+DDZi_A(G3^%uM(42e{UD-bW2gaN^$*1r)Cu1 zm1mw|mB;UlD|h{~sxMmSR_a^w+`RqHjhPym$ ztQs~oM`xBcD=Ssy8g1t~TiZjcDkb~qf|!&LgCKT;LBR5xndlSegSKK$^Z(PQ>R+<@ z&;C<4V}~|J63V-(6KEy<^%zj3D# zney`K0_K`^58Gouk{o#D-s<~KNf;|w+DuC_^Qh1NKKbjLi}T<<9QKak9f^4jbT0~t zAljt_xMzOF&4 z9w?UgddnykhO5`W&5`k1akIA4tAbY;fyj6`JM#AwP3x zJTvX!i^Vo77o@YR&L_UuyXmGJjhrtTnrw4Jw!PWU4R@a#I%HU}{82c?Xyzg3S4}f_ z&va1g{;Y0yG@)lj*Y8FP)z?I!mdXmxoEnzxDp_;--8$2czgG9Y}%R<3>WtnU6&gSg?oQ22v@q88J)uSEpj@_QC3u9yqIlA~qy4C6Tq=}X%nA!A* z>geQyA2w#Zi1;QR_?~Y#fiYk#{1wF$NTe}}XYMvps6wSCzln~^-drU9K3fpE;(Lr< z3blVqU()71@u-xMr_5_q^Gf7Doi4|0xYS*rHB~H(qynTL&vc%$+-pbHU~79$Z(di= z4Cc<)^87zaj|pfFi-Rh%ss}4K9qyRtQl^o$b*}rXZTbxw?<^+qTbqrEdSVP1%Ctfc|Tzw`uE~ z(_3b$k9TXdiEh$t%d2{}dfq3^B2(kteFyJ3-uk3mGNWGa?DBf~3wk&S2gN0WL~W({ zP4!JL4I)_kj3=L+zH*Urgk+l7)U%!IBhpvKRvM}iJLJ>$s7}|oe$Zwo(<*(5^;eze ze;>;r3!=4j_@ASA1v3J2?@B2luH~(g$8;9W)lgiLXjROspsm{8k+M4Vj<2Sc%Jg=v zB4%mj)5jU5+YanEozm^Pxmi$h>C0?e*Qe*U4J>9UH^(xwDFxenN_TmAS4DifVVf8i zU!`DwXj8_tllyl6@p#&TZ7UDComD)(nA5J#V{|K;3#roBzDxw=dn zf5)1?tToid>&%*6UVLvWs&ejI96u|@O0K8aW$tSy&(Or)cX`ZxHN=fd`Oodzh8$!j z1rI%_HYvT3l;zp2@bK0R4WsAe1!~$Yy7P7$+Nt@(-M*RpG)rH_Nhy14kSMIeljdOFh zTTUhGfo;gc_2Lin?-sjNBi8Zib(?ad(s9Z8H5+x5ZpfwO$p0PRd}L}ydEC*0=c!-k z{5c7oQkE3jBeP=5NwMos7N6L3Oza?5#P7Wb3@iIZ#~G z(Awp}Rn=OzS()bX(mz?1BIw+DTtCBf%Pq~f2YwHYdU@4OB_cqD7bYQZcGqKCz$Im- zYpK!Ul$GLLL(x_Jde3rF-`8ZTeOAltduvz{+^HQ9Hot+VL~JS{-0(@+ntMm#p&3^C9PvA=CMeXmZ(yK0xx&Nl~UT@SyW^Q0zJO_?!W$*OUdGc$kf zmAMs?VY7WEy+20Lja7L)d8rqU78w#@d;3ves0u|Qs%3+nk3CUmX2{)}Q=CFus}EG! z9Z!<(TT?GvT`vESJ?q$^jN3`u7BJNvt#V#z6_89)BytNKa+7D@itedhki~LY5Fqo< z8k@EjzG9s!*-*LAh>^E^b!P3|Thcm`->%%Rv~X4}G@7o!z1C*-EwlF-t)sEL8sT3B-`k}d272I-cr;;py7Javif`pL9P})* zn|&8wUFz(bv#LGUY#?r-qMVrCUt6YhUY$KOFf;#p%egpSRh0K6j}=Y9%Wj)Bs93p~ z$g}?0qxABa{n^0IHw%%~O{d~=1fJVv_lhmLS}2>iKmXB@gl!qAC+9Q{BprL}etm5s z%ii6+O(MeQ!SqKRdy?fzeGMuhZt@$JF6qg2Af9(nkz@M)KG05deBS`jHdeRSnEBS5 zYI|sOTkn6tUC^1`W+F}a5OQ{}UErtvi&pJBzM*fwBQqe6YiXp$d-umR7YaU)I{&0a}v!CX48HF2l zedxQ0+Z!KsD3x}9F!#$fpWC!ce#ye(ThB9<&Yk#r>VDDeY&oqcPU-ISd-w9UDK&*f z=9krb&1nkH{^!eAaec8Il?e>`s|g)}L>RMSEq2$+N~p`2y>aeTc&B1qkkFjn`u*%{ z^q`69pvip00aWVL`*+j_x861!t)hLWHWzwj=+3(o>9|U+Cne#^J0*L6)Zu2Fo9!Gk zR^9%Z>b=AZYMo`w*i(TS&ZlF;jHb$!onRMAMHd9IUg-|V+;CZU@s8}$6r0oG6)sm} zOr6kuKg&WGb6kM$eseb8i|5Z3aCitoSfjwNWCejwdsBab@Z)L~o5ykjH3&UNP7o^? zhlk}1CQHEc$I1-)C<+rE@E>^s>9%m!SA3>(3S zDA=fA)5EnCAh-|*fCY51XA&7Gf{rx`$dTYPg9i8o<5U6>2q>gW26QPzpcrtT!8r=( z=|EYq#~KmBQ86XJ9@58*1{DZ+0E)$wMFDFtrHGh=J?3eU5*farP(_e!C>rcR!|Vdd z2^)?wY_kzm!Uw>h5CsuP43<$KSAcWK5p)BQxkNoM8BW9qhJj22Kww`(_Msn);D=Cf z5OXGg3BHeDflQ$&4x1ZBz@Rb^QG<>k^a1DxV;iPx;1|#*Mm5YIpihVz<}1TK0sUcg zgM4A{00;C9QNtuhDM0UlSLg#1GzJ~m5Bdd&z@wYUCqz9|3a~p4>*4dLhS^#;4`D_c z^b2TJ*smRld7~3{5KCdA?1+Wa;X?gzfCf6nCSU+22y51&n2mk*gBm`J*udh#^)O%) zhtC-<0_=|sW1*dhmF$Pl0N@eW42<+dj5rR2ZQ?L-VE`o#(*`wnA>|*jZFI!81pXmJ z{bPRg(Q85!mitW*f+!yUxJJNx0pVfL#G4RAU?89lA08vO4I;2n;dPV(f6#@J41Wgw z7#x*D{}>bnXY3||6ADfoz@3f1H#{k^3kyehmmuUrc+2u*EpVg}GI%p^3n1|41e?QK zk%i_4M3g{52}B|RY(WZ12PJBwsP-c4s>M6h3tTHK3}OkmfgC}gzbC@=_CY*ZUK_wk z2tY7YAUhciLC~k@d$Yp`x`>}Zz%{_*f2`K$@O&4I(nti4?Sq3s0tdqF@DD^&3h+H2 zWMmAw8vG%_qA@Dq_op!u3e+|Zjzj`}Fm8+tcHK{7lnLO#Q8Nw>MXA7uWAULR8t|=g zV?^{P8Ylxq>2Yur6r332#>jLKEyjP78Z;! QRVodfteTn@c9yvR0*~YMLy6r&}j9@5GLBW7fqJV;cWEB-b1qCHYQi&1;B*!u*f*?7SN)Sl`l9P#? zL^6_;q~x68yt(MxH}t*ty}sl1`}0OSsz*@>XYak%x8^s$Ip^+27vyC&tYukCp-?u+ zo;j&Vq0sK4P*$j}ro(rFY;NDgzgAkEkiE1Tf1Fn9KE!{oxp_v-ib7$$M*c_hS}OVm zg|dqxd-C`tyO4oa$B=sK(CN`>L63(o-@m>ZM$bg^f$qyeCGoqy8ChASgQ8*HasuY+ z%$kurjFGa&MnQg2Q7^Z>>dCdIoT?bR%M-cU?$}ehmn${9BAy)jU1OTPtui;|Q^%v( z3QARP=ZDT0?fvuFJ>$W#MSHau656eOOS>&aa968d8}`#sC~g}bQ1Gv{dynDkkE=IQ zD1RPWv64dh{pmm8+x60XIU^?+q!valsi;IdP7m34`>HfML~zLJsWajp;xutDGCQp= zr8QoEqH*)Xs$Y#sI%%yo-_qC)$SQLCmvyJHt)Ng;9hauk^Yx-bZA$U?RxK7qsgp;~ zXRN?q^*_5&6V*Lh#IE3-GxOugb}1L9v=+;tm3mhjF%gRm0UrC!&bGVLWxp=QHZg_HK+dNT9{h!da#g~zfJvq6#RE3EOpVI(!mZCmta`eJvWLx_oGL>^0tJngdn!YN z4Z@v;`0^JlMQw*dw#XlSVNpdxzr$<1QjAY(uG(`fyM2*Yb}W%Pml!B&ZB*#7b3Una z@1|W8%G)-hUlsByn%0+vzL}(Ol*o$>K3~V1u`4lWOfJms$D=}ttr|CvOHya6dLw+~ z$)b;UvQv-thT3Y8Z@Rt=Y@sEK|9an9Ki!Xa*PO4vzkYjip^m7{KmZLb-4Qj`BZe1H zXHn+@y=fVa?vho!c=1`1PEk};6em}h-F3PREYHWQq^Mh}4x;R??i6&K8mO(WkGjMy zm>_}WF&2+9Zb+!8fAi*zH^*6jUen~ZT*qmX{KYA?96JjJiHR?qQoWsH%m+~$GIh1J zy0c^5YH22Fo#6_ub2Y}|`b!J5YN6dO2l%6h6v%TUCm1k>_I&8+hwPoo^>A zE;U+CYQ6s2PSIP2W4(9cG&1?8+g)9KQn58+k&650hx1)Kn`cHltttc?x*kX^TqFBE zkoL_iCO*C*S+7j8I){9M(5{_gHsvGVKaCgf_0+}HGbiiSt!BIZdq+MoDh#*f`s7SI zvwyn3q0DQyH2?L_4^5IwI5Rsv#Q5>#PW|fbb0?+RCCJXO8U1o`H%)8eY@ctNww$Pz zG5Ga0a=)+Kc5%C#X1SB~9K+6*^(9>4A*H3IPuV20Ml)O%=em>2c*~>~YoxlrNHbP^ zc_A&;rjhp$XIW@Hxn`%QRM_0y+(GrUgQQxrYzBkaBpiMdx^sYBk*4`p&G}&G9p;;s zH}$tdCj4UKu^lcm-( zpR7}{`mkzi*PGacQY`KK3s2Yi!E~j|mwk;BbJLij4{H4dF8W`oXgdo|PEKwYvoY}y z8_Mu>a>DWO-gh?HX?9FGAYqW;mugwm`Cz{yc2{xPu^&(P^cQAEn=H$CQik*9^_$<_ zPaDsc6^TZ`jxuE>vvds!MDY+&{KW|qxEij&Q09)f!hLrZb89~tf{T7Ju?5gg<+?tZeMK-51WAN(n8#oRBk3FD%IoR@{#T2 zx)z_fviQLTZS8P^a^`un`gtSw_#$LH+1TeA$?kR*x|fZ0m!(um&UejpdRCogHLZPI zvx0Kr9X{A8V)1}VLiyr!d-z^Y@nnlZV5fY{rP8JO;c$*7U7z!c+`jeM2llMc-O$(H zKOR`+#QB7oN6s6!{&c%Qk2HPpy{%dSPx$hVIu0bskd~rh+iIQpD=K)5obXO}VY7;A z8j4{NfxPdZ9vGxl2%V)aEsnpZW$YR&X_##J(rc{`zVpyUWG93o;x;7U1!nc_BO)cE$A{laLG5;jP$%&)uKUt7K* zK~w7Mw}l411h;qIkG60{xl)(T|JW-_$H*3vzciUhij?&{9p#u~5*AYby&DbdIVX-4 z5p}f<4bfRySxs~E#yH&t45+?Ax8N`8$EBsE+t49R@@9J~*uGtV!sE?ho;#_WQq*SG z=`KF;MLH%Sp)xAithvu>1!bg~9N!d!s!H5@w+XHJ=olm?xS&kbKt2$SC;}gV>P-kdSi$hjycc zXIpwD)0=fXMS22W7Ml34JaeGY@Rj>l)ayZwjJHiX>zEIo@is}VQ?6ihqzR^8afJm)I?r`I6{sx6 zQUpmYje5Gb(~jL?U)V*O$XLf6#4AZC+H45e}+Mpd| zLw$XHGpE}eS*O?UIC@BG;X9*Mt93(ny}EhD8mXl<;8!RpJ6VMIIGD3ZAfj`axD)!DY-R1ZOgHw2(EW+fTh` zzMbjDoT2D1=CrL@h#0ColqnzowRT<_R6?_$4N{qhuhhCzA2;q3zY=TavBpr!8t zMpOb_Nwc09Y84AMNtQK!S|a);EiElx=FekV!yBF~*PNLYIeqvkPGb1vM#j{qDioFCe& z_RjDkS&adl>e*>m>U0REiOiobpNx_H<_WK!I|Y*TwrzgEKq~mKPGOgA{=6nLuSS4H zXJL1&_M*`f_Vp8_HxQ-DCZw5dQz5nRN$SYZb|DkhHefbs6sQG%4NKX% z>EUp2x4coFg(HM9sSYpVuNgGR<13fh6J%^TULkCd zJ(yP3D@C2n0Ta!nF3pqTQ87v70ed!xjY+8Zvu%gZg-c2hGReZil8ja#_44H& zA1(!X?;Yruv+1t$>H0;3*f6zZUD?>MvMhPBI>&$am1{ChZdF-3R z`Xzdr6_oc5H_)i;`{UD_$#)24{lZ%wCL!i2wPdH|JXuE=_jZgWpnTz+jy+Z3;RFcC zcb3Mbr~+UUXVGo)CL;Ot(3srk!<@!S%EP6kK+$XpJ=w!Keu0QFi2nR@kHVw6jk`dk zGRfW!Qj1a1tnNu2m`08{)LsuU)l4xaCX6FzMqSM}ItYn*Y{bNw8vKph>{0 zx3a=EZ#?uViy-%28IN<`8kQyd>_-c>`f#)_^a%TKNH|OsW8<|JN~-UsU!|dZ>2a9s z^CdheF@MQ{Qz0w_bLukbC!?VZn|(ynQh#E;q=LlcB{Fk0XgTr_Mo|gGJQv8nPj(pq zZhbkv{m|88J>`Kum?j^3+MFPZ)Z;KU(A33qN!Ai8)2kFdcZu^{z!wuLfV?duAKMDf zZ4DA*g`(QZ&&M84Zsp1a_DCM{DpJe7L>JelWEm zXn+q}jwK9=v+l3w0Rb|~S#e^1-!TXbJ$6JvCzt@LB$wx|dtS8u9A4O-JJX|fqUh(qO z6Xp3G7(x|%T*DzDEKNj9>3#Y0xVteK@xDf$Z5W$yQUo=36Pj+SauL!gd|EQ>GM!Bh z5TT?h`EzxEdi&IQcDs&0G;Esm$U^Yn_!>bbT#U8n69RxnT|lc+GOZGFLH6xp^d}a( zb<7ls>5zfcyqX7C#tzHk-TVE^ezjy;p>o2zxTI!fQ*r?g4H{PG2|IkcLxdmy`OQ4v zc_^Q{bPI!~MY|MrT&lNVt9JRStr}j0!UL5n4kYF%cHKx~S-$TE0HQc`VSIKxoEier zA&2NZ=gdGcEXo`{x|w>W4{x_yO`g2d%76M&JW)n3em1sa4{oQ4?W z4X)oqj#GrJ4;dOryEGP``g)eH0z*{*v>?#euoCDCeuRmlh}-At)7Og9QYeP5E6=Pu z?a3B;|Neb~kW5U&i$Nd+iogoY{CkNWG}`E|<*+|g)Vfq^sZ&ZQ;j)TKua`7K$yvVK z+P)N8@UDHwt{k%X@fm_&q;|f``FeWHAWR38b-zZ)^00lwkU$m#BcD<7QhNR(56-`O zZ23C0y%jWHZ$m7BU@5Ggn2;c!sUh#|?EIu?sVslttWEQc=pEo-+l9?E*nl)47KPgb z#qBN0l&u`XLZLJZhu^Ndo!;hf00+W6Ew6xC{fK0nH|exw9=Ol2bD5&ZDypdkmht6_ zKVWk(>|ehg*QMaP&~zX{C6hVG*O!OdNBR!YCZr!QR6N|YHyNWHK}kY&1q>=f2)Gz8 zH0?e8^bE$zptw2!Oj_EMPRJSxg!%6I7M(e6|%;c`1 zGel)&i2}i7V=l>gV^-mEoh{S0th=nDH#73R>Dq&xSHzb}4#~LZesaESQE_&7seoHrhQdAjmc<gj$yF4?L`MS{|d+xlmC-AaD4x#tM#PPikLKOM(c!fsV(nysbXXy1dRq8J(o3 zfTt5(r8nHw1xo3=Lgz@un9(O|+ij~)ZH*)y5|bT{jSpH4NH^IqBCS?OgWL?Bj?v%+ zNqIPBhB1b)NYZX+4(G5J67{z!#lWB`S&y){uQ;xPL$1`QDD?UI^FQ&sUR165E)AO5 zjp$p?px8Neb)peFk3+s+5FYwhGV~9Z?f)U#|35$Ee`=~IHPzF;v#p6bUxpbg@YEA# zy()?6a-#Lhhl)DC)?sB~8AJQ!t`Z+Vr<|Y>2&GX1lZb0Lemv7Rnt-{iTil1A)vv5T zee{cV+Me@dlOV%DZ(nR;<>yCR$PAD$+NhSIzbq7!F_dUg(4T}`Zz+YjF3q;w{Ip?J zC}{ROz7-Lx#(OHtwi|>z1I_CSa~zUAb?Q`D9|wn z2tcf|5u++0cr`We1=eH(Ylw^pFx2m_tE&T}GIlyp_k6z+8C>+c zik~$(^vBnvo3|5{Vz$V2L1s7T3ta{7*$(r>S6C1F{X|Rc?BpRQILu}47v|c%1kiDs z1IZZR*gmi22Mos7sm(3uhhb~Hm@g?S>vxy>R@Ap^$Htk=s;EFgz%PlB#U_KsKKtRN zXZdKQe^7XaeL%R#vv05(z83=^qJ&?q)0xS-@30>kggaKZy@Gym+}%CiYlw}^w#$n z*($Xh2kTC6iDz%2{dzmkc|IyHPx63roMH0P$8~%Wm$)O%+w;&d6Sec9jp859epb_W z7cqb1pV)GAuE9{;2wH_7+G`iw5#wYRFateo=GpV-&wJ~R{wN>{fAD|^6!#S9LKs=M zoUdnho~R~5u@2lW>AmRIw|;&h9q7{o#wt`(2r1GKtI84(2+O6}Ug06J@p6F_Xh=e{ zw_=s#MfQ;)36DAn)tfd@#7aLQtM3g_HDkhN=)J2d)!y6v|(+0AnQ(7;0o3 zJfN3#LFAH~9%{Avyh-NW*9bzdGgl$iy$~ ztyNN}fb8&z==79kDbPwH77(qHc#l>+<>C;z0*~BKByJ6HPo$-)_W5ggFIz!Zj4wfF zG5}YExhT3}!v->`adWrL3&LiNfM8|YVj%;doBN|`6lA_zMr!V&%hGtb0dYhIpMjgT zf|~^#wYZJ}<10Xev;W^=wIG`|um5;zqB9Ry$juXQfop?akx5b7?cJY%9e{I1eQazj zBudx{`GuW{P_y6-^x`ZTN3H=-v;rtbpxf%9sr?(fCf+#Y@-k1?g-&8P)#+n8w|4jZ zZhBl#PYc~J0(WdT4Ro+B-cMXpxk$yisln{#PG+7f&p|7p%ceK!5Utola_*;w-S>N$ z9kIjxM>t9#SC4}N2uZp?J|^aP#S-Ql z1L*aYtmZjM%}2p}H~ewnFQl3X3+ve>#Y4qx<*ULZte{@#gH&fiI%HWU)x>>e=FAw8bx=3U)Jy4&ef|0j78|?%SbPI+Nd-e3iBvpgmy!e%(I7J+_%U44o`vzMD!7jI z8Hw=wT`qp7hrJyy$cs40mX*aU1K7!B;6ww^gNXbK9J#Y-B+vXWQgS)HWJ5SKnR=Ej zFz&bi8;(}j>rhZiRfIYJQ$YCtNj)J7hxLbdH)<>aar!6;lFqRjE8&V(ik3%I1ac#Y zp*=Y77@g{2?!bCt zmv55Uk>tlo!1D=3?G8~fh;5uQ3H$Hm=qO`9Q5B(Y`;bT#fJ)O?0O+0dxo9NeKLRb| zbbm0sUUKGl+O{0FZL{yCA7Y29lm%X^8;>@UnwrYq*GoegDFNvJ4XstX6OV*dDtmhN z)epA|i=>Kk?8o`-MmkJ#Mhl7mC0TozOxy@j%v96UQLe_TwQ5ro!o)=!2UAs8&%bjS zVU8302@L`dmvX(}G3UR>)56YnSjR+JRm*d-cNq_E*CpC-g~eZ5m+{}FN)YrT4vcxu z=xOp1B$aTl06O*W&~J1LOz`5OQCW!WDJ)JRFxxCm0~yg zgSdjSmIRg|;msBb=RJdPznmuPTp}?bl8&p6hAd_(kJ%0xhv&qc!^}jIM2hh8Af<(1 za1$APSHm*x3qsAu?bHq(jPwi`|1X-xU8YjPnINm0c&#j^|35KTPGk7Xe3s|H0=QOt zF~;D@hB`6ADHQ(`SpO?oIxd||a@~zOo~HeWk%2K^x%ytl#MiT=Z8FaZv|}J!XmDLr zc_Foh;wBht(ofTPNPMbM=U08adgam1r_9skAtD0E-JB%AfK8!`w=8Aa(@W+oBc86 zg=WU$)Hi~a1`y9mV8{g%WFnb^F+S=T-)yy~OKrw5F)QUoe?>U;inW&z7Den?A_Xpo z2WNjNxCYfINJ+?A;vnlmze2;F?GerocNlj{>RYZg|!NP z_b;1mo6hrRU+AEp)u#5lb_;~hp7U80Zg;XGk2TR(cVIYYT%ORG1z2!aB!!|+L}gqn zl;k2|GTV3jLErr2IjV8PwA&YM=m#uR_&wr8O?-1XHYiRQPW{j@4!ckK1yn!bMNK9t z6~yq;uOgE)xr}Tw-1*)hSS#%hL%z@ zU;x!R-o_LXfbsB2JbM4i)yA5LtXg6ph1Eci)dwBM+7{Vh^O?#^Ox7+e^h%j)Xe00l zwLoQFfJ8%)=QyJ7NHtYM+fo>!c~Oyz$b7ot!QZS@Y_ z208MCxC9Za};@3BGc-AGfl5JPQR0&8Z?$jn2zrAuuzA)i0lu?Bbd-%>VyLI zQrCVY8d&hi8yOMvV__d|&v(U0{tS*p6t)n#Tv-rRQgwAh?C?XEuzChilGQRT_2wq~ z{ozOIDv;r;-FZ4b)e0uG&z4>9SfK+n;lZUQmhb~JoAS_4S#wswF~H1tEtHHpaN{gf z+i6!&j?MS-sKzOgcCMsULwM=P;Y^ZN{#TFd-D4p15wd^ko-~wWVx4RouM`k7grtBl zsu@~T5pIFdmu_2*{a>Bu2|P+k7~ISrJaE}o($w^iHe zFs2Y&k_IcBL<8m`xkJgx7zI6~e2l3lX(%&iG-zI&Z$adMJlA;Zu!}IYm%0#6JQrGe zhH_lvn{GR?Hg{Nj-h@2G*)bB6BdXWZVEYn}prByp(p*35v^82-bhwKHSyIIK-dHSt zYhSYQ5bb-7v-z8i87lCc+ZRq`hrA%6OA=ABtHft~u0OGti~>w58qY{(sbZ=f?8ts7 zvzOm~tSbka{C0lbGxr(U!;oUAlJ!Ptjh|ec^L)^A5>{R|wKc5kE@zH>Tu0KK%nmNt zlrS7WL;P7F2^*3s1XRG}X-_l{re^5vi} zl+_9dip?3lh-{Pt9a}XVenpZ16I_JouH|o{_>{#_9g=IO-9{dr4>?L|_{yLT;z6bh zy(m-itRy_>-Q}llR+8v48CxDCcmVJL0rG~SVKFE{eU}LC21;o@r!jaCF)`56K@k zlVzNQsKN&cN|o)3YWsZyxE*LZ@8CZ)yhyLi3v@PHaX@b1rt6p0L%$q zxjJ0+Z!pIjMu-MTmI%^Ng=R)OpIzw!{} zM)JyhIqwD9vycIu`u&w2wvB725y{kt`B9M|zcAO3uQgcbi2)IfA-bg5M?o@hcDz^E zzP|zFZwv@5=sIod>QChEDkA!kpRwP zc~vwlP7x5?fzSm>Z^JJnU4UcuJELm=BJg{#(CTSz4*eV@B(p~p9TW$&PreCUM^%C} zJCf}clx)Mc5VZ$}-#NJP#PWi~umkF8Y^&7O_ihV_)Ky~PQ!KkniCSI~t?rCAt~OXS zSdW+ioW~_yE?TU4O~Q&U;<=J?Cg~kKR24$_;b56j@kK9vFI~E%JKbta{W56(KD+n;!kQ;8L;#vII5 zm!qG;PAj`_??5Z;_K_F8k?QG;v=ASJ|6GlW7cUMWMrRMbru=Qo#mYL!Z7st@s)e~O7{@pyaPPrSCS5gkD*Dn$A zb5Dt3Od@5$W?468AMW+|JrOoD`FN$MbNg+yax)DoHyYLB=&2D z>|$Y&HdZW7HE9n~u}F#u@9ylA?MycrMz5L08zun&02opSAySqgZA{pJ>pXwWJii}2>^!llZdh2X`J4M zcXDp$&=AOKcZOF8eLF~+FW$fTX0nLGG55Z=AKMJ`-k;N$5Ffn5fI_{}`J3Y3*inGrs80UH_WFY`d95 zZND*0wPj`3j9qyKoq%Py%1&ETv(>0U>M72%AkrANW}Q_=8<4Ig+$m*px`F$E3N_Zz zb+L1Y7(yQ$B~VXhp7rXrrh@9EPOko~xSs?smk)v;@xBq7GwwfJFFV+Ww0E*@3DtDC z?aoW?_M>jDRcc*(9^O9K%>Br+g6VJy-3H5?7gxJp>#p^Pyk%kd)k4vvG(tbFUifX8y#CR zqsjF5->Rsn=;iBsZ)D`A6K1pG^7504ikokV?sTK~nS-;sOH7PaG?YP0OKbJIb^Vq+ zr)_^uI&^h+e=reJXU?Z(wCVEZSmThp#9rj*?{E9q-`DrJpB^r3D^gii#aL2OBGi5M zB>wbu_%iB+TxV@#@aC}I&bW5%M>wR1bPCt6XA|Fs_a``i{P^MZ?Af)+oPhz8)w{hy zLY~gd*p=1ir9JfYe9&Za+QlXBvN#_fBW~u|vu6~y`}gTIavf4@8UgXKtH!2>+htr_ zBwxOI^?h*A)Jlt7^Q0%g>_mNDstqzeCP=mY84Oa}p+g}58y~*)E{p$F&YrB!@^vuXO zx_UQu&jYVBw;ZEcNN)(3(a_u$W5{?r*w z8jI(6%x&(c@7}$un)Y=t;ql|O0p~bd@?F^x9lBd>h=*N?Zn089p~@_`5JTgI3l}Ip zC3g+N?CJ2iUks0=g{+O~LVUk5-CWzVkLT`tc#sx-wfkY*UK{E75OCziW-Q+2(jXJP zv$@naFJG>RmJhw1pD(p}^X7r)`zPu4O`6@f@d0sk3oz<;sj0g`pJ4^8fOx3i8&{&7 zR-c`lyVKs@{&yapQ&v_2Cr+HeF1B>XuPV0Rww~^{ty?>XTC)Sh?fJo)+XjDF)b=6KZArCW{6k>XUXlAL7w&T{>f zZ6cNtUL3Me{o6d6ycOm8Ob=~4X=wP`OHXYjJ^d4$f$!hH?}mvb_%EM3H|KyI-L0#} z4B7QLIfx?@6TeAHO8!9qzqH@6?-6*)I&E!jTpb@=oO}@aL(SkQp6zLk@Gj3RBr4Z1 zGBQ5%^12#$($CLtt*x!?D3V4CosBSM*UEZ-#=NihsJpj!9lp-8?jHyeZaOWS>(8gn zOWxU2KKm5ab2fi{MGpAp$sjBrPF<0n)8aNuWt|M4KiGoKaUTEoW$gHHXJmX_T0>(83oEMyUUO^7b!=$c@3TU#Z|COC zw|jc@apYoWd=IE>+_A&N->JmnsCK`I&@LPOL))@)wqL(`b=TdEhqkR3avwY@UwKM4 zH#^z5ffr}P;$pIo;+0_@^|bd_4_(Dujy9!U4nE!v{(gQq(kqZ~y&oRVKH(tY z^IfCuip;Ly>wZg(vuD>`QCI)o-Cft2)O8f6@j!QXw`!^p6GqazpFe-rDtqSO>Fv-^ zUw^$KND%mjAUW-T-`+{KeUm~g?nkY9)jnWpnk^3fWy3 z{(!-^M@Wd7vT^(NM^OK-eoHgWxbK+@Rn;pkm@|?4k79eW+b!t`{9vPXMO1p7T#3O!kDFs7` zPU-XgKT#|mY!aoSVu#iH7ZLI3!12OcWVCo)Z)L{^2QM6|jEsy9@UYd4j54aK0gK+z zY)WIZQz#%!&7D|eT_z;5S<+0u-G@k>LSw;?9Yv&kB^}*$?2s478p;SHlRu-P=(L?i zSNZX2d%*i>=CV*^>NQUL&azRgrhgK}bSSt&c@)m&8Sj<3T2xP+va&L z@k8v@)zxIZscSBH{vKnCpTey_2C)9d#5DPHD7I@`TD>F6X$DHIn8XTN+QVioN1+_; z<>5JBXZ7L%me>XTxVo*)19_k;1xS)Rp7GY*ezsCtHg|Dx(EO`SD3(qw1!O8+X0C5}#qwdH^j$X?6RG8sUQX{2a#w)1@27o*e@i49LM-aZ6SK0-8gwfpJ4$o=oI5S`d4 z*SCnI#2O$slJ}?d^`q)K0Vy6wcRH*FBCj2${n7Hg_M0yMqd))Lb=Ya<=0#Q2-(40b zRg!MhaDMOW<3?-!>*qjjSPNJLY#+qpozl~bY|OBDg{t(l!<@0xLbP^6Q&ZC(0Rbfl z%o=Egeh1aA&$10=Y~R;wocrkp>qegvj$5Lk+oW7_ic3p3gWztesHpIeFXM!Evxl3T z^Z*Xo&A{V55)!R_BI~yD{>I`SRkJcOBSZD>y?bhfQ^W1rU@X!F12NGi@#*2=;a+-~ zW%OK;m1j$O=M!(=xl?d=&6a@xp8b&#ZD>$wEV0#wp8?uzbJW{Ais~KG)6yOb8rQE@ zP*5mS#ls*={X0tH&6wH+TZC*o%<~@v2L;^)P)st*t}a>_xrGESpr0K=WVX1Lvhsa| zjymz4IyH!=A71^{BP^RXZ@%6X6rT-by2>B8k&TT(SXfw0?@X?&Z0@h>PYzVqi;BZR zK`dnoLkkNF1J8F)a;o>YHa9=+>oWr7)xq0|=-BUc{JPcyy4fBG?y|73z^2YX-xJ$; zfS0!rmmEb-<@+m7$rB(^h<)6Jg!>{RV;h#w4sV@U%#2(Mk#c3b63_hT(Iaq-q?|$p zsl~f!nzxL!FnhyDU4{3en4!rBv{v~%B!8BQ_NRZZC@+6^a1PGd7I2wE)_s?B_4KZ_ zW?AEquLc3eEWc^nwufl2*AWXjidS{@qW^$buy^-vnsBGFM|y`1K%+1RF?1aFkzOXW zeU_z~Z_~`%J#uoyDTqDOUjU}Y#T_gofPseCl3_u+Z{NO*o8MPZ$UAO+z3^|gfM0#W zJ931#QQqVK7U06=%l8l)1e8h_2oR3BXV0+$x`@cgg0Vw^=M2rwWgH!|FXu!?M%H8` zxa{VX-7I9@wq8X=g>uZ$@b|A@zh2PLFu8G>(g7=ku#lvyA6Ae@>#Yn`&3BQ&L~NSB zWgq$2m-&%$w3c%dH|*@}RN0UuDZp|+3l9FazpXB>$+a6?deh$1ss-1tU*C22ZS$R` zx;iGj;8EbtDm((A{Yt{)jf7G^(|Mgt#{s^XZ8Mns*c3en6xnWZvLXHlj9%xT{fqWV zv)Vcc^eK;GW_jP<&W@tT;4plxXL;RfgD>4U1`Md1TThum;yUZ8Z4p!&u>$Z)efvZy zWC05*f`t#8HXp$FW?&c^b=~3_Ffe+)v+GvxQUj zdS+&3W3Hnx*5@fGh;(e-b-Y_-Xli;{OpiSOp4&dcyIgIbZ06(Ri-?Hm029ivALry3 z5O@|C_$VTR1K>?@`*8J`kr6i;5b$d0E4&a;Tv1T~fpHXXNWHdaS$={EZFzfkufGmY zC*oaY#Jq`SZJ|3cy4SKQA};+F!qZol#JbF)=xKT}S7# z$nrq3$Km}o+Y{+^c){tSlF}V-@6AVqgkB~mZ$^RB(9n3uyDwKT+sBwhH}R*K5Frip z|2(q%&DX&p4jWdJMcK5NEpDlDZ1a{a*N(9445eHCUQ@?2by}Pv{PE;nTKQ!8cP@RR gyZis;7vt;)K8y%I?_K+Vff^8f$< literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.svg b/lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.svg new file mode 100644 index 000000000000..100993c9eded --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_text/annotation_negative_coords.svg @@ -0,0 +1,694 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_text.py b/lib/matplotlib/tests/test_text.py index f82ab5142d62..eecb65621b5c 100644 --- a/lib/matplotlib/tests/test_text.py +++ b/lib/matplotlib/tests/test_text.py @@ -284,3 +284,19 @@ def test_bbox_clipping(): plt.text(0.9, 0.2, 'Is bbox clipped?', backgroundcolor='r', clip_on=True) t = plt.text(0.9, 0.5, 'Is fancy bbox clipped?', clip_on=True) t.set_bbox({"boxstyle": "round, pad=0.1"}) + + +@image_comparison(baseline_images=['annotation_negative_coords']) +def test_annotation_negative_coords(): + fig = plt.figure() + ax = plt.subplot( 1, 1, 1 ) + + ax.annotate("+fpt", (15, 40), xycoords="figure points") + ax.annotate("+fpx", (25, 30), xycoords="figure pixels") + ax.annotate("+apt", (35, 20), xycoords="axes points") + ax.annotate("+apx", (45, 10), xycoords="axes pixels") + + ax.annotate("-fpt", (-55, -40), xycoords="figure points") + ax.annotate("-fpx", (-45, -30), xycoords="figure pixels") + ax.annotate("-apt", (-35, -20), xycoords="axes points") + ax.annotate("-apx", (-25, -10), xycoords="axes pixels") diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 1b86d4597801..e1a43c64d43e 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -1531,17 +1531,17 @@ def _get_xy(self, renderer, x, y, s): if s2 == 'data': y = float(self.convert_yunits(y)) - tr = self._get_xy_transform(renderer, s) + tr = self._get_xy_transform(renderer, (x, y), s) x1, y1 = tr.transform_point((x, y)) return x1, y1 - def _get_xy_transform(self, renderer, s): + def _get_xy_transform(self, renderer, xy, s): if isinstance(s, tuple): s1, s2 = s from matplotlib.transforms import blended_transform_factory - tr1 = self._get_xy_transform(renderer, s1) - tr2 = self._get_xy_transform(renderer, s2) + tr1 = self._get_xy_transform(renderer, xy, s1) + tr2 = self._get_xy_transform(renderer, xy, s2) tr = blended_transform_factory(tr1, tr2) return tr @@ -1590,7 +1590,17 @@ def _get_xy_transform(self, renderer, s): # bbox0 = self._get_bbox(renderer, bbox) if bbox0 is not None: - xy0 = bbox0.bounds[:2] + x, y = xy + bounds = bbox0.extents + if x < 0: + x0 = bounds[2] + else: + x0 = bounds[0] + if y < 0: + y0 = bounds[3] + else: + y0 = bounds[1] + xy0 = (x0, y0) elif bbox_name == "offset": xy0 = self._get_ref_xy(renderer) @@ -1950,7 +1960,8 @@ def _update_position_xytext(self, renderer, xy_pixel): patch. """ # generate transformation, - self.set_transform(self._get_xy_transform(renderer, self.anncoords)) + self.set_transform(self._get_xy_transform( + renderer, self.xy, self.anncoords)) ox0, oy0 = self._get_xy_display() ox1, oy1 = xy_pixel