From d497f85283f4b91a6fe4b47d4a84f70f54bb3bd7 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Mon, 13 Jan 2020 10:57:04 -1000 Subject: [PATCH 001/113] Backport PR #16189: MNT: set default canvas when un-pickling --- lib/matplotlib/figure.py | 2 +- lib/matplotlib/tests/test_pickle.py | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 46e3b755271b..901408121eaa 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -2026,7 +2026,7 @@ def __setstate__(self, state): # re-initialise some of the unstored state information self._axobservers = [] - self.canvas = None + FigureCanvasBase(self) # Set self.canvas. self._layoutbox = None if restore_to_pylab: diff --git a/lib/matplotlib/tests/test_pickle.py b/lib/matplotlib/tests/test_pickle.py index 17687092416e..0fad3cdf2e7b 100644 --- a/lib/matplotlib/tests/test_pickle.py +++ b/lib/matplotlib/tests/test_pickle.py @@ -10,6 +10,7 @@ from matplotlib.dates import rrulewrapper import matplotlib.pyplot as plt import matplotlib.transforms as mtransforms +import matplotlib.figure as mfigure def test_simple(): @@ -194,3 +195,13 @@ def test_shared(): @pytest.mark.parametrize("cmap", cm.cmap_d.values()) def test_cmap(cmap): pickle.dumps(cmap) + + +def test_unpickle_canvas(): + fig = mfigure.Figure() + assert fig.canvas is not None + out = BytesIO() + pickle.dump(fig, out) + out.seek(0) + fig2 = pickle.load(out) + assert fig2.canvas is not None From 3a6dabb5ac036052415c121250852ca4e3eff956 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 29 Oct 2019 02:21:21 -0400 Subject: [PATCH 002/113] Backport PR #15556: Fix test suite compat with ghostscript 9.50. --- lib/matplotlib/testing/compare.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index 34b0d5cbf437..0d277df3cda7 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -175,7 +175,7 @@ def __call__(self, orig, dest): if not self._proc: self._proc = subprocess.Popen( [mpl._get_executable_info("gs").executable, - "-dNOPAUSE", "-sDEVICE=png16m"], + "-dNOSAFER", "-dNOPAUSE", "-sDEVICE=png16m"], # As far as I can see, ghostscript never outputs to stderr. stdin=subprocess.PIPE, stdout=subprocess.PIPE) try: From c4a8ad007e22e33a1b9093533fd8c93c73db9cb4 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 13 Jan 2020 18:27:10 -0500 Subject: [PATCH 003/113] DOC: ValidateInterval was deprecated in 3.2, not 3.1 The PR missed the cut off for 3.1. --- lib/matplotlib/rcsetup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index d66af95c8928..2e3544469aa6 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -662,7 +662,7 @@ def validate_sketch(s): return result -@cbook.deprecated("3.1") +@cbook.deprecated("3.2") class ValidateInterval: """ Value must be in interval From 9997e285492b6e5aaec0e2c001f6c24d5fcbc639 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 10 Dec 2019 15:37:15 -0500 Subject: [PATCH 004/113] Backport PR #15763: Skip webagg test if tornado is not available. --- lib/matplotlib/tests/test_backend_webagg.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/tests/test_backend_webagg.py b/lib/matplotlib/tests/test_backend_webagg.py index 997c36a3a76e..5c6ddfa258c0 100644 --- a/lib/matplotlib/tests/test_backend_webagg.py +++ b/lib/matplotlib/tests/test_backend_webagg.py @@ -6,6 +6,7 @@ @pytest.mark.parametrize("backend", ["webagg", "nbagg"]) def test_webagg_fallback(backend): + pytest.importorskip("tornado") if backend == "nbagg": pytest.importorskip("IPython") env = dict(os.environ) From f8c9cfc738570c55451f4675fc70223ecdebdee9 Mon Sep 17 00:00:00 2001 From: Nelle Varoquaux Date: Tue, 14 Jan 2020 17:06:30 +0100 Subject: [PATCH 005/113] Backport PR #16212: Fix deprecation from #13544 --- lib/matplotlib/axes/_subplots.py | 2 ++ lib/matplotlib/backends/backend_pgf.py | 1 + 2 files changed, 3 insertions(+) diff --git a/lib/matplotlib/axes/_subplots.py b/lib/matplotlib/axes/_subplots.py index fe06a7dada12..cb5529d07168 100644 --- a/lib/matplotlib/axes/_subplots.py +++ b/lib/matplotlib/axes/_subplots.py @@ -133,10 +133,12 @@ def update_params(self): return_all=True) @cbook.deprecated("3.2", alternative="ax.get_subplotspec().rowspan.start") + @property def rowNum(self): return self.get_subplotspec().rowspan.start @cbook.deprecated("3.2", alternative="ax.get_subplotspec().colspan.start") + @property def colNum(self): return self.get_subplotspec().colspan.start diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index bbcea4ea4b36..178465d48ad7 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -433,6 +433,7 @@ def __init__(self, figure, fh, dummy=False): self.__dict__["draw_image"] = lambda *args, **kwargs: None @cbook.deprecated("3.2") + @property def latexManager(self): return self._latexManager From 97bc7f38c381f9633a19617e8d6005bf7f5cf75d Mon Sep 17 00:00:00 2001 From: Zulko Date: Tue, 14 Jan 2020 23:04:41 +0000 Subject: [PATCH 006/113] Backport PR #16223: Added DNA Features Viewer description + screenshot in docs/thirdparty/ --- doc/_static/dna_features_viewer_screenshot.png | Bin 0 -> 33646 bytes doc/thirdpartypackages/index.rst | 10 ++++++++++ 2 files changed, 10 insertions(+) create mode 100644 doc/_static/dna_features_viewer_screenshot.png diff --git a/doc/_static/dna_features_viewer_screenshot.png b/doc/_static/dna_features_viewer_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f8217aae311bc80338fae90fd133330b8b2ed0cd GIT binary patch literal 33646 zcmY(qWl$YF6DWKN6e}F0xLa{|EgT9IFHqdwwYbZ{-QC^Y{owBI?(WX_yx)&|=O#0o zWM`Av>})o&*$_F|-^hq~hyVZpSwdVy0RVso0{~y9;i3P-97d-T0sv6^a?*;TpP!#? z^G9!QZxzdjrw`AcV`KOC_g?^CLPCN+3jm*=2cP@<2M3=wH#d-;p3jH<@$pXp;Pc|* zqGj%Ie0+R!bMy4>Y4U9>siO1w`FVO_@!&t|Pr!dfr>7_Tmp8jRJ4eUIt1HWkODp~X z0nstBtlYfh+5$*+k0bRz{b((`r4#}qw{AGVEOQ7Vd1dV1z=!kIQ=n^ zo143|IHjnpYGY$Fx_O?JmDSkVez?7`Jw3g=d}U*0F2I66v3+rWzc#dS_IY&FKQTQy zIr*R13M#5BY#dUu@@G~zw(9C)lQNTIgEge3Ux$X`<6Bz_3pKR$eckPI^9%d}BQCqT zqN5usOVj?Ts3f)xMFe=sNQgGp_x2XFiGa$*}BM~CX_be(-6 zkcBT$^w~r6W5Z3eot-&3^|s-OQVdXKWnC@XjR1gEf(~GQwi^JDrTqG3ePs}G+S%Pv zQJb17B(KVciwgiO?QV}1MMtx-ef|{T8u?FcT3YlBY=i`{^8o+}80gc}&&z{F8GSQG z(yzs11=Wj{CZI3Pb4OueX#hZIOA8<}@-q{X-UcKZ=8jP=m^OfTxMAS`JG=6D$2q}ZCeb^^oJ zoNOiTXqsrPFi==G$~I|URvC~mo_?62_4pNez{@A9i-CgbKfeA?%F<$AJu9JfyQFtpV) zd$q^?v}xeMlAR$z{gVuSZ&%~hD4eg|th(9J_1KrqEnBGpNq~h=i$H(l&#Q7aDpE5p zL;JTHbX*r7I<~bif+^XlJy%wGL2W&BMy~_3`?KbM_rX|WAdT`eqSWF;<6>b|9H ztdmaydi72?UsYl74CbY~PNh^65^`o2oTEDJ0ST&vsoZlt@%X1h*eGnk)M-;H54;FE zUcF7nv^vUsjZL`Hcy8UuVTRqH!yo~SJ_2&18C3vx!>w`FVaEyQX~gw0?_?RImJzWJ z9j`ni(ZGCUX@#3=&PBcfKSljN^nYWuTa0?ilO!Hz*ndA;hTTauA~v0p{tk#S)S$7B z3uS8;;-4L({lP@z_?|!hpJ3Uem{MA9_N!X%-ulw0Q5Vlf_8uq8OuVe%J!&rn(YJ`* z4{vtZQDLuUe*MNd%{j`!GW68dLt~hKF=b^4=n>-cD_(pcbCLTKr!9v4^*au@$X^bM z&ft1~RzQQ*(VnG?NpL=tqJj>c@zaCT@SR*?h%Ix~P&d#MULY>rU z!u$6*j3^#n-mh$jq83re!mrRqVY4zo)xZF5C{nhGEPg*LqEgwObc5Z^2i8QRB!aze z5<0TKoPft;7;3B0XL_U^mhmVyg#DB6XmOGRtf*8QoVlW|L6q7@=ASwIy1(vmHYOIt znwB(+zbC{&IfZmn?Q}%60h)q;tB&R3!@%>KuoQ@7Uh_HAp9rX4S>kKOJhUv>`!mb# z98L5>W-iw&l&pMX98|k`ux0iuOHH$CPxAht-Jv>q4rMN+g=|1r=<9bVnnMZ|FII{< zrX?r1Kk~_>N(8=J?l}91zIs>zqxwAJ{u2@Z+@ebiOJ%73=x5Z2fR(g9LN>hMy#S}y zd6xJm;<$Esv2^phd3mY(W%Fl8rY)JogyW01|C!fQmC$=>KGg}H=fi0rI?M4(n4S=} zri$yzj#C8fDC+sURQQPewya^S;5jp<~TIjnB*HWN>`&}hu^JiV?&$^Un{RAbJ zU1hk|m>;yQ7Jzx| zwz9uLp`DsD4CfF5G5uINkrQ(fDK$@$LrE2XKVMU`lQri0};AvhIb;4^w?%j0WGnKb)%Q z+PF?`csIBKwL8`MnzY-s1q46Mm3fm%yM3=OX0=Jh)Cz_J)X-<+=Zl1 z0copk`M|PcJGPKDvoS*|l4~ls)d8R|!M8FxQVAg(wgI?Z?dE8a#otV{Gd0u{@vj{q zC_N~Ob2!?47P8X+6jvFjzrTet2SOk1KJd>Ma@6KAee4l8T#t0!!#q-TsOSAuKt|A^ z7Yv8{ZO;E>+~DPTcwFniOk58}90=Y#K!VenMqu81AiG+PgL#chj>(roCY+1e$^2%A zNXcU8k*+Y7Y#js@OvaO3K-)$H{+CMW`6UJu7Bu)^v?ha-mlHNlIEOz~hbj@2<8@*REW-_9v4SDt|R6Zvf^AFPp7qy zb$^<|NzA|j==GB;{QQMvEQ`!#?f|x=?2grWP%;$i(liutMEkva-H=N2Cb^i2;Vo16 zZf=O0WOt(6uh<$x)E2;62m-q^vs_If6x=U_ns3xl7rx+}jmodQRJRV%B@a%-{N9M& zb<;lqOi5bVF7=F)!+T&Sxg-I9lsR&04f8v^=`I#WxlbNS)Lk&Srr&UoF=nA|meMPI z5xBtmZO-g3oM8XVr%biBc{NZmd$M%=;6$DweR<5z*!+0xxBcKS*1pO74T#UwCkFhv zVbYiq0~V{+=XQbrZ{^CrS}n@Fg#qz2xu#z%2s~Kn20y5yV=atEI8 zTN5+gkhp|c!3ixxYEs^5{&te&WofyOSygsw&WiVnb8Owz{vNKh1P`-HlRT^0x3x*{ z!?z%IYEf=z(l<1JF3_E{=cxR7C1U-Tm)3xb122OF$p%rH0m|V_Q@lQ5mpB`d+?GF^ z^6SfOmt%s1cAam}9~&WW&J&;F=W`R*1N#YJoV)C) z32!9}8f`ju=QqYuWz%mhs@O!r z>HHrZK;=_D!Pu>f5@UHn%ghx4cWM=;4xQ)W3eAeFC)AUd@!qTxLU)s^+-6KzTWUSx zU=BHTy))9)i3w`=6o|P72ZjGIMBY|}hDX%SpH&V;l7Bf_yuA+%3U3%hN+Jw|-sz8n zv%l3z@y^rP8FOf}OloaRPWaHh$)wzK2Yw}wyG1I@TPKS$DlUXF;^#e$(E{LWs;p2A+-u5_I+%#y^1D%Wkj zoxVC9=ZZ7O4m|J2@xQ7BZ4kO#*0-+yY(Lx+rPw;db+xTKCPy??wI6L^=jgb83i@vc zY&xS{RSdCxvIG92qwsy>XZQ}X6!a50+G_eZ>mSwtezJS5ZuhUQLgH-B)&+lb-sXZg z{ro-&yqra4Wu^FFbb%fQ2a9Hw-XmF$Tm_!b@v!*cWM+x4`W;?vD?R08v}Wu3--aQC zKRq6tuIA4%{r3t{b+S0GOb&SYwcD$xxIAqM-xk7vnTTFV!_tOAEZ}Rlz@c7a%F()z z?)IYKtMQ4d;v;Wj17ir*PWSTHxS)uy5c*yOW!@uVgbqZsr7X=wx~0vSvj1+mO&Tx{ zUuKH3?$--+tOz}h0@%i%Y&Qs&xx3AZeZ2wk(h)}oH>kiJAI}iC4y1MWzNV*v;-%3% zmY~l7Bjaw@br49@6Jn!?xiLA4&^xJGtQ;X^nT);zU`=JL_r04|ApMfA;94g7X9b znz)UkEPpbT+KpZc9DYF^mAh7XR_6o`L_(rT1g zMPkz=Y9^n))?WvM@7rS~By-mAOXA8XmX1W_DgAuO=!Tt*)R6b8Lun1{ zO2P{!FGf^_#*M!b7Wezl-CE{)&;uiTxA3;44RiKi}ecdT5`sYCfn*cmOJN0f!jLLO*?p})I7UWH>0dBC1)T$Mb8)f z@sooF0ch;fb9tCutrp_p0q$&avV@ihvog@1p)(_Xi5c)Zz9WC1_ z>+n>2YhLMRhkQGN3t>Dd53v$8c_L=76?7Y*sfUMvSW*}9a}AX zDdbq=B5~in2FN7U5BTP3J6G3}iW&<~c0*#bHp|mfkevr|5|_r4yCl^Z(fXn)nTUD zy_sL_?HV@B%eair2Bph!L@OLPK?Hwg#PYEJ06DGRmLd74TT?}U+IN+)!pI zTez#iQNv$~if*P^Dvbv11=7@BVCR_QhLMO5D#5r_e5P0uB_uh1&ynDKdPIJMInGdU zgM7FEfgxo`N&$B<{@0QK^YF~Kevkya%f=-xoW_>!zf)a-AReHkIo@c7FL=L=>tA!g ze)_#`b%ZeJp^`|U8}!gjkWRV2XKY_G7X}_h;^&%-@^Hf;*u#q$NT?(7Ur!3E7+wNj z^$Z7I$DA)1I^_F?ul#Fi-{&^h-TgLm3REvHE;Z*jE_p}qwNZ@GTe~Nr-;Iy>CD_XH zppJ4Ar&Mv7Y1XJus*F5b;HB)ttpWGy)y)TNB!^%r1+|!lDKeiy9pt{_xRf0Hf@H@= z%>UDXBi|zN#UT3^sNOfOMTH&?6V(r@90g+i?RZ>r9|j{=rkydu>aCB1yY02^%)<-e z?3q8A16Ys`S~&v>Xb*XZ_J5BW6_)(LR)@Y69Sn=>sC_ z6QEkga2T^97mzQr9ABwNoV7@CkPIq4u5 zdmAf;(huj0V2oq|S>3%ZGjc||B7`hw1s{oI20-BRbz9XhxH*H}j@^D*i^m_#w`~O{ zIPn3z0PKE+TUGq#PPU|Q`8p>&E7?dcvK4rtdudz#So(gs^_$xq?o;>DLwgps zmzzjim=o%lG`SleqPPi98h*guI8!4J^$W#us$uXN{hI={K_Vek|AbEymfP_PILKE8 zM#%p)@0qC1jcf~LKap`V@(Ud zCiW)#yKlnYksCKM9HcE-d516s%lwi07%j)a)$kInuB^Y&I*^8Kxabr(Zw)EtTCB%y z*IkSGGOC5?aG(-`n4W$uow5@~{L4gAjE-Viuw_q;GPsuSv;lvSiycM7@IH$l(vX~) z-7gKWN)(S!g>3<;4VhP_3h{0pMW8P@@$rxLn5(e!{}pRiX;G(27gU2H5a`L;bhEva z$C%_CsTpdSRBHPw0w`1Nn0S1M<(!d!z1b|H`fBV zi1%)WEmN1_x3}hL<>kt<^B~nNs$?q-s^@8|(>KjKYYmy5Y@ulg zD<_rb)&;^JfQqNrPb!mSoeXttLI>D)8aQ_}Ah7Er(*EjZH^5~!&Cd4D3FGW`=O%_g z^K^jwX@Bi=OXh(NfJMS@w(atkQrx`K{-Nicg#`_f2c55cT6b$7;^Xsp_8?{3= z4Lbt|Z@k|Rj*4Me0q!7EQ)wA@;9n+ThP~=))MSc2DMeJx`j=OL)tJf!mQ_#l%Z@HOXQRz_^%?iNAIh8LTi zZbOrM6>nX8A4#?xxw;hZh2k`lH)tk;uHO7~eIJ8=XC-@7#;mSWb>S%ImKxSBiLx>V zmfKFC4|dMH5CP(Ao}Y@pSOFmAOx>-XWDc3Z@s3fz8&G2#x?8Sep%z6XR2CK^>o1<@ zU_z3e>PA3>ebrM6AyH9Ari(rEnfO~BT=udiLM@Bjv9rtr1|s9({0fM6O!ZY*cwo zPq#ev+Wn~4Dn4BuZ|%^Q2~dLQT0mzVo3qfY%PI$%SuLs|gsqQ{A0`#7X0|Rh7OJFa zySKJtJVY5(uUU`Q1)ly04N7I;`3IBISMjr|{!Z0_TTH(!vRCo06P+yNNj{^f1P(Oq zGH^IKNMeKRLhVnFN_(%ihgLy4VJd*6WYLO81&Fj%|wPpugFNjypi4ty{biY~fk z{CEGpZ&2%pUS5sM9as`$nw0HOxCcMd6eR#{5vHj}Yp~am+t~AjT$g$DHa<~a4QHYE zVd+*0-nuJ$e+_@ZD61?l*>GS{4HM{Er5xd+kvI_!2|E>NE)5%(RrNcCg01pDS2CIB zWi>tHYf1_rUsDT{H9?8C`ofH=E4P`%3s8**rTv7Y@~CE50{9fO1z6Vg>GhQ>@iM0voWRyymG>`5yr0nTy7%ag07 z|Hbg#5O%$mK3LTrI(+!HKX*4K2rM?#yv^p1W^9c}N==JH5Y}ijE?3-_Tu=h1{bkj5 zM$axi+s3?8Bvlax)@u0%Ee^A0Z3kU;WsUKh5ubtwz7e|fsQj-w19C$gj#Z-_4mYw3 zyf;VYBZTziZ1!)5EFc^-?K1eEps!#wQ0l28L&}y=at`Tvt}2d;ix{|B&@lNJ?+fe? zJXQ+YTO3-0Sv+@3RMu7B9_jpSO(In-vZhmbDX~p*Hd4~qwXn%Bi0mc05ARV^+e&U6 zTQizZXxb?`crk5e9!3{Rt${7L{9FKx4V2?Vqg*|&Z&)g?%CTH&6JTvFTGdZ=sJL@$ z7~F>pO5ZjvjU4beS${*g2!B z49~V$)iWkEHJl&i`sDCZ2)YR;se;80>65VW5X|#km{3SI^O*?}>z5H*JXkYR^4Gzd zAZ{VV-c0hL1hJLupD|^=5fr>h)l4w(b{yQlVVyB>G~dy{vIATF(6HWaL%LOQEG`KD zYTDij!C@X7#yOSNdX)D~Nb23XPFC;}_tQwZexSd_-!TLYqmd8V|2tE+5&5Tf@(?*1 zFv8@sxG2N^cpoAG=H?*IMW+b8e+NVBR8uB`VL@~xPWra#EYxdk!LCdS z-_sviRb0;6NJA{pzQ8Im|FldUnvGNGC4q(Q0*%=eN>Y%rV9p2{R)0l`G)SBF&t|>% z9wgyq!GQwX;VG5cp}|w@ZT)~{E)Isru{1^s9Xc3EVNq?hCBf3twnl^vQ?38om-~qH zVMmXM1Z6;{*YxH1jT5VbMt{0&zrV14b`iy38h>f}Pn-9MuA#n8OPJ^>YS@jr&{%Y6 zux)7|(FiU@=T=>*G=(mzMWpzU{XniK3Y_(jZkDw5S8+>}46nCnNO7>}?~=!8keTt5 z|ImvTy*cHACw*wLUW*prrBSqK{oOrla(}ME+(ED|eQVCJVcBwOj1G&cvZ0?SsW1v| z_;2XI6s5l0dD31xtT0}pL=0Uy$vNe1S*x1FCDSW!-K%VAl{n6^;rf5D_hl1`>y-;V zzhIfFB4=~M=3j2pW*R*wNiZIN>JTVvB*&S_pnNxw|Bsj}Bcy@99IGH9#<3}|Bzb@P z0Cs0GZPL9gfOQ=M=_JaiS}VeZ7b~tbi2cV7IfycsrJPDJC?Er~%a+?qHD|+rU)mI%fWCq!)U_xm= zLBy&usT;n72UxHgS}>Om`?uytO4OK-YgK@_VA}v^zJiN*#;uLMPIk3TEfgrGzvku6 zgvmZUtj+EIKjs#X@6mDI%!D<*+qx}o(cUAk?KUBCv~lSbk4_e$#;Xtf^KPMceCSAJ z2}r|@W?H8$8+?I0H!s}U?J@5moBcQQ>b)`tcBsK%@hsyFvG3-AKWTfj!z1hpevp-H zu$6A#vJ4q&5d+~01s9H!*%%$rQlh}=nFHy|`n+{4Di-s7b)wsJtBHT7jnzek*XNko z0g^E+53_jl`i5{NF%Jwt!dGEJO!T0@(g@fk3wvE=+`%D&q3&!xcS58ck_sNo2H;1O zIy6g~*_S-oN6HcS@pPPi%sfuU?`^E1X!hiOt(8$~iWMd4%WKHdDMuVhX+wMQz%{h+ zYHUu5_^>^V28YT-iMe3CaT$0<6$r}0;7-ajMB&hZsw1unfZCL{YUPfC>w}IMCMtig zdR)KZI@N1@9xp2ZIaJiHKiM;jp^=mwCw&x$jq={s>!Ets>7zC{>(`Dhq@=9j<0AeD zfQupFkjQksaKDSC(9`#e)>Ml>{Stc&qM)gY!_-sV<6vgzUUwNN^bh5)*VQ!_1q*_=>Woh+n0et$WPvL0~K;}Q)sN=hRLR8H6};D@n%KXDjBHKo;ssk zZ=b;vL|v5dOkf>4d0#!&b|p(Y!V3~pb?a8$MeY4(vEqW?4}2a3`p_$u%l_%Vkdume zlTG$*b1tW|A4VA*q+o-u!$`bbQ7c zJe3Idp=`YU!S&aT-%d*0+U3#-2SuZZ`01!FEna4R{jbAoFUqE%8t}7z+uD2V?dm!wKHQbSZ7fpf=bZ|#=XKvhmWK<`r32LchTCaI z(Xhs4=lg}A#q)(p76u>OkBzssmydw<*Y)4t@_BDamz*A_B{vbDeZUQm?Z?uN=Wp)L zx2c>sgI_e!hh_=xNU*RhgHEL++p-m2jp+_@!L&OoD{a}?LnBVfMeooCR5m;zeAGC1 z`hUPQ>?D?Q@`22TMZ<2(M;l8^u2Cfe`Hot-k%d~FL7huCx2~D|S$o5O#cR+E(yMjJ zVJ1pWZ!CLjn4Qp1Tsx_2yF{a8aj zQx4>bJ)U$`@f!n+K4ZLOA8k86|I{|%tWixWIvH5@*W><2Ry|cgm(A6Ci9$CuD~_u^ zo=N7Id@nYV9`^4MG&EfQh5|woV~qGLvvPWBnCJOwl>I(M{ll#KiJ^@Zq-7K2U*h1V0nKjIh}p| z(XgD!vaH}Ncg7I(g&#vwu78CkOY+eYRQ_5vo?Kon3aQOp@ppWh6EeFljib!K%3%Kq zaQkQ61pM<ZrDsY9;Mbl*yxAf00SUfhi?_=X}E(LFyHYY)qpj(1LR{5XjIIE`B zdhPw3y87~kU%Db13f{fGAI&s8TQIe*d#Qw28b8oa>9Pitk~>FnUOJ-OWq^gZBd`;2 zZ4&w6j}-}S`Jdhl%;CYwkfgAAJ2kxz>#5ppiJ~bzq=Rn{1$EvrhxCc0gb)%BBdBTy zP3;$06LJqiNH%uIi3|4Ti?n~AE@kf}9@;7j?O?Pn6;n2-^I5ZQ^%yIytTuvnkU4v# z))Fbo7gpmuok#Q-w>{1_!y_3B>7qr^7*(cV9c8j{t=y0ZPm$Rp-!pBhgncOdyT>ap zhd;>Ds$pd7sTqmUs-<>vdK>A0EmBqm3PP41K?W8#{nmY4I7Omg>wHo?LUPifq^`Xv zh5W(`V>QZgBxZ=pBCzlO*C5Wiam9*qfZ3rO2#w6@SeR-6i<6#i+spQ6b4ysv3U=EK zFm_!wVj>g+nsaZeKao40Ktitu>!2q61LHJInQj}f!Z(yhhiN;gf_1y>L8_JA%hasm zs-6xwg9*6)j{F(Cv~2K)n=y2H82I$fXf8VSa$su_SOl;XMffQpxoPw#67r5?;j=KGqkYc`MX&lO;kR3WZgkUdB8!jDYdA?paam@X153S=?m z*}9||FqE^&+qNEqhyAwqg6Bz=^LMpC2nI`S zUgYyMw{$|^ud!{Ltkw|4g zV9(T1Gt_HEuI*X{J+l;yqtlCcua$Zw;l*%Ki#`abe4707aK=oOu_vZWrbQbA=-6?J z{CdiXET`Om5C^oSZl0xe*`Vv;3=Shd&V7M{h9<@927eRwzuGO1?^ckmCv{PLlwvoV zHFcO8{_GxZW=6wxFr6ug6Zzrm4-rxDqbQ`K36szYzxZj}?e5$--l03|>>_9;b!6MV z*0K5Mx^ej0zR8uxi&9$*YFTDRZk!%#kWs4L<_0P|^G)?~yQm5fT*C3GVhgZaT%A{7 zlFZ|PVeMz0w#PVB+n+R;5ll}JXpv)A7rXGo6|P6@tSR(HSSn!kBsJPZiXe3Wz#D&u%CQo-Pjs~L!##bxY!cAzAC z-j^8x2{5zRqHYW>?t%tD1k5htljy&@)?9cbPHbvFeHY0pwr*{MY{sst`gcN?W3iMe zA*`}W{8Y=H5zjlhU_x|JzlrYVXigJDhbeZaZLP8Ns1Lmu(!gQC_>v#{YaY#s%C5$I zj--W(0tlO6`jD^5j-eD!!kid(LFLzkH7a^*q?EIpvb$!t;bs4J4ma;*+ggFFxWZnd z%~6%k1N_lJOf&Omqy=`glkOzY49ii)!@M<5e$lWUWp5fS?iJ!DlL+NkL;3ec;%ohP zBs|4-lz#&Wa8~e^h9?bhO5DG|@2@}>R}?ETDVe~EcU`;0NRz&#V^MR~+C3-c;6vHB z*(%~Nm+v3*PF1ZAGJ)ab_nx>mWVBoKJ(MVMT%_8aK{7D)8~$u@r<^!*Tc=Ua#fy6~ zLqunb<57{)8!*7l=9?{JR1217?DUVnr_l+sXEM!qPHAx`xt94~TDhi)A8EPi?l$^< zKhxxC<@MYjo_`f^<5->k$oox%L%#xN& zRzkIPq`2@^#yiZfu^&{3azRL?N0+F`g<~D&NOOTYi+f6*AM3*k52c=)?Pt0;le0aO zn|F93n)@9U;Lie3I#f%6d*hEM%Zp{Kya25>nz|eljh;aHz#UzIwM`(m?8&m2rXA9% z2srqUuuh;dI2h;DIZAxeDY$}L)nk36Eb|yT_jDQfIQj!_RTD_){cId0xKJlm#yoXa zZFG7zQ+MXYEj;>krV#Ex*j>z`=j0?I{=lb^$^dKi&*>Ob`?m>9#gOP<=wa`d0+%lQ{BbpEPOvbmrBU@H zY)H+9RdP)DFT7n{lCR;mNl1Uip^$0w=5fe-IGSY2b;RykthT??41flan-&eGYO=!P zA98D{gJ2c)|TlRE$bV}iq#xzz#DMV2#f`jaI(t{Yd^i);nv{=x7$*5@Ah{pzJ zlbv!5udc?D>=gbKSJ)zc(z(^KHr8ru9k@7_Ux5DQyy&20WY{0Vjm850?4vu_-vM2j zirQ;YEbwztpLcVnxoi-;-CS4Pwqd(mR&WWrzV5&h#DA8skz$W`g;uUh`zKy*B&@mU za1xIr;UAQBd($hnTq5he11upP@yot?T-^zy1NV=uc=7-DNwX^@-# z&jSp@vcHRu-@=X~JeengiuuP_%eoe9mbuKs8P$&nDz3VG?6#W$)Gt0}oY!kSE_Mr= z9xr0{pNqePxQpjZ;|58s0Q)c6raoo;)H^bCtuPo$RnGD|T`{mZ5&Bs)2tx+s&1YBkGBc&Hh9a*q&d79+8s48e8G33l_y(zM|NsU+2z9Nme-0>}~r{M7Sx`99cxaN?f ze-9Q|xTSQb*s&77Cuo?rKRC}P zq@`~VD+%C4_T2a`9oy92tW1N{NZLN=U5zjB9B_;v)|V%x;@Q#2RA&I-2>>?{3%p;n z!3he!Z#|fHM;)RN|7>61l0uo((f&6z0OD{ZPoaejVg9Da%W69b^|O+oHA)bgHshhr z`hKI_5d)?`Tz`*{`lSti`4Hv@a8v$DBg^tDLO@coDItaO!$ow31L&bUuC|oARbQu9 z2=j35JM{*Gsafbl{L4Dd8r(T1^Rn&*1ZgRTmuAiDw$-F#2 zx^taV%F-mIW1JTXJWDbI{r|3;hr$>`)aMO13fJUY(hO8^sKB=;#O27*NfA}|u_(Xr zP0}p7@#P7H?Dz|a`uGF|o{tCJXLWbZAcLFUcUuVu=fp(bukU42K+5UAv_6aNXqLs_ z+T~ghZ_sIJUK*fLse1mO?dG-7?1#m;a`*{0z)5Y!>L{OWb@0Z7W zZ_=dq)44tbq%fbq=1a=pTIh?r_HY?56Ve{5Z|Q-2N>0dNlS3#jES&d|pJgZ5>Ly_P&I=y2AsI=xk?j;*OSF(mik#*o6&fDxWU0|uVBxnnK?rCAe7 z5$9)JF$o=kiaeMs>I)Xh_xVB)Ve-7V_;W2{nP}H`eqrfE6Larw4014M@F_*esGBpH zCnB8p+uorwQOEUcoJ3gW`pe631rw9k+gV!S^T%+9+tCJH)!TjNSEU)NGY#pV=t$xT z5e>y8Q(o|6erziZ{G(%49175xK^>X1C9!+Pz=E3vXV!M z3cE5Vb&XyaMC72DKzwKU@IO~F%}Cdi1B)He&_>VWqNVO3+zd<&gE-9mFXAUhKa;Me+{&XU(|aJBL|yl*N74V-PFTG8~T^39gmWpFwK}UB+yi#U+$1Ed+P3;Kb zSX!`T8#D%@u<@8TM@Ii%eL?>cK>ynLdiQMOL3SXq;Qh{ zK;FRfdW1ge)6tpmi|=9a#eVjc;=9z6Ovdu6xWoW)4Xrdii(vWt1^eVOB05Dx{CT%P zOx{tP(=C88GNY-gudYl!dhDulLU8=^U2;m=m=gaeY{zoN6g%L@d7G2Xf58?3f4ho= zpE{FOhior~5|7j=@=K8kE%7RG6N?1&+K_c0U4}~v!wpDM=<{tj5Hq*gfgd+d1wofu z?BnNk65*LzYo4~JVLgyVH{gcX?!1b(+otvbwdYB84{G^z#A~?bGinHL=U;T^Qdljh zN~6tow1Pnsi>W>S7sv?*_H%n!tK}sPf#z@drKLS2Dza@<S4l3y#i9x=10>ffhPJ1l$Z>c&`JW+4lwRV4)EodN+YC~ zNEyNHIF6>-s(BVz9j%nh>@oG|?OGD&!}zwUT1N|x|LkTJ=7?YriMU7BgvAn$M1Y+y zPqT}YkAZ<*?e-tX?}g7t$8=$CSFuA>xxI|Tu@}XsZ4brRlhXblAO}s>>Bpz$%W|QM zSn{HM9JNGLBFejsijxPzK-5{;Fg2WQRLr4WeOcRS5=aPhdWo2wRx@itRo{1;my2s8 zyiUKrF}eM@$A+yfGqI$O?Cz1{S~tOdvp-E9KK3Y%%H13Z?c}Ob3rdNSkjm?9SGW#w zw{S%I<^ORi_tB5CqyHWPlCW)3Rd0!neAO$tufw#$uy?ISCYw>B4SWcv{SOzhw+Zs>H5d>VP22?Dw5#X=~J^ zElbDs`fMUj!-VP0>Gh+@Mw^}oerpR}&Sw}RN12>$<=vTQYCsy`#7H5YI3JPgRoa`k zVs0^Mi`CCU?rm5q+vPso|3I5fVgiD=l5ZQroCi$cnlJy@rT*sO+M~x%^%NAMNxbKnKmxb;>0~dGYZ`aWD&_Z!5M_ zeiG)CWO!{l2P-%3fZ4^+9l@Tf+uHO9Jlnw#lW<$QgN7>P8&aFI57dv24Hv}1RXZ|F zWFaaGr=z~?SLxh&eo8l!8qEvCVx!WtL&S~%U`FQgIWZZ=HTd^5bBAC=cr?cB4!9OXp zvt?Rze7^Ize9WgEG6~WFy57!@;jlY^p2ypHw|q;Q?Mm9RJ6qwX(3Uw5i(ebdIt`}H zTA{7Zg`;R!Y(nWmf5Qh@CSxj{(`Y#+_ZxYNd9l=A<_FAzT;a*f$DH+i^7`(?aFr4l z81eCmlu78&&w9(M&&w4<7?Mj{BLlCCSas)AKNOJ9+t!UMpw?hSAQ8j;l)3M2k@+|E z-W#ny4d7rBPX@UvlgaLPKIDJlNM6ZaRA-<=um}vW{vpd@0?moCy7f&}K1ll$2%XL) zVJ;T`(ZcC?oG!TQbUkh?UJAOpR4sQS^N45omTfg#etAGNhD+k%E;^K1UK#*=K{@*a zrU#96o;RE3(jYfdj?T;_6FMWBC<#E2g=XIn#v>!}Whe0UW}8#`PP+dg=QXyozKu^j zw{xP2*m-OcC@@_|9|@!8BlZxzli6YSM#rRedI1IMt<4 zv@LT=TVg%f(-bh&AA6W|UA}IFCCWwZ(Qm0AnbS%Ks93^E}5f{#`oI-EK!>Y!{8z%!zmBbR8@j1tJ!6{9Iu2a% zc#^u{0s|r3{@Cx2Bbeo>R!~z|{3P(Asy@mKMAW|4V%@B&zjQNZ=!Kzcj8}{kXJ-yZ zis{*s5XpY%OJWh?8L?jZAxc0s3^gutgy9;%YD9+aD$lpJ?ZMK0u7-*Ll#C`Wnjz-l z8OtKG?fKaCUffzyKisBBaAj`RL#COZF7ZSV%92Oga`e7LkgFGgq5-?jLmI3aIykA( zeI@Ce|6*u&J;uS}yoX@=Ku&)c6x9(lb!I70g40?fxOKZ)h_*pkq@uU{Us3A>dz$TZ zPK>f2wxP&up^q%YxK@Os_S`*q02w!1+~#aDTs^Ud@8>B-1FQa8@%^^^L|6_J;3^x^ zn@8sC`hLERg?A@gny~x-@%5EaaRf`aSXdyikOX&kcNP!s1b26Lx3C0vcXyZIy12Ur zcPF^Z%f0XYyywlCGk>P1q`RiS>glQ)8P9Yl^GQfiD6}N`+Sj20B+A?>#kfYPRJ%+c^iUKM$Le5RM4bH>a3#w{|VpOXBo%ZEN?}erOgl1|lqoVkC{$9-cs*)a@^qoXb z3*D<;y|@8%AKZa0DR7BC>gO=u&USlT(N7uJtBRm+bBwpo0-xO${92VA)s8RN?iGdZY=KP@vp% z!HzVmS)v=5ahOF!c^9GVg!8t`IX^Iw7k>)*d-~V)V{7PX<*Jqp_Y54B?Q1}X(&h1P z#El)fG5!uWCL68S<#&C|cpM7v?R6he#m?>He0j5D;dYr(37T;)F}c1sQS1uaxvD_j z&F(&1A1i-WLx;bN;aE0{NB$184);A0F))alk_Br&GYkQj{3>44TwYZEQjnW%a|`(e z-#4sFvys1Z8t=D_vev!**8#}RY6L17we+n1bNZV9HQt5{#?oJ!A^T+}k{Jp$=%b-? zPU_z^&~FddNwO?InnWu zPWhu(?P9rk>hv@1`kX}hJ@oKgCDaH7C0`~VhInwg3aS2y(3I75b;06t}Z|EQ1 zAo!nmcM3|ylmF*@euzz`nR<&o*FpaX1%xN^O#uSDu6)2yTw{26fl;_qpLO^yy<1pd zmqSv1!D*ynaiiIv`foul|2{23MPX1-1boWw{$*hodq^?_cD{Rs4w!ym1O=p(`25s3 zbDG+FqJ;82TqnARe#jn!N2A#Y7h#viurJ#EDe)kLTwCLLKWu5D*GCMr#Vb1gXsKno zZ5{KL{1|dz171d?{PLi+P3IVhyyP47>z=;s0Y_m5gHrWt{xp-Vc?mK)6BrRN?K)zt zLP=)O%JEP>UJbn(^h9r(U#Me|AB4gX$oDtacGF`)N(j7R1Dum?wRn27FiQa)bPg~%Hr*h z$$qL$O}6SCg5kQ}j@n+Og`i-nAY*0ZCE9==HZZ{DPMt9(9Gb~zeWMu^L`qtb=?JBE%9aG% z4i+Db7`*N*0>}^;m3imPv;d)xGK5TT)bvwmj{823aY_(&A`=6Z8_N)BeRUrWKo|La zsVp#!-V!KZhZs1_vibSGWax4Cs(+g@VIbqXl))i_!5ixRwC_DMhImW*Y8RX#&RGXl zdkxOLb8&C|RPWAK0Y!@kUpLD+O3Nqen0Y3r(Z>|zXj3hXR|?lXvzjqMZl~M3em4P= z!_}dt(h_mWJs%MB=a<1ludSo`c?35OTXm-EQP|&(^8nW`-|64b(Pjsb0_GwD79d&_ zWClB}=h@T#X~KmLR=qglL7Hb<@)Ze%tOf*TLW!cM*(etZHheL< z6B+~Rgk3zjXX{z!P~mi74KGdxXZQdV^Po#reJV;cS@;*8fMs=(`TNBBDIh5Qi)w3| zZskv=FuZwx>G^E2q@Yw3L67TsVWEs)>^^Spc=KP{O7 zK}kUE9JOD%Rv3#Q|m0`kV(Ioc|QqkkJek zFZ4^2o|^wdku!)F<`+|S`!s^(4rdtBxI)twut`*Fs#ll!80`Ji>k>!Y6dQ_X)bk(}h_sGiDk3kB|0#K-Xiy5fF%J{T<{g zAhN?5nQ4h+;aJWOTDHOGLtW^S{<9M!5!!|I37S5%^~nmY0-e`m$*{W+-{{NMq5#zU z0h@G4+xlGSU+2?$!&)TBLzm5(+M$snDU>L20hb~cuXsvS5rglH%V?1;DV9Kk~6zavDy*#DNJfC*4Q-3zu zoUMK{(HJBrMQ3JrPw5o`cG%MkN2mSajJo87?CK}8izC=|rc<;LK3P((CSYiQ&t+_~ zm-I`yagkC$J!Ityw*)PmW90cr&V@O6x7cycG<4mtLv@m~+={^V-%C0Pf$hPuv1P{X z9+#{D8{h2YdcJ&ZG7mJEoY2YP&%)Ml;OqrY!Q&0ch2W}P*_|fQ_WzKmAay!Y`Spi# z%K(4q&Y}XH^7Wap+Q@6)cFrTjyuKqpwZ((fobBw6^Ur<%ia?mm6f{nV)0ZPf_c6;n z$Iv9g9r6tpE_Z`{u^+8HO^hLFC<27ZV~N7t#VWN)XcO$&*)ebp48c?Yjg*1Q^6&IR z+TnL65C%PQ!%HzP*@nAH}I zXU^>KGTJ`2xM#2?1ahGc3|Nj)_w$!Wi>z?RKP`KbX_@l8JNdv=)sZXYJ;tK4#{cXqlHTy_5+0{;(5|Cb)m7=zW1UyL8$##HfwVV3TMb7eY9 z&T_0Nf&E?5Ca=iu0Vw6q7=i>`j{DZEuSaHG(irhB8P!_rf~&*{DAFG?P5@KztUjf? zA}6)3>ZGE1Oe(dOD#$@M;GpFYKZ zpNX3TaA_B^RG((z6e(&nNJ8nT@<8R4@6KLvQoAcY|8-u3n%`zut#nVZEZ75^M!*cV zc{Q=;s+Vdd@cwJi#t{NPP|ioMWvR^}jeB-Nvm0)lgG`6euH~1?y8*us)Wd=W-`a!N zhYu)9Hk6k!Z1z*qJnYO;PWNkf(EB7IYD*X`g)|_>v=>1h+_I$owq+V% z+GZL?#M>F77YBxRF9Fgk5zTy|*W#WdIQ=2$$2GJp?4?aY8^hq?yaUW%3%o?$#|P6k zF`ciBch-G=LpPyNp#w_4sY}I9HR)rqPgl0{=&WG#`2brgQJPzKGNz+R?L}&Jr~z@k zj=5Z=Jq|Rf||2-WiHag+I4Dyl2aVXd=RFKM}P;Bzouu~bt z%737?-HpbexYhP$7DK1t+M*8+)mp*Qr#b~JVJ@dLs-9hm`OY!maWhjJk&-f^BLzMa z_tC;)1gH`m`^Yz7pqKTJVtg8FKg7Y<*#zIInKK} zr3-S@sl~C&!p7S99$w*xzsajA=EDS>a{|QV3kRV)LLGl9@}D)xFdZr5t#t+hfpJ?s zRJ4Iiq3pTI*09sV8w7=BpA%Hgf7{14T6Bi*dOH1EMv4E1Sq|s^iaCK)Hqjwa3xy4C zU&w95mn(^o!av(Njf>I0cFM9)6oAui7^*9ep=UhGh2T)0n^_LD4rwa+ zQ&Xz${e!+H;R!w69*|HB9B|>Ol@5*Owjqy$Jgx+NxmU$8Sz>dg&9p~J4{wkF)5F~~ zUnlAJcGKO$*WDq946wEKKfi4$fu;8?bp=-?e-4NVcHh0*p&uptGWSYOi@RGs7?P!8 zwbfHnX?x*5ZLZZAu-Stiosq9l@b*FO{X3OWBrl$U4{0ArC<7j%oLh3BDx`@L)oI#F zIZr507Q6}YhRac5o@4eXS0Q8%Kd|MpU?gC!5gcs-SaVe%CIyNyv+q6S+FZIHwcyFt z$A$93|0ybjI4YU`+&YAFF`Zwz9mNm?$*jA9t=M53{=BU`QJVw`7qvFA?7!u^7eam) z@1!6p~|aM(btygwZ|2w02_0b=SQ zZ^qwFj7*>XNU}4d(-yRj%3s@x2S&d8ksh`Z@~QJ<{!cY0x6Ni&?=|bSCV3Ew-zJ;nAuh+Iid$Mss^_vN3GvER9#;Wez`TNjfxZJA5N$6f%@fo|S+n z(M%c&g*jOJAnVl*u^100%P~v%C^8LZD-9XY63w6Y8LBOM)edcqT^2(YYuSi0f!8Au z#Yp}WHkh?x?B@=$ZZTHKay`wM{OAOCVcE|ty@CLS4H{OcbF&&D_5~8@PqGy>y!%7^ z!EnxD^+ubyZR1bvLaid~91yMf@uFB;`6TK;LeHk)p?id=HHd#MA(gS1B^1B+FGv3#@ZrI-6m^x`aOIk$Z5$DW2aI==%8e%O>H51Wg&#`*YGS& zuJ}Ug!FXZb>?L#Fg%R2?{Kp*1C_x8Hzghz@_Rov~@& z$+Q_f50pY3o*R*Ht!h^2M9d;`W8P8$)s>;>5gv`ec`1gt&QN*F@2WMRH1nA4$P1*78m_%vBmF2MY1k#OHT&eQ%_{pY-FV5^bOLR+icS9X*b$+KXy z5u89TPs0Jc>N2mD{HCfI<@r+<>5p#;GsuVz=N~%fLUqpi_k^ugMwCxg7*d>63d{DV z;TiXRmJzf)!KJ@iQXF_X!d;POC(z+5-Ve>LbOV;Jq(LU>_gC4ygmtDX9FXkl=9+BmMh*z zhPqSvTM>NPR)%zmO4U{|b<-MT*G^INNtb8Fr&J?APwH>HGM~*Sx?p}ckc)bPA^=U| z6MSjKUiczEtdMkAVqH%*#|(6#{6b_rB%6|zKVX0*U=gV;!PWY3$ZgHlcFBI4h3(!% zv_{Y8c0^2n0L9U!6+E=Q_18c$^&>;E`urK?IwAUcx`N2}y8i~1@BQ%`_|}o@ziwoU z5}1CMx2E%X)c9YF!{aV0-(}BkOcK}7dhVL=arZ6~ijz0TurA;IT?i_<8%kFdfjig< zQ1lTkXdC-LtI+j2dV~7fzdO~f!+r5@UQ@iR*FrpNwGj{MfHzTn65x0()}ZHa%ZAjUnkwvtPBvFdt$?^i^yudj6q0&O0x zyx4?KzO4Un2HKhL-)-i*K`KG=$2;R19X=i{vp4p>=xxjQ*3Ek_%Sr4PqW`ers*@Br zzj;O}A00Rhfy(*V%jb1&w6!Z=h}H(hR(HN%wAajvpz^B_(kHbFa=N(Dqv#QsKjO54 zxq?yln~8MWg%4bFJov7jz7chHIB-$Uc^ek#1L0Ls2QR@~-A@MuUVAGNgnq}r9`s&* z^M-0=4@Bn)AGEH}DbcRzJ8(Gx?BOa#auR&s;Q!7HNYr#(k5FMLEcPOM@bc2d1k(xH z-)WoOUSyyOJZ|yc?)W~eKO7arbhXG`{aTXFDoy%$z*9*&ne*3fJ!AVPQvk!i`F_a` z?Y_SZBggL|sng(jgbn@-HpH;zOSUJAOo#NfL_5RI}sf&-7 z?5BD?mOY>z-f50dn;RIALCrH2 z4CXzOz!Y(covaKxj=s4FH8a=q`;f)g;cm+K)%g9*aoA1`5VQH@;>}_@AUpIy0-`<0G8Z?{6{V{|+JG)Ha%Q zFgs=|6GCT|r{8gcN`X3%*BPd2Is9H$+f+AgxDBfGpmqj%ymITMwSL!jbU;fTOBgmX z05qg*d3tc-NPt|pn-JorD+?AJLaZPjLpv39GMB&Eh#52g1f{MQ0(X*d7)_dYa`(4{ zkoAaMWPM)meQE3Rb2QYqXbX3B(_@w06ljTi&HiOTXlh)g&qH|i`vWGz!LU8Dnn2(g z@wc8&q4s}C1jQ?5C`9d&pF*&z`Npx3F{_gf8j4*mAt_Ja1n7wH$Ay`(ieasdkRjBWuz~0C_=nkGaHZ>vuX`+LC@`8D31;lN z+fY*tP3$Om*m*8a)`&K1@{p<8K-X29e;C=t)gd@yytu`_gr!D5TjWhRq}9v8kdCHO z|2AzD!kd$?EI(R~deIFY$M{i6<8;L|%s>k#_M?13Ttv0etU)azkw*^-wwK2QzKvTl zi;BtcYA|Ffr`yl>!D%J zk%1iy7MRD%{x+TH&0H%XY%OJi^nOI_Oc=-=11>Q#;NW!cZ5>i}h|=A(kkJ@@DSLCC z_S@bs;CJT5DX4k@p!PsU*ewQhN+dgFnqNxG2r@AO$z!wuE&aq9wo~!_1sUd8e>lQV z6J8F9F;KD7PVpyj0J~IflgI5n9E#rKNd<~l?) zaqw0f-73;Wrgu(3O-&IbKcTy`O=|oJCi$AUTT2(&l)>Gr_L{| zawpZOuT0Jimj!;?Wkj z_^;oZD7I(^D`Zg0MeC)NUE3qN>Ar}$7m*n5hnL4Em^eu$YXQ|Lj0&`p-?0G4NlMxf zB_m`MXq@!6$aw8?#|~nojVu-N=y-`&f& zr|99O)XjYZxU@iBAfrO&ELWPX_?rd7ax;ZaOlIBA)(@xY1?z93r5Nktw6*6cDiJCe zMKcau0SONHCXJc2<4pcP5 zXVjl*x%Z@yR-g)`mDuuC5|MZiXtM{cTZ5NlF^VjPi729~&YYORvJfD^S9`>OW=T)3%0fwj?>8g8u;^P9q|lPUvS3jzy?s#XsVFFE-N(aB!^{k zP^j;%u+F3NZ2N9i~c^+8sF5CP6 zpe1*^Kusd|jK@sq<)qNb5x2*+CVw1g78reQ z7$cZy4N8-2)j2qL>TY)as*!zo*>6!?JlAiLzKEXB&I&6I=p!f6LFlE$B?yD6=OGxM zak$(|sL;veX#-vyzX4#0!%4@cs0!l5)@T@FRtvXZDn(j~wv)VN>NL*y;05U!bX%M7 zk>V&rvDB`Q$HE3=*+;(UyN2c*oF4D#(%WP*K)9pCC6ZA^iFr6{!RCB~#y_fGB#B(` zK=EWQv6bVY4{aY#>WfRebi-|4sgjp3S5!*jK>kyW!X) zY91VmT3iw=B985dpPBRg8FANu``foi1?cfH>izd#iKZb(%lxubc3b%2xI7qx}ug3Rr%J)oE z8PSDf`_`RTh33gI6wZ~2ZJr_`8%()21fDW2=HCiD+H`sAlKzxuW_ z<+$NK$SCpI=loJR)~CvT`upBJn0= zHcEvr6Mn98C|n&s>gX0Zl%gtEJYok!UMARv56ZZ2BFn5S3fATfvORd0tA?4aMXy&j z_5I)VC`wiyKI{8Wiae}ws zYov-Mv*<7iWI|}~^)^~u!rob8{HX<%{7ij>T1Or)7&qEPeS}kC7^SQAI;HtE+k9V& zQqFX3)Wxyk*WZ%;kMGYZV&47WocmUV^AdI-q zg^uP`DIWIFTun#U;l5p)bW7C4>I=Rb0FX6JyD=tFsulsM{SE;9{>!Lnh_iaKmevK(dY#J@>gQ$G#6I|TJc*j)! zdJV<_?GaqXouv(dw}~ugzI0*2OlN)^kG7K$>b>F;yp)o?c{1lG38Tkth{oPqgGB#} zI%1>YWKe-B*&ll`4+EE3&^R=Wok3C3&I<1IoxOa{`>xjy0ZxuA`ICQ<$*&jly9bmc zp!5uIq<$Cq6WVwRYEAd$PL_Rl%OYA!qqud|uyLfpVrd~f@!>T{V@a>Y;raHsnM-7d z5;dFK!v~-5ZXLtO$OB3a72w`P)2?jUEarU?N%0!B=ZScL@W!RA4 zrJ8tlR5tO^Cvqr+>c(2vbK8S0g{4OcC&d{LIpIFFN_>YYM^oKHPu&<2BtZA)UOJneY-NUiZhsq;}VUdMVcgR$d|VxEZga6Nr%NIu%dpHsDh9G_Nb_$!tdAB(b>H%X{$Cb}5ca>KQ@X|dSx%h_#WCDL0e z=HYL}JPQ!8e%m5*M$&4Mo|m6fN5{e3l0q{TAsXEBV_{7*S^bzkO1%3lD9`EVfNN{X z2t?Ulhx8N9#n@;kkTGZF&!0c*-hN1k?ix*Nx~WG`@4SVKy=!Rp-3GjmwgjvZJqVN; z%*KWBy9W7rmpMuRnoaR(e|JR&4EC9v1sxhtSyA#J@!)D%O$`QlhxIKf`wyy|AwS7+Fq?j^$-nsU}_1N~=VszHY zviid?x%Uge9w`b1&N=@8^e6_MPGK;N^6lR^+AS@v=HG8eG=Z1;Vzvw_z8L3(>(Zn@ zskI$s8Yhacpj7UN2l^$!MT8NYyXIf+nncOw6O71j|iq zd-p2@UP1M|juI`+9nNm?o7G?WkN5_f-Em9vtXes72VN@^QPg6GBZv|MAK1n(Y0+;nm zhIg>mQ5LW}G4tp^)X5fuz-f74>g=4%V$tz1%%!oBeo->OuR8EAaff{401XR18O2DO z{6cRYYKqTmU#dok1rnImqa(m2jGN^Bl5?jY(%oHlOO3fZWEHkd2I_bojCWPJh@qAmmt=f zq3Qu7xVYokdu(ya1B@!|J0Oje_Xe;B4ePN%iOE0s>FE>xovb3n+@5TaqkJ=g2(T6p z`rP~p6;LE80x$oUQ*~9CgCNI6kpg#V$`BPmp-&`K3$HevB$X5TEi8DkFEa#Ox`8D$ zj7-0BZXpj!9l05`!uIAK<~TCsVUrw=x!9u3!^Z<0UsJd0^OqD=xbu1h>w;&CW;)-h z8dk^JwcF=w2?G9=on6=FJsWP}<#75~)cyK?4QwT%;b#51r?J`P5$)YH=1it_|`?1JA6#jR{bx0gM50N!_7r6mxyT=n8abp}(b; z+!Srh4UM=f<{@FFCrJP@6sXn|^7P%|Lh!JTN}aq)4PT2MV!*5xMaO!)lu@s6rnO6p z188rXxO$H{$f=AphG+${XT;Lx5sCjAS6Smirm5CimZMYDTBbE|C{tuKQ!V=a!ZDUH z)Q+Jq?GVas%8m>w`M_@Y4!|op0T&K85bywgKNhpofEOm%Lbdil58? z;TBW<1tngDa48>g7CIJWIRp{v3>@r3Jg3H!e{eukLxA5Z)t%(257bCa&{i)ApP_1M!x?~3WO!ok)}JD~#Nls$oBEd7Rm*}K#fcs;3L9PGgIC($t% zzd^fhAk$RyEqrI&Uy7j(4y2!V_FjyT2x6X5BpLDpe`@1Bh+;>^k&e*uS$lwi`uX~^_6WRHwHl&mb9X^DEZ$^%4B!d&n?4JoPv z56jM-M%)F{{mNw1>e8!6hDnAWK;tjQlE9%%B;ujIvc+vOyKDjz2URfW(^>i>0831Q z$g`1?4nsMd&?fLs_O3a(xyN zAnMx_VJ~K*`Pfqf6{25`u*MTu^7kSVySW~+_^%w>bM2J~3e4slO|mb~E;?^AaU> z&dJh`_^y{L>r(nzbKc$wWBKHb&^Om{=A>V{$_@eL7fWAf<)GSI+!HSE*Q4vcDda)k0%*n1-~sDCU)D#X zR3KHI^Q^%qY9}>(`65+3UIe@qy$U=$zrxs&J5mDg%b%vF7-}JRCM}h$@19n1dUm<_ zh8lsvwzZltOZ&Drq~$MjBaW{4lt~SpI?B)&G)|XM{)8R&?F0CH!}n?X=jXr7HIdf* zE|7IIR}8treqZs`@_AU>oBOx8w7HwvyIY(8Ob0!AFvB^E;0a_LL99K8AWc9v@spJG zL-4NoHwKq_^B0eEEPhO2*LV9*#+Oh?TzvO7e>d9(>WNoj8rIN{&7{7hdHTi}bBb&tkz%tJ(VF4b!%qRY-!9Nm#4-I3VGAd^Jt7RuLc zgKXj@2yex(zDgFuFb`bAr-axlqo$CI3-50^DGD1zJ}3BvOxIn)PmgwM4@V^}7~>Jl zpQKK$Az8>y4nI^n4(_aKn6_?oYIRsX98)4Cv*y@ z(Nm&Lx}~EKfMXnQ(o$CD10t!^?=~peUcHtg+XygZCI?TqLS&hpBPf1Bb60| z2fD3`{DiPv8ahN8ra`t!zvh?EDxA)<^BbC~AQqD`BNGk2c(NH|DbwH5oul3~kIdg< zz&VF(`po!o{s0K!CHaLYT(RYR8q#)Evc(%nUv6>U?)`LP0CI>2#H4`(-Y(!r}G<%#0 z#U>$*Eo106kT_4*+}-lNqp-P#xNDpM*ft~(#a1}X4Vp>V+d{kvjG*swc=p1uN!&1k zF^eK!;hF2nGMd<_8bt{`o9}>Yx}J zhK<%;&fg;}Rg4G_bVv>)MM5A4EnU&WN*oh^Z#Y6iCA`pnSAIDIA73ULfQZiv3&c9-+$v5*wWC7HHgi`>-mu@pa1?Uk7U$M-oV%EdtI`^quF zI1MvH<4?FbBMJk*E&o;Cldy7t)*rK&IL1kG`q{qzy-m{<$Yet}&y5rd(&`0_3!=Gq&vpx@GIXPhRS3vbY&y_6BVc<;HwwCkRfn zGkJvHFY2=D>OSwLwLbu#?hoxZOCe{MApMT?t9=Q9H6!_F14&RJ!MS~$?${aHtaIU6 zqjP?=`z4%%WOUzz>jAx)Ju(%KMcjh1(iFj-8K#5}-=eU%Bp9aJED(YyrQoe;1CDa7 z6&bha6j7^GOSYSEl2Y6MasIKFd)0xDe;#)h>hp5UB-nB7S%bs|i_@p?dq1F#(K4`h z3t4E~fIJhf*xNF3$`4y@9@$7k6aC$Ko*5+Jx%aLqqvTp8RK;@8?DRrDs==RH-qulT zOnlyidkxhrLjL+a?qhipRZf}`>98PbhK>BWT3o!q)l4iLAcTr^cerw}_1+?O9@+j; zBnT0<%?WzPEZg^;=I7a<5XCz+NQx!i3>}VZy@S8u^rk`yi*a=*=oE{_&FV9*PgQNT z^)&hWWeVW={Fj%zz<4HAM6=hwPk7HSmM8UUHv?%rTwvt!q>pK{-Ozaj5L2bP({5sG zZ+*3QWK!@K9Vjn=dFNe`C^d+*lCza7GJHTvQYND#J$!|ifUklm#q1EQ&bh=(lAqk# ze3ve;2!SnGa!i=qCR`EV`D49g>+~85B&`9OI*y)(zfvZO-FsR#?&2njJ&f`mNnSGL z68V7~E=ytvQgP%%Onh$b#t-XJFIYb$c_>~EPTbDY;V-J0f}y=;IB@)ZlRS&9?QEmm z(VB-x2WL)AC`Jg*$PdT?p1*8Vd&5UqEt^jrtR4@ZjhMSoX)U!Kd22FGJLhdXe`U!t zMaDk*U3R0|`tUkjp4#7Ij|bCAmC7|q`ITJb-wUVU8wd4}3<a+yc@!%5hmK#i`KR~+u|V|b^H)v#R;3q=&%J2Cn1RLlnVPwDy^JT z4_biSec&F)cTPF_9GB3azrY{9u?_EULcMk2``_ICQ%TM0^55Rr_E}M81Rm_W`#%|+HsNZ# zllMGv14rOoOWWOoPxljOvgcjTKq215MW-tzP6D(1V~+SJ`y%ahJoo*t8dVEcD?|d1 z)8)lw*cT#I%=cM*LU`!^>L}6HcWkWFmfCtpCt#dN_IVZUd@~!MMy1`7ol#-WR41Is z*tGxAcj?lf^9t% zEyl)vTh>YF`YpzS@cH`dy#CsF)9x1{>CT+Z-1%$c=Io_aI3dmBM9XYX!78(oFiT17 zT6FD!j%C(%Cr+E*ggkEl+4;KQlhLk<@IBZWEnwb?RA^k`B6ya3Z=m#2 zkCmCD9o(V%O>j+WFBw-$QPF+`mfsfZ;$LuL(p>J3PbEneqi3;T)tT$BnW??XKVNqu zFHirktt1fNVaHBUWFv6VLRht# zn{i?pD23Rj3rtd+f9D@4aN}af(x7NdxVmL1{-jjsc!c$*L9GyPU^;S3fcq?vii8~v z&(mveWLVe#!6;TjMHXud!+Q-_o1)$iyPqz#9-UWJa-G{IPmCS-ICnH zJfr4n2pqSXNTurS961UB%0k3spDyBs@=dRF#h@-xcxM}9tJr%BuzBVyQjhQF->Iw& zv)J&yzm52t{x%s>vCNTk5L`qSM;H0=;qNpPs{AZxfgQPckveh5x#!2uWuI>cY7P7h zP^YP<1hOS+2MT-{*8K21+Unhvr>)UJWg0$P`^^$6z}*bQf5p#O@ub+{;V|?BeKe+t46><%llKCxqzVzL6M;@ zbH<8p6Ne{M=TNxOQ}FJOo&Fr@()=rFKqGsL+(IEZX3?X9wSJc9&ST#73m?we)~db} zz+caMUdsBsVkYj$?At#xQ3pVrJo98wDD#Vvt+bDG7$MOnxM9d5w~BTc#+$!L2KW}f z=d&}X4_siBiZS~-sGX#uze5eEb#n(K;o*x%ir$c~G&jybm!3K{Xx@6DLcZ;s`&~ks z1^sSPmrP>YTiN+=I$8t{h@ZD!L6YC7azfR=A%8RUXO|-UGc0AH7i725oV=SSS7+t* zgvMi*?9cuCVt**wyxow(MFm?4MU!>y%CQ2exr`DVrf9&rM1%}Rg5@Pt`GRx%zAyh4 zed21Beci!L^^?T{gP^3u!orQ9wU0y|#zQ*R?AQ7FgzK{hPS(VZ*SNeN`ST-?RHYu3 zRK@MDxbnlrO!rktTxJwqLSM`9s;BtS!Zw;7<+ZWAQ4S?b}GoG}#ua6#-j*jVs0!ll20O&!BRqiVenU<|)PkdoH z7eyb80hqR}_>=pV9v`(##C3P-U*lL5uHlHdZ4#$3;ps{jM}ZnCVK#dBfc9b}1!SZ2 zIW}%S;MxXXw})lV?2fFLSMGNn_SU^`zb%4BKfyE)iuGbYV~>hiNv|YI-&_$P47S;& zgJ?UT&J=M=qA4iKGVS5-wd?2#LJTd>h8#CE(p1SAg0n%@(j3mQ6sqBMnUC1HI74Cf z!6)DjGyD?!g)dN5e=M!&EHuQvu0B+3saC~~CADQA??R|<=SFltTuh%orEn=Dv*q5d=cxil^B(a>g=Icczr*j>mYXWy6Qq91 zRPfIxUbs25R>lrwj)dhp1+^!+Nc%0QKx+o$WMJ6G;#dnehYj5#XsSQ0lWpXOOA&L> zH8bA)*lIya-K^z~JVU6?==deG4^ZKgGZ!{z)U8zLn|I#c#T9-pnpExv6ukw`)*4jP|~v!t@S=7r%ibaHVq@+jz^}4bFk4GC-11^6i|@H?Judc^D@Mr z#6h6kRSyQ3CQIm0aC#be4(Bkh$ya`>mH*iE&eM*QKP>}Vb<*Mc055AF+WOIm^&&E@ zqR3K_jqV((oEu+fL$exg{tjd4FFY0)Y@5iP?T%8x3|jjiFknZwzc!z0g~k@Y#^3GzdO*hC$*pTa$)IUVOVBpiX}UzQaqMU` zll!W#9_U2VZ;CI9P&-4vol6K`&m>o;3WO!c_fg9&RIc<`Y1I(uUb#3YvR5(kzqFB{ zu*<3JXzFzE^=xWzUhNsn(8Ge9UHzZQ@Levn;VGT&C@H`n6LZcnuT|uf#f;={-WD0< zmM)6biM6xhT@_?%;ubu99WDDV>F1|Ezh1RXFk{Pozj^iR&r3H?e^*pkx%pO5;x!Ge zwXI>2?63Eokzqevvcb!={M9O7m#5Quc1}Gd;eWDSn$gv0an))z{ieqk5>IRt)!L~q z63wmJW~mUxE2<-AZzJAx4%kX7D_eKcQ}@Q+U5n!{>P%l3cGl{Q+{yCVPAAR{qQB+^ zoytDXzjo!OOP7~S^6)xbvOMO9OW2K$+_c|y5(l_5f9YPH9(w+J?a$V<%BdGhOP5qF zn^@wiUZbb*_|>C*S=Zmo9BaSMFS4iN=ciTa*92`CWgc(pWk@`8nk^|rNo#q<+$d$Y zpV|k$IPleEEwpIo_ZHx?lizah=cjYE?Axv0-#7pK=F_jVwTp@cI9U3*KJkgK(~IA? z^x?U$)^pdc-n{$xg7^3Lls(Z>5a5uLU02;Z_3G?5pH3e=dhSDBNBOtEy>FM!U09cX z`gtV#9gg2gyo((Sv{$4pW&h1>e*O7$@6-DF_a`t%d0#(2efo60_3Op>`gyDaj;2~Q zCM^4K#`(5QL}hN`Lt`f&zB^Gj<7{o#{fM2}_4*0Z!OIN=zI-|-EkhNYS6(v>jcEqv kZl*>Dpeu-^0%qN3jL$4w|4==u5VRZ5)78&qol`;+0DSybEdT%j literal 0 HcmV?d00001 diff --git a/doc/thirdpartypackages/index.rst b/doc/thirdpartypackages/index.rst index b542b2698a00..68c8685ec7a2 100644 --- a/doc/thirdpartypackages/index.rst +++ b/doc/thirdpartypackages/index.rst @@ -284,6 +284,16 @@ existing table. See the `blume github repository .. image:: /_static/blume_table_example.png + +DNA Features Viewer +=================== + +`DNA Features Viewer `_ +provides methods to plot annotated DNA sequence maps (possibly along other Matplotlib +plots) for Bioinformatics and Synthetic Biology applications. + +.. image:: /_static/dna_features_viewer_screenshot.png + GUI applications **************** From f32f433676e7dbaf28197655f65cbeeefa157774 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Wed, 15 Jan 2020 18:56:54 -0500 Subject: [PATCH 007/113] Backport PR #16235: FIX: AttributeError in TimerBase.start --- lib/matplotlib/backend_bases.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 4c262670f752..e6fb59fe52a7 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -1110,7 +1110,7 @@ def start(self, interval=None): if provided. """ if interval is not None: - self._set_interval(interval) + self.interval = interval self._timer_start() def stop(self): From 3525fe1f6819ba1b27407c2112bc7c429f76ce26 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Wed, 15 Jan 2020 18:56:54 -0500 Subject: [PATCH 008/113] Backport PR #16235: FIX: AttributeError in TimerBase.start --- lib/matplotlib/backend_bases.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 45460bfa5786..e2cc86ec5ef7 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -1103,7 +1103,7 @@ def start(self, interval=None): if provided. """ if interval is not None: - self._set_interval(interval) + self.interval = interval self._timer_start() def stop(self): From 425039a69a1cef18f040e599c482d77abe85093a Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sun, 19 Jan 2020 00:00:07 -0500 Subject: [PATCH 009/113] Backport PR #16259: TST: something changed in pytest 5.3.3 that breaks our qt fixtures --- requirements/testing/travis_all.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/testing/travis_all.txt b/requirements/testing/travis_all.txt index b8983c397f69..7bf8db0dccf8 100644 --- a/requirements/testing/travis_all.txt +++ b/requirements/testing/travis_all.txt @@ -5,7 +5,7 @@ cycler numpy pillow pyparsing -pytest!=4.6.0 +pytest!=4.6.0,!=5.3.3 pytest-cov pytest-rerunfailures pytest-timeout From 9ab0b76440e1131a27c11ca4b9ba1454993310bf Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Thu, 23 Jan 2020 09:21:48 -0800 Subject: [PATCH 010/113] Backport PR #16250: Fix zerolen intersect --- lib/matplotlib/tests/test_path.py | 150 +++++++++++++++++++----------- src/_path.h | 42 +++++---- 2 files changed, 121 insertions(+), 71 deletions(-) diff --git a/lib/matplotlib/tests/test_path.py b/lib/matplotlib/tests/test_path.py index 8d94ca040a1d..4435b2337bef 100644 --- a/lib/matplotlib/tests/test_path.py +++ b/lib/matplotlib/tests/test_path.py @@ -265,81 +265,78 @@ def test_path_deepcopy(): copy.deepcopy(path2) -def test_path_intersect_path(): +@pytest.mark.parametrize('phi', np.concatenate([ + np.array([0, 15, 30, 45, 60, 75, 90, 105, 120, 135]) + delta + for delta in [-1, 0, 1]])) +def test_path_intersect_path(phi): # test for the range of intersection angles - base_angles = np.array([0, 15, 30, 45, 60, 75, 90, 105, 120, 135]) - angles = np.concatenate([base_angles, base_angles + 1, base_angles - 1]) eps_array = [1e-5, 1e-8, 1e-10, 1e-12] - for phi in angles: + transform = transforms.Affine2D().rotate(np.deg2rad(phi)) - transform = transforms.Affine2D().rotate(np.deg2rad(phi)) + # a and b intersect at angle phi + a = Path([(-2, 0), (2, 0)]) + b = transform.transform_path(a) + assert a.intersects_path(b) and b.intersects_path(a) - # a and b intersect at angle phi - a = Path([(-2, 0), (2, 0)]) - b = transform.transform_path(a) - assert a.intersects_path(b) and b.intersects_path(a) + # a and b touch at angle phi at (0, 0) + a = Path([(0, 0), (2, 0)]) + b = transform.transform_path(a) + assert a.intersects_path(b) and b.intersects_path(a) - # a and b touch at angle phi at (0, 0) - a = Path([(0, 0), (2, 0)]) - b = transform.transform_path(a) - assert a.intersects_path(b) and b.intersects_path(a) + # a and b are orthogonal and intersect at (0, 3) + a = transform.transform_path(Path([(0, 1), (0, 3)])) + b = transform.transform_path(Path([(1, 3), (0, 3)])) + assert a.intersects_path(b) and b.intersects_path(a) - # a and b are orthogonal and intersect at (0, 3) - a = transform.transform_path(Path([(0, 1), (0, 3)])) - b = transform.transform_path(Path([(1, 3), (0, 3)])) - assert a.intersects_path(b) and b.intersects_path(a) + # a and b are collinear and intersect at (0, 3) + a = transform.transform_path(Path([(0, 1), (0, 3)])) + b = transform.transform_path(Path([(0, 5), (0, 3)])) + assert a.intersects_path(b) and b.intersects_path(a) - # a and b are collinear and intersect at (0, 3) - a = transform.transform_path(Path([(0, 1), (0, 3)])) - b = transform.transform_path(Path([(0, 5), (0, 3)])) - assert a.intersects_path(b) and b.intersects_path(a) + # self-intersect + assert a.intersects_path(a) - # self-intersect - assert a.intersects_path(a) + # a contains b + a = transform.transform_path(Path([(0, 0), (5, 5)])) + b = transform.transform_path(Path([(1, 1), (3, 3)])) + assert a.intersects_path(b) and b.intersects_path(a) - # a contains b - a = transform.transform_path(Path([(0, 0), (5, 5)])) - b = transform.transform_path(Path([(1, 1), (3, 3)])) - assert a.intersects_path(b) and b.intersects_path(a) + # a and b are collinear but do not intersect + a = transform.transform_path(Path([(0, 1), (0, 5)])) + b = transform.transform_path(Path([(3, 0), (3, 3)])) + assert not a.intersects_path(b) and not b.intersects_path(a) + + # a and b are on the same line but do not intersect + a = transform.transform_path(Path([(0, 1), (0, 5)])) + b = transform.transform_path(Path([(0, 6), (0, 7)])) + assert not a.intersects_path(b) and not b.intersects_path(a) + + # Note: 1e-13 is the absolute tolerance error used for + # `isclose` function from src/_path.h - # a and b are collinear but do not intersect + # a and b are parallel but do not touch + for eps in eps_array: a = transform.transform_path(Path([(0, 1), (0, 5)])) - b = transform.transform_path(Path([(3, 0), (3, 3)])) + b = transform.transform_path(Path([(0 + eps, 1), (0 + eps, 5)])) assert not a.intersects_path(b) and not b.intersects_path(a) - # a and b are on the same line but do not intersect + # a and b are on the same line but do not intersect (really close) + for eps in eps_array: a = transform.transform_path(Path([(0, 1), (0, 5)])) - b = transform.transform_path(Path([(0, 6), (0, 7)])) + b = transform.transform_path(Path([(0, 5 + eps), (0, 7)])) assert not a.intersects_path(b) and not b.intersects_path(a) - # Note: 1e-13 is the absolute tolerance error used for - # `isclose` function from src/_path.h - - # a and b are parallel but do not touch - for eps in eps_array: - a = transform.transform_path(Path([(0, 1), (0, 5)])) - b = transform.transform_path(Path([(0 + eps, 1), (0 + eps, 5)])) - assert not a.intersects_path(b) and not b.intersects_path(a) - - # a and b are on the same line but do not intersect (really close) - for eps in eps_array: - a = transform.transform_path(Path([(0, 1), (0, 5)])) - b = transform.transform_path(Path([(0, 5 + eps), (0, 7)])) - assert not a.intersects_path(b) and not b.intersects_path(a) - - # a and b are on the same line and intersect (really close) - for eps in eps_array: - a = transform.transform_path(Path([(0, 1), (0, 5)])) - b = transform.transform_path(Path([(0, 5 - eps), (0, 7)])) - assert a.intersects_path(b) and b.intersects_path(a) - - # b is the same as a but with an extra point + # a and b are on the same line and intersect (really close) + for eps in eps_array: a = transform.transform_path(Path([(0, 1), (0, 5)])) - b = transform.transform_path(Path([(0, 1), (0, 2), (0, 5)])) + b = transform.transform_path(Path([(0, 5 - eps), (0, 7)])) assert a.intersects_path(b) and b.intersects_path(a) - return + # b is the same as a but with an extra point + a = transform.transform_path(Path([(0, 1), (0, 5)])) + b = transform.transform_path(Path([(0, 1), (0, 2), (0, 5)])) + assert a.intersects_path(b) and b.intersects_path(a) @pytest.mark.parametrize('offset', range(-720, 361, 45)) @@ -352,3 +349,46 @@ def test_full_arc(offset): maxs = np.max(path.vertices, axis=0) np.testing.assert_allclose(mins, -1) np.testing.assert_allclose(maxs, 1) + + +def test_disjoint_zero_length_segment(): + this_path = Path( + np.array([ + [824.85064295, 2056.26489203], + [861.69033931, 2041.00539016], + [868.57864109, 2057.63522175], + [831.73894473, 2072.89472361], + [824.85064295, 2056.26489203]]), + np.array([1, 2, 2, 2, 79], dtype=Path.code_type)) + + outline_path = Path( + np.array([ + [859.91051028, 2165.38461538], + [859.06772495, 2149.30331334], + [859.06772495, 2181.46591743], + [859.91051028, 2165.38461538], + [859.91051028, 2165.38461538]]), + np.array([1, 2, 2, 2, 2], + dtype=Path.code_type)) + + assert not outline_path.intersects_path(this_path) + assert not this_path.intersects_path(outline_path) + + +def test_intersect_zero_length_segment(): + this_path = Path( + np.array([ + [0, 0], + [1, 1], + ])) + + outline_path = Path( + np.array([ + [1, 0], + [.5, .5], + [.5, .5], + [0, 1], + ])) + + assert outline_path.intersects_path(this_path) + assert this_path.intersects_path(outline_path) diff --git a/src/_path.h b/src/_path.h index 4a38aed5a621..edba0db199d3 100644 --- a/src/_path.h +++ b/src/_path.h @@ -814,8 +814,13 @@ int count_bboxes_overlapping_bbox(agg::rect_d &a, BBoxArray &bboxes) } -inline bool isclose(double a, double b, double rtol, double atol) +inline bool isclose(double a, double b) { + // relative and absolute tolerance values are chosen empirically + // it looks the atol value matters here bacause of round-off errors + const double rtol = 1e-10; + const double atol = 1e-13; + // as per python's math.isclose return fabs(a-b) <= fmax(rtol * fmax(fabs(a), fabs(b)), atol); } @@ -830,14 +835,10 @@ inline bool segments_intersect(const double &x1, const double &x4, const double &y4) { - // relative and absolute tolerance values are chosen empirically - // it looks the atol value matters here bacause of round-off errors - const double rtol = 1e-10; - const double atol = 1e-13; // determinant double den = ((y4 - y3) * (x2 - x1)) - ((x4 - x3) * (y2 - y1)); - if (isclose(den, 0.0, rtol, atol)) { // collinear segments + if (isclose(den, 0.0)) { // collinear segments if (x1 == x2 && x2 == x3) { // segments have infinite slope (vertical lines) // and lie on the same line return (fmin(y1, y2) <= fmin(y3, y4) && fmin(y3, y4) <= fmax(y1, y2)) || @@ -845,25 +846,25 @@ inline bool segments_intersect(const double &x1, } else { double intercept = (y1*x2 - y2*x1)*(x4 - x3) - (y3*x4 - y4*x3)*(x1 - x2); - if (isclose(intercept, 0.0, rtol, atol)) { // segments lie on the same line + if (isclose(intercept, 0.0)) { // segments lie on the same line return (fmin(x1, x2) <= fmin(x3, x4) && fmin(x3, x4) <= fmax(x1, x2)) || (fmin(x3, x4) <= fmin(x1, x2) && fmin(x1, x2) <= fmax(x3, x4)); } } - + return false; } - double n1 = ((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3)); - double n2 = ((x2 - x1) * (y1 - y3)) - ((y2 - y1) * (x1 - x3)); + const double n1 = ((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3)); + const double n2 = ((x2 - x1) * (y1 - y3)) - ((y2 - y1) * (x1 - x3)); - double u1 = n1 / den; - double u2 = n2 / den; + const double u1 = n1 / den; + const double u2 = n2 / den; - return ((u1 > 0.0 || isclose(u1, 0.0, rtol, atol)) && - (u1 < 1.0 || isclose(u1, 1.0, rtol, atol)) && - (u2 > 0.0 || isclose(u2, 0.0, rtol, atol)) && - (u2 < 1.0 || isclose(u2, 1.0, rtol, atol))); + return ((u1 > 0.0 || isclose(u1, 0.0)) && + (u1 < 1.0 || isclose(u1, 1.0)) && + (u2 > 0.0 || isclose(u2, 0.0)) && + (u2 < 1.0 || isclose(u2, 1.0))); } template @@ -887,9 +888,18 @@ bool path_intersects_path(PathIterator1 &p1, PathIterator2 &p2) c1.vertex(&x11, &y11); while (c1.vertex(&x12, &y12) != agg::path_cmd_stop) { + // if the segment in path 1 is (almost) 0 length, skip to next vertex + if ((isclose((x11 - x12) * (x11 - x12) + (y11 - y12) * (y11 - y12), 0))){ + continue; + } c2.rewind(0); c2.vertex(&x21, &y21); + while (c2.vertex(&x22, &y22) != agg::path_cmd_stop) { + // if the segment in path 2 is (almost) 0 length, skip to next vertex + if ((isclose((x21 - x22) * (x21 - x22) + (y21 - y22) * (y21 - y22), 0))){ + continue; + } if (segments_intersect(x11, y11, x12, y12, x21, y21, x22, y22)) { return true; } From 47479b04b6718a65ebaac094db106d44b40da509 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Thu, 23 Jan 2020 09:22:38 -0800 Subject: [PATCH 011/113] Backport PR #16300: Don't default to negative radii in polar plot. --- lib/matplotlib/projections/polar.py | 6 ++++++ lib/matplotlib/tests/test_axes.py | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/lib/matplotlib/projections/polar.py b/lib/matplotlib/projections/polar.py index c33fa0560f0b..61f2e5a6a539 100644 --- a/lib/matplotlib/projections/polar.py +++ b/lib/matplotlib/projections/polar.py @@ -398,6 +398,7 @@ class RadialLocator(mticker.Locator): :class:`~matplotlib.ticker.Locator` (which may be different depending on the scale of the *r*-axis. """ + def __init__(self, base, axes=None): self.base = base self._axes = axes @@ -429,6 +430,11 @@ def refresh(self): # docstring inherited return self.base.refresh() + def nonsingular(self, vmin, vmax): + # docstring inherited + return ((0, 1) if (vmin, vmax) == (-np.inf, np.inf) # Init. limits. + else self.base.nonsingular(vmin, vmax)) + def view_limits(self, vmin, vmax): vmin, vmax = self.base.view_limits(vmin, vmax) if vmax > vmin: diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 250a0db047ca..290dfa64664b 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -2211,6 +2211,17 @@ def test_log_scales_invalid(): ax.set_ylim(-1, 10) +def test_polar_no_data(): + plt.subplot(projection="polar") + ax = plt.gca() + assert ax.get_rmin() == 0 and ax.get_rmax() == 1 + plt.close("all") + # Used to behave differently (by triggering an autoscale with no data). + plt.polar() + ax = plt.gca() + assert ax.get_rmin() == 0 and ax.get_rmax() == 1 + + @image_comparison(['stackplot_test_image', 'stackplot_test_image']) def test_stackplot(): fig = plt.figure() From df0e01e031e2e4f238048257d90f94f8a469b374 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Fri, 24 Jan 2020 21:22:06 -0800 Subject: [PATCH 012/113] Backport PR #16311: don't override non-Python signal handlers --- lib/matplotlib/backends/backend_qt5.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_qt5.py b/lib/matplotlib/backends/backend_qt5.py index b36e6564287b..181dcb4843f7 100644 --- a/lib/matplotlib/backends/backend_qt5.py +++ b/lib/matplotlib/backends/backend_qt5.py @@ -1091,9 +1091,11 @@ def trigger_manager_draw(manager): def mainloop(): old_signal = signal.getsignal(signal.SIGINT) # allow SIGINT exceptions to close the plot window. - signal.signal(signal.SIGINT, signal.SIG_DFL) + if old_signal: + signal.signal(signal.SIGINT, signal.SIG_DFL) try: qApp.exec_() finally: # reset the SIGINT exception handler - signal.signal(signal.SIGINT, old_signal) + if old_signal: + signal.signal(signal.SIGINT, old_signal) From 444838eda0ff8a207e83cba56496c28a9861bdea Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Fri, 24 Jan 2020 21:22:06 -0800 Subject: [PATCH 013/113] Backport PR #16311: don't override non-Python signal handlers --- lib/matplotlib/backends/backend_qt5.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_qt5.py b/lib/matplotlib/backends/backend_qt5.py index 4aa4782c96ba..e326a346e969 100644 --- a/lib/matplotlib/backends/backend_qt5.py +++ b/lib/matplotlib/backends/backend_qt5.py @@ -1042,9 +1042,11 @@ def trigger_manager_draw(manager): def mainloop(): old_signal = signal.getsignal(signal.SIGINT) # allow SIGINT exceptions to close the plot window. - signal.signal(signal.SIGINT, signal.SIG_DFL) + if old_signal: + signal.signal(signal.SIGINT, signal.SIG_DFL) try: qApp.exec_() finally: # reset the SIGINT exception handler - signal.signal(signal.SIGINT, old_signal) + if old_signal: + signal.signal(signal.SIGINT, old_signal) From ff04b25634ca6c147d83b60ec341cc33a31ab07e Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Thu, 23 Jan 2020 09:21:48 -0800 Subject: [PATCH 014/113] Backport PR #16250: Fix zerolen intersect Merge pull request #16250 from tacaswell/fix_zerolen_intersect Fix zerolen intersect Also re-factors some tests. Conflicts: lib/matplotlib/tests/test_path.py - unrelated change to test above new test. Kept old version of test and added new test --- lib/matplotlib/tests/test_path.py | 150 +++++++++++++++++++----------- src/_path.h | 42 +++++---- 2 files changed, 121 insertions(+), 71 deletions(-) diff --git a/lib/matplotlib/tests/test_path.py b/lib/matplotlib/tests/test_path.py index 452413f842ec..a33c52949c3c 100644 --- a/lib/matplotlib/tests/test_path.py +++ b/lib/matplotlib/tests/test_path.py @@ -273,81 +273,78 @@ def test_path_deepcopy(): copy.deepcopy(path2) -def test_path_intersect_path(): +@pytest.mark.parametrize('phi', np.concatenate([ + np.array([0, 15, 30, 45, 60, 75, 90, 105, 120, 135]) + delta + for delta in [-1, 0, 1]])) +def test_path_intersect_path(phi): # test for the range of intersection angles - base_angles = np.array([0, 15, 30, 45, 60, 75, 90, 105, 120, 135]) - angles = np.concatenate([base_angles, base_angles + 1, base_angles - 1]) eps_array = [1e-5, 1e-8, 1e-10, 1e-12] - for phi in angles: + transform = transforms.Affine2D().rotate(np.deg2rad(phi)) - transform = transforms.Affine2D().rotate(np.deg2rad(phi)) + # a and b intersect at angle phi + a = Path([(-2, 0), (2, 0)]) + b = transform.transform_path(a) + assert a.intersects_path(b) and b.intersects_path(a) - # a and b intersect at angle phi - a = Path([(-2, 0), (2, 0)]) - b = transform.transform_path(a) - assert a.intersects_path(b) and b.intersects_path(a) + # a and b touch at angle phi at (0, 0) + a = Path([(0, 0), (2, 0)]) + b = transform.transform_path(a) + assert a.intersects_path(b) and b.intersects_path(a) - # a and b touch at angle phi at (0, 0) - a = Path([(0, 0), (2, 0)]) - b = transform.transform_path(a) - assert a.intersects_path(b) and b.intersects_path(a) + # a and b are orthogonal and intersect at (0, 3) + a = transform.transform_path(Path([(0, 1), (0, 3)])) + b = transform.transform_path(Path([(1, 3), (0, 3)])) + assert a.intersects_path(b) and b.intersects_path(a) - # a and b are orthogonal and intersect at (0, 3) - a = transform.transform_path(Path([(0, 1), (0, 3)])) - b = transform.transform_path(Path([(1, 3), (0, 3)])) - assert a.intersects_path(b) and b.intersects_path(a) + # a and b are collinear and intersect at (0, 3) + a = transform.transform_path(Path([(0, 1), (0, 3)])) + b = transform.transform_path(Path([(0, 5), (0, 3)])) + assert a.intersects_path(b) and b.intersects_path(a) - # a and b are collinear and intersect at (0, 3) - a = transform.transform_path(Path([(0, 1), (0, 3)])) - b = transform.transform_path(Path([(0, 5), (0, 3)])) - assert a.intersects_path(b) and b.intersects_path(a) + # self-intersect + assert a.intersects_path(a) - # self-intersect - assert a.intersects_path(a) + # a contains b + a = transform.transform_path(Path([(0, 0), (5, 5)])) + b = transform.transform_path(Path([(1, 1), (3, 3)])) + assert a.intersects_path(b) and b.intersects_path(a) - # a contains b - a = transform.transform_path(Path([(0, 0), (5, 5)])) - b = transform.transform_path(Path([(1, 1), (3, 3)])) - assert a.intersects_path(b) and b.intersects_path(a) + # a and b are collinear but do not intersect + a = transform.transform_path(Path([(0, 1), (0, 5)])) + b = transform.transform_path(Path([(3, 0), (3, 3)])) + assert not a.intersects_path(b) and not b.intersects_path(a) + + # a and b are on the same line but do not intersect + a = transform.transform_path(Path([(0, 1), (0, 5)])) + b = transform.transform_path(Path([(0, 6), (0, 7)])) + assert not a.intersects_path(b) and not b.intersects_path(a) + + # Note: 1e-13 is the absolute tolerance error used for + # `isclose` function from src/_path.h - # a and b are collinear but do not intersect + # a and b are parallel but do not touch + for eps in eps_array: a = transform.transform_path(Path([(0, 1), (0, 5)])) - b = transform.transform_path(Path([(3, 0), (3, 3)])) + b = transform.transform_path(Path([(0 + eps, 1), (0 + eps, 5)])) assert not a.intersects_path(b) and not b.intersects_path(a) - # a and b are on the same line but do not intersect + # a and b are on the same line but do not intersect (really close) + for eps in eps_array: a = transform.transform_path(Path([(0, 1), (0, 5)])) - b = transform.transform_path(Path([(0, 6), (0, 7)])) + b = transform.transform_path(Path([(0, 5 + eps), (0, 7)])) assert not a.intersects_path(b) and not b.intersects_path(a) - # Note: 1e-13 is the absolute tolerance error used for - # `isclose` function from src/_path.h - - # a and b are parallel but do not touch - for eps in eps_array: - a = transform.transform_path(Path([(0, 1), (0, 5)])) - b = transform.transform_path(Path([(0 + eps, 1), (0 + eps, 5)])) - assert not a.intersects_path(b) and not b.intersects_path(a) - - # a and b are on the same line but do not intersect (really close) - for eps in eps_array: - a = transform.transform_path(Path([(0, 1), (0, 5)])) - b = transform.transform_path(Path([(0, 5 + eps), (0, 7)])) - assert not a.intersects_path(b) and not b.intersects_path(a) - - # a and b are on the same line and intersect (really close) - for eps in eps_array: - a = transform.transform_path(Path([(0, 1), (0, 5)])) - b = transform.transform_path(Path([(0, 5 - eps), (0, 7)])) - assert a.intersects_path(b) and b.intersects_path(a) - - # b is the same as a but with an extra point + # a and b are on the same line and intersect (really close) + for eps in eps_array: a = transform.transform_path(Path([(0, 1), (0, 5)])) - b = transform.transform_path(Path([(0, 1), (0, 2), (0, 5)])) + b = transform.transform_path(Path([(0, 5 - eps), (0, 7)])) assert a.intersects_path(b) and b.intersects_path(a) - return + # b is the same as a but with an extra point + a = transform.transform_path(Path([(0, 1), (0, 5)])) + b = transform.transform_path(Path([(0, 1), (0, 2), (0, 5)])) + assert a.intersects_path(b) and b.intersects_path(a) @pytest.mark.parametrize('offset', range(-720, 361, 45)) @@ -360,3 +357,46 @@ def test_full_arc(offset): maxs = np.max(path.vertices, axis=0) np.testing.assert_allclose(mins, -1) assert np.allclose(maxs, 1) + + +def test_disjoint_zero_length_segment(): + this_path = Path( + np.array([ + [824.85064295, 2056.26489203], + [861.69033931, 2041.00539016], + [868.57864109, 2057.63522175], + [831.73894473, 2072.89472361], + [824.85064295, 2056.26489203]]), + np.array([1, 2, 2, 2, 79], dtype=Path.code_type)) + + outline_path = Path( + np.array([ + [859.91051028, 2165.38461538], + [859.06772495, 2149.30331334], + [859.06772495, 2181.46591743], + [859.91051028, 2165.38461538], + [859.91051028, 2165.38461538]]), + np.array([1, 2, 2, 2, 2], + dtype=Path.code_type)) + + assert not outline_path.intersects_path(this_path) + assert not this_path.intersects_path(outline_path) + + +def test_intersect_zero_length_segment(): + this_path = Path( + np.array([ + [0, 0], + [1, 1], + ])) + + outline_path = Path( + np.array([ + [1, 0], + [.5, .5], + [.5, .5], + [0, 1], + ])) + + assert outline_path.intersects_path(this_path) + assert this_path.intersects_path(outline_path) diff --git a/src/_path.h b/src/_path.h index 4a38aed5a621..edba0db199d3 100644 --- a/src/_path.h +++ b/src/_path.h @@ -814,8 +814,13 @@ int count_bboxes_overlapping_bbox(agg::rect_d &a, BBoxArray &bboxes) } -inline bool isclose(double a, double b, double rtol, double atol) +inline bool isclose(double a, double b) { + // relative and absolute tolerance values are chosen empirically + // it looks the atol value matters here bacause of round-off errors + const double rtol = 1e-10; + const double atol = 1e-13; + // as per python's math.isclose return fabs(a-b) <= fmax(rtol * fmax(fabs(a), fabs(b)), atol); } @@ -830,14 +835,10 @@ inline bool segments_intersect(const double &x1, const double &x4, const double &y4) { - // relative and absolute tolerance values are chosen empirically - // it looks the atol value matters here bacause of round-off errors - const double rtol = 1e-10; - const double atol = 1e-13; // determinant double den = ((y4 - y3) * (x2 - x1)) - ((x4 - x3) * (y2 - y1)); - if (isclose(den, 0.0, rtol, atol)) { // collinear segments + if (isclose(den, 0.0)) { // collinear segments if (x1 == x2 && x2 == x3) { // segments have infinite slope (vertical lines) // and lie on the same line return (fmin(y1, y2) <= fmin(y3, y4) && fmin(y3, y4) <= fmax(y1, y2)) || @@ -845,25 +846,25 @@ inline bool segments_intersect(const double &x1, } else { double intercept = (y1*x2 - y2*x1)*(x4 - x3) - (y3*x4 - y4*x3)*(x1 - x2); - if (isclose(intercept, 0.0, rtol, atol)) { // segments lie on the same line + if (isclose(intercept, 0.0)) { // segments lie on the same line return (fmin(x1, x2) <= fmin(x3, x4) && fmin(x3, x4) <= fmax(x1, x2)) || (fmin(x3, x4) <= fmin(x1, x2) && fmin(x1, x2) <= fmax(x3, x4)); } } - + return false; } - double n1 = ((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3)); - double n2 = ((x2 - x1) * (y1 - y3)) - ((y2 - y1) * (x1 - x3)); + const double n1 = ((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3)); + const double n2 = ((x2 - x1) * (y1 - y3)) - ((y2 - y1) * (x1 - x3)); - double u1 = n1 / den; - double u2 = n2 / den; + const double u1 = n1 / den; + const double u2 = n2 / den; - return ((u1 > 0.0 || isclose(u1, 0.0, rtol, atol)) && - (u1 < 1.0 || isclose(u1, 1.0, rtol, atol)) && - (u2 > 0.0 || isclose(u2, 0.0, rtol, atol)) && - (u2 < 1.0 || isclose(u2, 1.0, rtol, atol))); + return ((u1 > 0.0 || isclose(u1, 0.0)) && + (u1 < 1.0 || isclose(u1, 1.0)) && + (u2 > 0.0 || isclose(u2, 0.0)) && + (u2 < 1.0 || isclose(u2, 1.0))); } template @@ -887,9 +888,18 @@ bool path_intersects_path(PathIterator1 &p1, PathIterator2 &p2) c1.vertex(&x11, &y11); while (c1.vertex(&x12, &y12) != agg::path_cmd_stop) { + // if the segment in path 1 is (almost) 0 length, skip to next vertex + if ((isclose((x11 - x12) * (x11 - x12) + (y11 - y12) * (y11 - y12), 0))){ + continue; + } c2.rewind(0); c2.vertex(&x21, &y21); + while (c2.vertex(&x22, &y22) != agg::path_cmd_stop) { + // if the segment in path 2 is (almost) 0 length, skip to next vertex + if ((isclose((x21 - x22) * (x21 - x22) + (y21 - y22) * (y21 - y22), 0))){ + continue; + } if (segments_intersect(x11, y11, x12, y12, x21, y21, x22, y22)) { return true; } From 843fcfc2417d28981f10f511d2de386c21666167 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sat, 25 Jan 2020 15:19:54 +0100 Subject: [PATCH 015/113] Backport PR #16323: Add sphinx doc for Axis.axis_name. --- lib/matplotlib/axis.py | 4 ++-- lib/matplotlib/projections/polar.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index c98f7082907f..ada3b99d89c7 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -1914,7 +1914,7 @@ def setter(self, vmin, vmax, ignore=False): class XAxis(Axis): __name__ = 'xaxis' - axis_name = 'x' + axis_name = 'x' #: Read-only name identifying the axis. def contains(self, mouseevent): """Test whether the mouse event occurred in the x axis. @@ -2199,7 +2199,7 @@ def get_tick_space(self): class YAxis(Axis): __name__ = 'yaxis' - axis_name = 'y' + axis_name = 'y' #: Read-only name identifying the axis. def contains(self, mouseevent): """Test whether the mouse event occurred in the y axis. diff --git a/lib/matplotlib/projections/polar.py b/lib/matplotlib/projections/polar.py index 61f2e5a6a539..00692801d85d 100644 --- a/lib/matplotlib/projections/polar.py +++ b/lib/matplotlib/projections/polar.py @@ -352,7 +352,7 @@ class ThetaAxis(maxis.XAxis): for an angular axis. """ __name__ = 'thetaaxis' - axis_name = 'theta' + axis_name = 'theta' #: Read-only name identifying the axis. def _get_tick(self, major): if major: @@ -665,7 +665,7 @@ class RadialAxis(maxis.YAxis): for a radial axis. """ __name__ = 'radialaxis' - axis_name = 'radius' + axis_name = 'radius' #: Read-only name identifying the axis. def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) From 2d27b53de3f884dd8bdaf5d8c1833aca91ebcefc Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Thu, 7 Nov 2019 21:40:19 +0000 Subject: [PATCH 016/113] Backport PR #15462: Simplify azure setup. --- azure-pipelines.yml | 157 +++++++++++++++++++++++------------ ci/azure-pipelines-steps.yml | 93 --------------------- 2 files changed, 103 insertions(+), 147 deletions(-) delete mode 100644 ci/azure-pipelines-steps.yml diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1b71826d38f3..63ae82ca58d8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -3,57 +3,106 @@ # Add steps that analyze code, save the dist with the build record, publish to a PyPI-compatible index, and more: # https://docs.microsoft.com/azure/devops/pipelines/languages/python -jobs: - -- job: 'Linux_Test' - pool: - vmImage: ubuntu-16.04 - strategy: - matrix: - Python36: - python.version: '3.6' - Python37: - python.version: '3.7' - maxParallel: 4 - - steps: - - template: ci/azure-pipelines-steps.yml - parameters: - platform: ubuntu - installer: apt - -- job: 'Windows_Test' - pool: - vmImage: vs2017-win2016 - strategy: - matrix: - Python36: - python.version: '3.6' - Python37: - python.version: '3.7' - PythonPreview: - python.version: 'Pre' - maxParallel: 4 - - steps: - - template: ci/azure-pipelines-steps.yml - parameters: - platform: windows - installer: nuget - -- job: 'macOS_Test' - pool: - vmImage: xcode9-macos10.13 - strategy: - matrix: - Python36: - python.version: '3.6' - Python37: - python.version: '3.7' - maxParallel: 4 - - steps: - - template: ci/azure-pipelines-steps.yml - parameters: - platform: macos - installer: brew +strategy: + matrix: + Linux_py36: + vmImage: 'ubuntu-16.04' + python.version: '3.6' + Linux_py37: + vmImage: 'ubuntu-16.04' + python.version: '3.7' + macOS_py36: + vmImage: 'xcode9-macOS10.13' + python.version: '3.6' + macOS_py37: + vmImage: 'xcode9-macOS10.13' + python.version: '3.7' + Windows_py36: + vmImage: 'vs2017-win2016' + python.version: '3.6' + Windows_py37: + vmImage: 'vs2017-win2016' + python.version: '3.7' + Windows_pyPre: + vmImage: 'vs2017-win2016' + python.version: 'Pre' + maxParallel: 4 + +pool: + vmImage: '$(vmImage)' + +steps: + +- task: UsePythonVersion@0 + inputs: + versionSpec: '$(python.version)' + architecture: 'x64' + displayName: 'Use Python $(python.version)' + condition: and(succeeded(), ne(variables['python.version'], 'Pre')) + +- task: stevedower.python.InstallPython.InstallPython@1 + displayName: 'Use prerelease Python' + inputs: + prerelease: true + condition: and(succeeded(), eq(variables['python.version'], 'Pre')) + +- bash: | + case "$(python -c 'import sys; print(sys.platform)')" in + linux) + sudo apt-get update + sudo apt-get install \ + cm-super \ + dvipng \ + ffmpeg \ + gdb \ + gir1.2-gtk-3.0 \ + graphviz \ + inkscape \ + libcairo2 \ + libgeos-dev \ + libgirepository-1.0.1 \ + lmodern \ + otf-freefont \ + pgf \ + texlive-fonts-recommended \ + texlive-latex-base \ + texlive-latex-extra \ + texlive-latex-recommended \ + texlive-xetex texlive-luatex + ;; + darwin) + brew cask install xquartz + brew install pkg-config ffmpeg imagemagick mplayer ccache + ;; + win32) + ;; + *) + exit 1 + ;; + esac + displayName: 'Install dependencies' + +- bash: | + python -m pip install --upgrade pip + python -m pip install -r requirements/testing/travis_all.txt -r requirements/testing/travis36.txt || + [[ "$PYTHON_VERSION" = 'Pre' ]] + displayName: 'Install dependencies with pip' + +- bash: | + python -m pip install -ve . || + [[ "$PYTHON_VERSION" = 'Pre' ]] + displayName: "Install self" + +- script: env + displayName: 'print env' + +- bash: | + PYTHONFAULTHANDLER=1 python -m pytest --junitxml=junit/test-results.xml -raR --maxfail=50 --timeout=300 --durations=25 --cov-report= --cov=lib -n 2 || + [[ "$PYTHON_VERSION" = 'Pre' ]] + displayName: 'pytest' + +- task: PublishTestResults@2 + inputs: + testResultsFiles: '**/test-results.xml' + testRunTitle: 'Python $(python.version)' + condition: succeededOrFailed() diff --git a/ci/azure-pipelines-steps.yml b/ci/azure-pipelines-steps.yml deleted file mode 100644 index 756c037eb8fd..000000000000 --- a/ci/azure-pipelines-steps.yml +++ /dev/null @@ -1,93 +0,0 @@ -parameters: - platform: none - installer: none - -steps: -- task: UsePythonVersion@0 - inputs: - versionSpec: '$(python.version)' - architecture: 'x64' - displayName: 'Use Python $(python.version)' - condition: and(succeeded(), ne(variables['python.version'], 'Pre')) - -- task: stevedower.python.InstallPython.InstallPython@1 - displayName: 'Use prerelease Python' - inputs: - prerelease: true - condition: and(succeeded(), eq(variables['python.version'], 'Pre')) - -- ${{ if eq(parameters.installer, 'nuget') }}: - - task: NuGetToolInstaller@0 - displayName: 'Use latest available Nuget' - - - script: | - nuget install libpng-msvc14-x64 -ExcludeVersion -OutputDirectory "$(build.BinariesDirectory)" - nuget install zlib-msvc14-x64 -ExcludeVersion -OutputDirectory "$(build.BinariesDirectory)" - echo ##vso[task.prependpath]$(build.BinariesDirectory)\libpng-msvc14-x64\build\native\bin_release - echo ##vso[task.prependpath]$(build.BinariesDirectory)\zlib-msvc14-x64\build\native\bin_release - echo ##vso[task.setvariable variable=CL]/I$(build.BinariesDirectory)\libpng-msvc14-x64\build\native\include /I$(build.BinariesDirectory)\zlib-msvc14-x64\build\native\include - echo ##vso[task.setvariable variable=LINK]/LIBPATH:$(build.BinariesDirectory)\libpng-msvc14-x64\build\native\lib_release /LIBPATH:$(build.BinariesDirectory)\zlib-msvc14-x64\build\native\lib_release - - displayName: 'Install dependencies with nuget' - -- ${{ if eq(parameters.installer, 'brew') }}: - - script: | - brew cask install xquartz - brew install pkg-config ffmpeg imagemagick mplayer ccache - displayName: 'Install dependencies with brew' - -- ${{ if eq(parameters.installer, 'apt') }}: - - script: | - sudo apt-add-repository ppa:jonathonf/ffmpeg-3 - sudo apt-get update - sudo apt-get install \ - cm-super \ - dvipng \ - ffmpeg \ - gdb \ - gir1.2-gtk-3.0 \ - graphviz \ - inkscape \ - libcairo2 \ - libgeos-dev \ - libgirepository-1.0.1 \ - lmodern \ - otf-freefont \ - pgf \ - texlive-fonts-recommended \ - texlive-latex-base \ - texlive-latex-extra \ - texlive-latex-recommended \ - texlive-xetex texlive-luatex - displayName: 'Install dependencies with apt' - -- script: | - - python -m pip install --upgrade pip - pip install -r requirements/testing/travis_all.txt -r requirements/testing/travis36.txt - - displayName: 'Install dependencies with pip' - -- script: | - - pip install -ve . - - displayName: "Install self" - env: - MPLLOCALFREETYPE: 1 - -- script: env - displayName: 'print env' - -- script: | - env - pytest --junitxml=junit/test-results.xml -raR --maxfail=50 --timeout=300 --durations=25 --cov-report= --cov=lib -n 2 - displayName: 'pytest' - env: - PYTHONFAULTHANDLER: 1 - -- task: PublishTestResults@2 - inputs: - testResultsFiles: '**/test-results.xml' - testRunTitle: 'Python $(python.version)' - condition: succeededOrFailed() From b1a64b495216351cd511f7b3c6b1eb9d8a6c9eab Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sat, 25 Jan 2020 09:24:01 +0100 Subject: [PATCH 017/113] Backport PR #16308: CI: Use Ubuntu Bionic compatible package names --- .travis.yml | 4 ++-- azure-pipelines.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index eb962831546b..b51f9027d9bc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,8 +36,8 @@ addons: - libgeos-dev - libgirepository1.0-dev - lmodern - - otf-freefont - - pgf + - fonts-freefont-otf + - texlive-pictures - pkg-config - qtbase5-dev - texlive-fonts-recommended diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 63ae82ca58d8..8b32707ed13d 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -62,8 +62,8 @@ steps: libgeos-dev \ libgirepository-1.0.1 \ lmodern \ - otf-freefont \ - pgf \ + fonts-freefont-otf \ + texlive-pictures \ texlive-fonts-recommended \ texlive-latex-base \ texlive-latex-extra \ From 12004eda6ab4192511f5f6727980e106038fdde5 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 27 Jan 2020 13:41:23 -0500 Subject: [PATCH 018/113] Backport PR #16298: Don't recursively call draw_idle when updating artists at draw time. --- lib/matplotlib/backend_bases.py | 6 ++++-- lib/matplotlib/backends/backend_qt5.py | 21 +++++++++++---------- lib/matplotlib/pyplot.py | 11 +++++++++-- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index e6fb59fe52a7..3736fe28db7b 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -1640,8 +1640,10 @@ def _fix_ipython_backend2gui(cls): @contextmanager def _idle_draw_cntx(self): self._is_idle_drawing = True - yield - self._is_idle_drawing = False + try: + yield + finally: + self._is_idle_drawing = False def is_saving(self): """ diff --git a/lib/matplotlib/backends/backend_qt5.py b/lib/matplotlib/backends/backend_qt5.py index 181dcb4843f7..66a685eee223 100644 --- a/lib/matplotlib/backends/backend_qt5.py +++ b/lib/matplotlib/backends/backend_qt5.py @@ -498,16 +498,17 @@ def draw_idle(self): QtCore.QTimer.singleShot(0, self._draw_idle) def _draw_idle(self): - if not self._draw_pending: - return - self._draw_pending = False - if self.height() < 0 or self.width() < 0: - return - try: - self.draw() - except Exception: - # Uncaught exceptions are fatal for PyQt5, so catch them instead. - traceback.print_exc() + with self._idle_draw_cntx(): + if not self._draw_pending: + return + self._draw_pending = False + if self.height() < 0 or self.width() < 0: + return + try: + self.draw() + except Exception: + # Uncaught exceptions are fatal for PyQt5, so catch them. + traceback.print_exc() def drawRectangle(self, rect): # Draw the zoom rectangle to the QPainter. _draw_rect_callback needs diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 88d13ed3eab4..0313ee6ac3c8 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -585,8 +585,15 @@ def _auto_draw_if_interactive(fig, val): fig : Figure A figure object which is assumed to be associated with a canvas """ - if val and matplotlib.is_interactive() and not fig.canvas.is_saving(): - fig.canvas.draw_idle() + if (val and matplotlib.is_interactive() + and not fig.canvas.is_saving() + and not fig.canvas._is_idle_drawing): + # Some artists can mark themselves as stale in the middle of drawing + # (e.g. axes position & tick labels being computed at draw time), but + # this shouldn't trigger a redraw because the current redraw will + # already take them into account. + with fig.canvas._idle_draw_cntx(): + fig.canvas.draw_idle() def gcf(): From e90e8ec6dcd3f600aa86890f056f3e1d74f05c26 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 27 Jan 2020 13:41:23 -0500 Subject: [PATCH 019/113] Backport PR #16298: Don't recursively call draw_idle when updating artists at draw time. --- lib/matplotlib/backend_bases.py | 6 ++++-- lib/matplotlib/backends/backend_qt5.py | 21 +++++++++++---------- lib/matplotlib/pyplot.py | 11 +++++++++-- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index e2cc86ec5ef7..0c85673b2b10 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -1652,8 +1652,10 @@ def _fix_ipython_backend2gui(cls): @contextmanager def _idle_draw_cntx(self): self._is_idle_drawing = True - yield - self._is_idle_drawing = False + try: + yield + finally: + self._is_idle_drawing = False def is_saving(self): """ diff --git a/lib/matplotlib/backends/backend_qt5.py b/lib/matplotlib/backends/backend_qt5.py index e326a346e969..ee15bfbf369d 100644 --- a/lib/matplotlib/backends/backend_qt5.py +++ b/lib/matplotlib/backends/backend_qt5.py @@ -481,16 +481,17 @@ def draw_idle(self): QtCore.QTimer.singleShot(0, self._draw_idle) def _draw_idle(self): - if not self._draw_pending: - return - self._draw_pending = False - if self.height() < 0 or self.width() < 0: - return - try: - self.draw() - except Exception: - # Uncaught exceptions are fatal for PyQt5, so catch them instead. - traceback.print_exc() + with self._idle_draw_cntx(): + if not self._draw_pending: + return + self._draw_pending = False + if self.height() < 0 or self.width() < 0: + return + try: + self.draw() + except Exception: + # Uncaught exceptions are fatal for PyQt5, so catch them. + traceback.print_exc() def drawRectangle(self, rect): # Draw the zoom rectangle to the QPainter. _draw_rect_callback needs diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 8c8ddbe947a2..1d28260ef328 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -586,8 +586,15 @@ def _auto_draw_if_interactive(fig, val): fig : Figure A figure object which is assumed to be associated with a canvas """ - if val and matplotlib.is_interactive() and not fig.canvas.is_saving(): - fig.canvas.draw_idle() + if (val and matplotlib.is_interactive() + and not fig.canvas.is_saving() + and not fig.canvas._is_idle_drawing): + # Some artists can mark themselves as stale in the middle of drawing + # (e.g. axes position & tick labels being computed at draw time), but + # this shouldn't trigger a redraw because the current redraw will + # already take them into account. + with fig.canvas._idle_draw_cntx(): + fig.canvas.draw_idle() def gcf(): From 85d8d05fcffa57bb02140945263cad728d68b988 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Mon, 27 Jan 2020 12:05:29 -0800 Subject: [PATCH 020/113] Backport PR #16255: Move version info to sidebar --- doc/_static/mpl.css | 7 +++-- doc/_templates/sidebar_versions.html | 38 ++++++++++++++++++++++++ doc/conf.py | 3 +- doc/index.rst | 43 ---------------------------- 4 files changed, 44 insertions(+), 47 deletions(-) create mode 100644 doc/_templates/sidebar_versions.html diff --git a/doc/_static/mpl.css b/doc/_static/mpl.css index d2b46174f798..dd5d15fac594 100644 --- a/doc/_static/mpl.css +++ b/doc/_static/mpl.css @@ -1133,15 +1133,16 @@ div.viewcode-block:target { } -.sidebar-announcement { +.sidebar-announcement, +.sidebar-versions { border: 1px solid #11557C; background: #eff9ff; - padding: 2px; + padding: 0.2em 0.5em; margin-top: 1em; } .sidebar-announcement p { - margin: 0.4em 0.4em 0.6em 0.4em; + margin: 0.4em 0 0.6em 0; } /* new main nav */ diff --git a/doc/_templates/sidebar_versions.html b/doc/_templates/sidebar_versions.html new file mode 100644 index 000000000000..35a965661d90 --- /dev/null +++ b/doc/_templates/sidebar_versions.html @@ -0,0 +1,38 @@ + diff --git a/doc/conf.py b/doc/conf.py index 4e36b7a1acee..a52bdf2341b4 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -249,7 +249,8 @@ def _check_dependencies(): # Custom sidebar templates, maps page names to templates. html_sidebars = { - 'index': ['sidebar_announcement.html', 'donate_sidebar.html'], + 'index': ['sidebar_announcement.html', 'sidebar_versions.html', + 'donate_sidebar.html'], '**': ['localtoc.html', 'relations.html', 'pagesource.html'] } diff --git a/doc/index.rst b/doc/index.rst index dc947dcac686..cb9c02f4e860 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -49,51 +49,8 @@ oriented interface or via a set of functions familiar to MATLAB users. Documentation ------------- -This is the documentation for Matplotlib version |version|. - To get started, read the :doc:`User's Guide `. -.. raw:: html - -

- - - Trying to learn how to do a particular kind of plot? Check out the :doc:`examples gallery ` or the :doc:`list of plotting commands `. From 4e8a5b74c13f8051803fb55204f5b52bc6294ee0 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Mon, 27 Jan 2020 12:05:29 -0800 Subject: [PATCH 021/113] Backport PR #16255: Move version info to sidebar --- doc/_static/mpl.css | 7 +++-- doc/_templates/sidebar_versions.html | 38 ++++++++++++++++++++++++ doc/conf.py | 3 +- doc/index.rst | 43 ---------------------------- 4 files changed, 44 insertions(+), 47 deletions(-) create mode 100644 doc/_templates/sidebar_versions.html diff --git a/doc/_static/mpl.css b/doc/_static/mpl.css index ff45cf7c8a18..590835cf7d28 100644 --- a/doc/_static/mpl.css +++ b/doc/_static/mpl.css @@ -1133,15 +1133,16 @@ div.viewcode-block:target { } -.sidebar-announcement { +.sidebar-announcement, +.sidebar-versions { border: 1px solid #11557C; background: #eff9ff; - padding: 2px; + padding: 0.2em 0.5em; margin-top: 1em; } .sidebar-announcement p { - margin: 0.4em 0.4em 0.6em 0.4em; + margin: 0.4em 0 0.6em 0; } /* new main nav */ diff --git a/doc/_templates/sidebar_versions.html b/doc/_templates/sidebar_versions.html new file mode 100644 index 000000000000..35a965661d90 --- /dev/null +++ b/doc/_templates/sidebar_versions.html @@ -0,0 +1,38 @@ + diff --git a/doc/conf.py b/doc/conf.py index dbdbd0ee9278..6cebe749aa16 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -258,7 +258,8 @@ def _check_dependencies(): # Custom sidebar templates, maps page names to templates. html_sidebars = { - 'index': ['sidebar_announcement.html', 'donate_sidebar.html'], + 'index': ['sidebar_announcement.html', 'sidebar_versions.html', + 'donate_sidebar.html'], '**': ['localtoc.html', 'relations.html', 'pagesource.html'] } diff --git a/doc/index.rst b/doc/index.rst index cc6f28e754d4..c630e808468f 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -49,51 +49,8 @@ oriented interface or via a set of functions familiar to MATLAB users. Documentation ------------- -This is the documentation for Matplotlib version |version|. - To get started, read the :doc:`User's Guide `. -.. raw:: html - -

- - - Trying to learn how to do a particular kind of plot? Check out the :doc:`examples gallery ` or the :doc:`list of plotting commands `. From a01ca175deae8a8afa4f9a7102da0f30e1205e4b Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Tue, 28 Jan 2020 17:54:04 +0100 Subject: [PATCH 022/113] Backport PR #16330: Clearer signal handling --- lib/matplotlib/backends/backend_qt5.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_qt5.py b/lib/matplotlib/backends/backend_qt5.py index 66a685eee223..91376ba230d5 100644 --- a/lib/matplotlib/backends/backend_qt5.py +++ b/lib/matplotlib/backends/backend_qt5.py @@ -1092,11 +1092,12 @@ def trigger_manager_draw(manager): def mainloop(): old_signal = signal.getsignal(signal.SIGINT) # allow SIGINT exceptions to close the plot window. - if old_signal: + is_python_signal_handler = old_signal is not None + if is_python_signal_handler: signal.signal(signal.SIGINT, signal.SIG_DFL) try: qApp.exec_() finally: # reset the SIGINT exception handler - if old_signal: + if is_python_signal_handler: signal.signal(signal.SIGINT, old_signal) From 2964320169db8c52fed6cd4ebf6457f2cf2b8d08 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Tue, 28 Jan 2020 17:54:04 +0100 Subject: [PATCH 023/113] Backport PR #16330: Clearer signal handling --- lib/matplotlib/backends/backend_qt5.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_qt5.py b/lib/matplotlib/backends/backend_qt5.py index ee15bfbf369d..b2bd2d564a39 100644 --- a/lib/matplotlib/backends/backend_qt5.py +++ b/lib/matplotlib/backends/backend_qt5.py @@ -1043,11 +1043,12 @@ def trigger_manager_draw(manager): def mainloop(): old_signal = signal.getsignal(signal.SIGINT) # allow SIGINT exceptions to close the plot window. - if old_signal: + is_python_signal_handler = old_signal is not None + if is_python_signal_handler: signal.signal(signal.SIGINT, signal.SIG_DFL) try: qApp.exec_() finally: # reset the SIGINT exception handler - if old_signal: + if is_python_signal_handler: signal.signal(signal.SIGINT, old_signal) From ff8b1a943d61b22ccad2e5ffd59893f0fc4fba69 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Tue, 28 Jan 2020 15:20:18 -0800 Subject: [PATCH 024/113] Backport PR #16347: FIX: catch warnings from pandas in cbook._check_1d --- lib/matplotlib/cbook/__init__.py | 32 ++++++++++++++++++++++++++----- lib/matplotlib/tests/test_axes.py | 9 +++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/cbook/__init__.py b/lib/matplotlib/cbook/__init__.py index acf6b8fe54ae..d6fcf855f487 100644 --- a/lib/matplotlib/cbook/__init__.py +++ b/lib/matplotlib/cbook/__init__.py @@ -1326,11 +1326,33 @@ def _check_1d(x): return np.atleast_1d(x) else: try: - ndim = x[:, None].ndim - # work around https://github.com/pandas-dev/pandas/issues/27775 - # which mean the shape is not as expected. That this ever worked - # was an unintentional quirk of pandas the above line will raise - # an exception in the future. + # work around + # https://github.com/pandas-dev/pandas/issues/27775 which + # means the shape of multi-dimensional slicing is not as + # expected. That this ever worked was an unintentional + # quirk of pandas and will raise an exception in the + # future. This slicing warns in pandas >= 1.0rc0 via + # https://github.com/pandas-dev/pandas/pull/30588 + # + # < 1.0rc0 : x[:, None].ndim == 1, no warning, custom type + # >= 1.0rc1 : x[:, None].ndim == 2, warns, numpy array + # future : x[:, None] -> raises + # + # This code should correctly identify and coerce to a + # numpy array all pandas versions. + with warnings.catch_warnings(record=True) as w: + warnings.filterwarnings("always", + category=DeprecationWarning, + module='pandas[.*]') + + ndim = x[:, None].ndim + # we have definitely hit a pandas index or series object + # cast to a numpy array. + if len(w) > 0: + return np.asanyarray(x) + # We have likely hit a pandas object, or at least + # something where 2D slicing does not result in a 2D + # object. if ndim < 2: return np.atleast_1d(x) return x diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 290dfa64664b..4bf3e8724745 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1669,6 +1669,15 @@ def test_bar_pandas_indexed(pd): ax.bar(df.x, 1., width=df.width) +def test_pandas_minimal_plot(pd): + # smoke test that series and index objcets do not warn + x = pd.Series([1, 2], dtype="float64") + plt.plot(x, x) + plt.plot(x.index, x) + plt.plot(x) + plt.plot(x.index) + + @image_comparison(['hist_log'], remove_text=True) def test_hist_log(): data0 = np.linspace(0, 1, 200)**3 From fa8ac6309ce1bad22270243a87a1047d6ba68bb5 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Tue, 28 Jan 2020 15:20:18 -0800 Subject: [PATCH 025/113] Backport PR #16347: FIX: catch warnings from pandas in cbook._check_1d Merge pull request #16347 from tacaswell/fix_pandas_index_deprecation FIX: catch warnings from pandas in cbook._check_1d --- lib/matplotlib/cbook/__init__.py | 32 ++++++++++++++++++++++++++----- lib/matplotlib/tests/test_axes.py | 9 +++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/cbook/__init__.py b/lib/matplotlib/cbook/__init__.py index ed08c5be2ce5..0b64644205e4 100644 --- a/lib/matplotlib/cbook/__init__.py +++ b/lib/matplotlib/cbook/__init__.py @@ -1399,11 +1399,33 @@ def _check_1d(x): return np.atleast_1d(x) else: try: - ndim = x[:, None].ndim - # work around https://github.com/pandas-dev/pandas/issues/27775 - # which mean the shape is not as expected. That this ever worked - # was an unintentional quirk of pandas the above line will raise - # an exception in the future. + # work around + # https://github.com/pandas-dev/pandas/issues/27775 which + # means the shape of multi-dimensional slicing is not as + # expected. That this ever worked was an unintentional + # quirk of pandas and will raise an exception in the + # future. This slicing warns in pandas >= 1.0rc0 via + # https://github.com/pandas-dev/pandas/pull/30588 + # + # < 1.0rc0 : x[:, None].ndim == 1, no warning, custom type + # >= 1.0rc1 : x[:, None].ndim == 2, warns, numpy array + # future : x[:, None] -> raises + # + # This code should correctly identify and coerce to a + # numpy array all pandas versions. + with warnings.catch_warnings(record=True) as w: + warnings.filterwarnings("always", + category=DeprecationWarning, + module='pandas[.*]') + + ndim = x[:, None].ndim + # we have definitely hit a pandas index or series object + # cast to a numpy array. + if len(w) > 0: + return np.asanyarray(x) + # We have likely hit a pandas object, or at least + # something where 2D slicing does not result in a 2D + # object. if ndim < 2: return np.atleast_1d(x) return x diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 8ff5ac45d27d..356b9ad424b3 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1600,6 +1600,15 @@ def test_bar_pandas_indexed(pd): ax.bar(df.x, 1., width=df.width) +def test_pandas_minimal_plot(pd): + # smoke test that series and index objcets do not warn + x = pd.Series([1, 2], dtype="float64") + plt.plot(x, x) + plt.plot(x.index, x) + plt.plot(x) + plt.plot(x.index) + + @image_comparison(baseline_images=['hist_log'], remove_text=True) def test_hist_log(): From 5d99e151be80bcb0b3b6d081fd3038330f573d94 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 28 Jan 2020 22:12:51 -0500 Subject: [PATCH 026/113] Backport PR #16344: Cast vmin/vmax to floats before nonsingular-expanding them. --- lib/matplotlib/tests/test_colorbar.py | 11 +++++++++++ lib/matplotlib/transforms.py | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/lib/matplotlib/tests/test_colorbar.py b/lib/matplotlib/tests/test_colorbar.py index 0798e257bbd5..27eaeb159a76 100644 --- a/lib/matplotlib/tests/test_colorbar.py +++ b/lib/matplotlib/tests/test_colorbar.py @@ -580,3 +580,14 @@ def test_colorbar_label(): cbar3 = fig.colorbar(im, orientation='horizontal', label='horizontal cbar') assert cbar3.ax.get_xlabel() == 'horizontal cbar' + + +@pytest.mark.parametrize("clim", [(-20000, 20000), (-32768, 0)]) +def test_colorbar_int(clim): + # Check that we cast to float early enough to not + # overflow ``int16(20000) - int16(-20000)`` or + # run into ``abs(int16(-32768)) == -32768``. + fig, ax = plt.subplots() + im = ax.imshow([[*map(np.int16, clim)]]) + fig.colorbar(im) + assert (im.norm.vmin, im.norm.vmax) == clim diff --git a/lib/matplotlib/transforms.py b/lib/matplotlib/transforms.py index e4a37373e9a1..481b7074157b 100644 --- a/lib/matplotlib/transforms.py +++ b/lib/matplotlib/transforms.py @@ -2812,6 +2812,10 @@ def nonsingular(vmin, vmax, expander=0.001, tiny=1e-15, increasing=True): vmin, vmax = vmax, vmin swapped = True + # Expand vmin, vmax to float: if they were integer types, they can wrap + # around in abs (abs(np.int8(-128)) == -128) and vmax - vmin can overflow. + vmin, vmax = map(float, [vmin, vmax]) + maxabsvalue = max(abs(vmin), abs(vmax)) if maxabsvalue < (1e6 / tiny) * np.finfo(float).tiny: vmin = -expander From 85e3f1c9c842b7cfa29179b9310b68ce784c1849 Mon Sep 17 00:00:00 2001 From: hannah Date: Fri, 31 Jan 2020 00:04:20 -0500 Subject: [PATCH 027/113] Backport PR #16379: FIX: catch on message content, not module --- lib/matplotlib/cbook/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/cbook/__init__.py b/lib/matplotlib/cbook/__init__.py index 0b64644205e4..35eec13ff440 100644 --- a/lib/matplotlib/cbook/__init__.py +++ b/lib/matplotlib/cbook/__init__.py @@ -1414,9 +1414,10 @@ def _check_1d(x): # This code should correctly identify and coerce to a # numpy array all pandas versions. with warnings.catch_warnings(record=True) as w: - warnings.filterwarnings("always", - category=DeprecationWarning, - module='pandas[.*]') + warnings.filterwarnings( + "always", + category=DeprecationWarning, + message='Support for multi-dimensional indexing') ndim = x[:, None].ndim # we have definitely hit a pandas index or series object From bc3b605b40a9e62719c5cc62cd46c111b475dcfd Mon Sep 17 00:00:00 2001 From: hannah Date: Fri, 31 Jan 2020 00:04:20 -0500 Subject: [PATCH 028/113] Backport PR #16379: FIX: catch on message content, not module --- lib/matplotlib/cbook/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/cbook/__init__.py b/lib/matplotlib/cbook/__init__.py index d6fcf855f487..1b222f971878 100644 --- a/lib/matplotlib/cbook/__init__.py +++ b/lib/matplotlib/cbook/__init__.py @@ -1341,9 +1341,10 @@ def _check_1d(x): # This code should correctly identify and coerce to a # numpy array all pandas versions. with warnings.catch_warnings(record=True) as w: - warnings.filterwarnings("always", - category=DeprecationWarning, - module='pandas[.*]') + warnings.filterwarnings( + "always", + category=DeprecationWarning, + message='Support for multi-dimensional indexing') ndim = x[:, None].ndim # we have definitely hit a pandas index or series object From f74da1e9af8509b35273e77ba98faea25ce64cca Mon Sep 17 00:00:00 2001 From: hannah Date: Wed, 29 Jan 2020 23:33:22 -0500 Subject: [PATCH 029/113] Backport PR #16226: Reorganize intro section on main page --- doc/_static/mpl.css | 35 +++++++++++++++++++++++++++ doc/index.rst | 59 +++++++++++++++++++++++++++------------------ 2 files changed, 71 insertions(+), 23 deletions(-) diff --git a/doc/_static/mpl.css b/doc/_static/mpl.css index 590835cf7d28..d037550666c4 100644 --- a/doc/_static/mpl.css +++ b/doc/_static/mpl.css @@ -1219,3 +1219,38 @@ hr.box-sep { flex: 0 0 90%; } } + +/* bullet boxes on main page */ +div.bullet-box-container { + display: flex; + flex-wrap: wrap; + margin: 1em 0; +} + +div.bullet-box { + flex-grow: 1; + width: 28%; + margin: 0.4em; + padding: 0 1em; + background: #eff9ff; +} + +div.bullet-box p:first-of-type { + font-size: 1.4em; + text-align: center; +} + +div.bullet-box ul { + padding-left: 1.2em; +} + +div.bullet-box li { + padding-left: 0.3em; + margin-bottom: 0.3em; +} + +@media only screen and (max-width: 930px){ + div.bullet-box { + flex: 0 0 90%; + } +} diff --git a/doc/index.rst b/doc/index.rst index c630e808468f..cf12b81bda80 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -2,14 +2,11 @@ .. title:: Matplotlib: Python plotting -Matplotlib is a Python 2D plotting library which produces publication quality -figures in a variety of hardcopy formats and interactive environments across -platforms. Matplotlib can be used in Python scripts, the Python and IPython_ -shells, the Jupyter_ notebook, web application servers, and four graphical user -interface toolkits. +Matplotlib: Visualization with Python +------------------------------------- -.. _IPython: http://ipython.org -.. _Jupyter: http://jupyter.org +Matplotlib is a comprehensive library for creating static, animated, +and interactive visualizations in Python. .. raw:: html @@ -35,19 +32,41 @@ interface toolkits. -Matplotlib tries to make easy things easy and hard things possible. You -can generate plots, histograms, power spectra, bar charts, errorcharts, -scatterplots, etc., with just a few lines of code. For examples, see the -:doc:`sample plots ` and :doc:`thumbnail -gallery `. +Matplotlib makes easy things easy and hard things possible. -For simple plotting the `pyplot` module provides a MATLAB-like interface, -particularly when combined with IPython. For the power user, you have full -control of line styles, font properties, axes properties, etc, via an object -oriented interface or via a set of functions familiar to MATLAB users. +.. container:: bullet-box-container + + .. container:: bullet-box + + Create + + - Develop `publication quality plots`_ with just with just a few lines of code + - Use `interactive figures`_ that can zoom, pan, update... + + .. _publication quality plots: https://matplotlib.org/gallery/index.html + .. _interactive figures: https://matplotlib.org/gallery/index.html#event-handling + + .. container:: bullet-box + + Customize + + - `Take full control`_ of line styles, font properties, axes properties... + - `Export and embed`_ to a number of file formats and interactive environments + + .. _Take full control: https://matplotlib.org/tutorials/index.html#tutorials + .. _Export and embed: https://matplotlib.org/api/index_backend_api.html + + .. container:: bullet-box + + Extend + + - Explore tailored functionality provided by + :doc:`third party packages ` + - Learn more about matplotlib through the many + :doc:`external learning resources ` Documentation -------------- +~~~~~~~~~~~~~ To get started, read the :doc:`User's Guide `. @@ -55,12 +74,6 @@ Trying to learn how to do a particular kind of plot? Check out the :doc:`examples gallery ` or the :doc:`list of plotting commands `. -Other learning resources -~~~~~~~~~~~~~~~~~~~~~~~~ - -There are many :doc:`external learning resources ` available -including printed material, videos and tutorials. - Join our community! ~~~~~~~~~~~~~~~~~~~ From 50e11a9f00679c6abb45f8fa236a01b1a95bb102 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sat, 1 Feb 2020 17:13:04 -0500 Subject: [PATCH 030/113] DOC: update github_stats --- doc/users/github_stats.rst | 237 +++++------------- .../prev_whats_new/github_stats_3.1.2.rst | 202 +++++++++++++++ 2 files changed, 269 insertions(+), 170 deletions(-) create mode 100644 doc/users/prev_whats_new/github_stats_3.1.2.rst diff --git a/doc/users/github_stats.rst b/doc/users/github_stats.rst index 627eb6aa6464..b065fa4e50e0 100644 --- a/doc/users/github_stats.rst +++ b/doc/users/github_stats.rst @@ -3,203 +3,100 @@ GitHub Stats ============ -GitHub stats for 2019/05/18 - 2019/06/30 (tag: v3.1.0) +GitHub stats for 2019/05/18 - 2020/02/01 (tag: v3.1.0) These lists are automatically generated, and may be incomplete or contain duplicates. -We closed 30 issues and merged 120 pull requests. -The full list can be seen `on GitHub `__ +We closed 5 issues and merged 47 pull requests. +The full list can be seen `on GitHub `__ -The following 30 authors contributed 323 commits. +The following 25 authors contributed 587 commits. -* Adam Gomaa * Antony Lee * Ben Root * Christer Jensen -* chuanzhu xu * David Stansby -* Deng Tian -* djdt * Dora Fraeman Caswell * Elan Ernest * Elliott Sales de Andrade * Eric Firing * Filipe Fernandes -* Ian Thomas -* ImportanceOfBeingErnest +* hannah * Jody Klymak * Johannes H. Jensen * Jonas Camillus Jeppesen -* LeiSurrre -* Matt Adamson * MeeseeksMachine +* miquelastein * Molly Rossow -* Nathan Goldbaum * Nelle Varoquaux +* Nikita Kniazev * Paul Ivanov -* RoryIAngus * Ryan May +* SamSchott +* Steven G. Johnson * Thomas A Caswell -* Thomas Robitaille * Tim Hoffmann +* Vincent L.M. Mazoyer GitHub issues and pull requests: -Pull Requests (120): - -* :ghpull:`14636`: Don't capture stderr in _check_and_log_subprocess. -* :ghpull:`14655`: Backport PR #14649 on branch v3.1.x (Fix appveyor conda py37) -* :ghpull:`14649`: Fix appveyor conda py37 -* :ghpull:`14646`: Backport PR #14640 on branch v3.1.x (FIX: allow secondary axes to be non-linear) -* :ghpull:`14640`: FIX: allow secondary axes to be non-linear -* :ghpull:`14643`: Second attempt at fixing axis inversion (for mpl3.1). -* :ghpull:`14623`: Fix axis inversion with loglocator and logitlocator. -* :ghpull:`14619`: Backport PR #14598 on branch v3.1.x (Fix inversion of shared axes.) -* :ghpull:`14621`: Backport PR #14613 on branch v3.1.x (Cleanup DateFormatter docstring.) -* :ghpull:`14622`: Backport PR #14611 on branch v3.1.x (Update some axis docstrings.) -* :ghpull:`14611`: Update some axis docstrings. -* :ghpull:`14613`: Cleanup DateFormatter docstring. -* :ghpull:`14598`: Fix inversion of shared axes. -* :ghpull:`14610`: Backport PR #14579 on branch v3.1.x (Fix inversion of 3d axis.) -* :ghpull:`14579`: Fix inversion of 3d axis. -* :ghpull:`14600`: Backport PR #14599 on branch v3.1.x (DOC: Add numpngw to third party packages.) -* :ghpull:`14574`: Backport PR #14568 on branch v3.1.x (Don't assume tk canvas have a manager attached.) -* :ghpull:`14568`: Don't assume tk canvas have a manager attached. -* :ghpull:`14571`: Backport PR #14566 on branch v3.1.x (Move setting of AA_EnableHighDpiScaling before creating QApplication.) -* :ghpull:`14566`: Move setting of AA_EnableHighDpiScaling before creating QApplication. -* :ghpull:`14541`: Backport PR #14535 on branch v3.1.x (Invalidate FT2Font cache when fork()ing.) -* :ghpull:`14535`: Invalidate FT2Font cache when fork()ing. -* :ghpull:`14522`: Backport PR #14040 on branch v3.1.x (Gracefully handle non-finite z in tricontour (issue #10167)) -* :ghpull:`14434`: Backport PR #14296 on branch v3.1.x (Fix barbs to accept array of bool for ``flip_barb``) -* :ghpull:`14518`: Backport PR #14509 on branch v3.1.x (Fix too large icon spacing in Qt5 on non-HiDPI screens) -* :ghpull:`14509`: Fix too large icon spacing in Qt5 on non-HiDPI screens -* :ghpull:`14514`: Backport PR #14256 on branch v3.1.x (Improve docstring of Axes.barbs) -* :ghpull:`14256`: Improve docstring of Axes.barbs -* :ghpull:`14505`: Backport PR #14395 on branch v3.1.x (MAINT: work around non-zero exit status of "pdftops -v" command.) -* :ghpull:`14504`: Backport PR #14445 on branch v3.1.x (FIX: fastpath clipped artists) -* :ghpull:`14502`: Backport PR #14451 on branch v3.1.x (FIX: return points rather than path to fix regression) -* :ghpull:`14445`: FIX: fastpath clipped artists -* :ghpull:`14497`: Backport PR #14491 on branch v3.1.x (Fix uses of PyObject_IsTrue.) -* :ghpull:`14491`: Fix uses of PyObject_IsTrue. -* :ghpull:`14492`: Backport PR #14490 on branch v3.1.x (Fix links of parameter types) -* :ghpull:`14490`: Fix links of parameter types -* :ghpull:`14489`: Backport PR #14459 on branch v3.1.x (Cleanup docstring of DraggableBase.) -* :ghpull:`14459`: Cleanup docstring of DraggableBase. -* :ghpull:`14485`: Backport #14429 on v3.1.x -* :ghpull:`14486`: Backport #14403 on v3.1. -* :ghpull:`14429`: FIX: if the first elements of an array are masked keep checking -* :ghpull:`14481`: Backport PR #14475 on branch v3.1.x (change ginoput docstring to match behavior) -* :ghpull:`14482`: Backport PR #14464 on branch v3.1.x (Mention origin and extent tutorial in API docs for origin kwarg) -* :ghpull:`14464`: Mention origin and extent tutorial in API docs for origin kwarg -* :ghpull:`14468`: Backport PR #14449: Improve docs on gridspec -* :ghpull:`14475`: change ginoput docstring to match behavior -* :ghpull:`14477`: Backport PR #14461 on branch v3.1.x (Fix out of bounds read in backend_tk.) -* :ghpull:`14476`: Backport PR #14474 on branch v3.1.x (Fix default value in docstring of errorbar func) -* :ghpull:`14461`: Fix out of bounds read in backend_tk. -* :ghpull:`14474`: Fix default value in docstring of errorbar func -* :ghpull:`14473`: Backport PR #14472 on branch v3.1.x (Fix NameError in example code for setting label via method) -* :ghpull:`14472`: Fix NameError in example code for setting label via method -* :ghpull:`14449`: Improve docs on gridspec -* :ghpull:`14450`: Backport PR #14422 on branch v3.1.x (Fix ReST note in span selector example) -* :ghpull:`14446`: Backport PR #14438 on branch v3.1.x (Issue #14372 - Add degrees to documentation) -* :ghpull:`14438`: Issue #14372 - Add degrees to documentation -* :ghpull:`14437`: Backport PR #14387 on branch v3.1.x (Fix clearing rubberband on nbagg) -* :ghpull:`14387`: Fix clearing rubberband on nbagg -* :ghpull:`14435`: Backport PR #14425 on branch v3.1.x (Lic restore license paint) -* :ghpull:`14296`: Fix barbs to accept array of bool for ``flip_barb`` -* :ghpull:`14430`: Backport PR #14397 on branch v3.1.x (Correctly set clip_path on pcolorfast return artist.) -* :ghpull:`14397`: Correctly set clip_path on pcolorfast return artist. -* :ghpull:`14409`: Backport PR #14335 on branch v3.1.x (Add explanation of animation.embed_limit to matplotlibrc.template) -* :ghpull:`14335`: Add explanation of animation.embed_limit to matplotlibrc.template -* :ghpull:`14403`: Revert "Preserve whitespace in svg output." -* :ghpull:`14407`: Backport PR #14406 on branch v3.1.x (Remove extra \iint in math_symbol_table for document) -* :ghpull:`14398`: Backport PR #14394 on branch v3.1.x (Update link to "MathML torture test".) -* :ghpull:`14394`: Update link to "MathML torture test". -* :ghpull:`14389`: Backport PR #14388 on branch v3.1.x (Fixed one little spelling error) -* :ghpull:`14385`: Backport PR #14316 on branch v3.1.x (Improve error message for kiwisolver import error (DLL load failed)) -* :ghpull:`14388`: Fixed one little spelling error -* :ghpull:`14384`: Backport PR #14369 on branch v3.1.x (Don't use deprecated mathcircled in docs.) -* :ghpull:`14316`: Improve error message for kiwisolver import error (DLL load failed) -* :ghpull:`14369`: Don't use deprecated mathcircled in docs. -* :ghpull:`14375`: Backport PR #14374 on branch v3.1.x (Check that the figure patch is in bbox_artists before trying to remove.) -* :ghpull:`14374`: Check that the figure patch is in bbox_artists before trying to remove. -* :ghpull:`14040`: Gracefully handle non-finite z in tricontour (issue #10167) -* :ghpull:`14342`: Backport PR #14326 on branch v3.1.x (Correctly apply PNG palette when building ImageBase through Pillow.) -* :ghpull:`14326`: Correctly apply PNG palette when building ImageBase through Pillow. -* :ghpull:`14341`: Backport PR #14337 on branch v3.1.x (Docstring cleanup) -* :ghpull:`14337`: Docstring cleanup -* :ghpull:`14325`: Backport PR #14126 on branch v3.1.x (Simplify grouped bar chart example) -* :ghpull:`14324`: Backport PR #14139 on branch v3.1.x (TST: be more explicit about identifying qt4/qt5 imports) -* :ghpull:`14126`: Simplify grouped bar chart example -* :ghpull:`14323`: Backport PR #14290 on branch v3.1.x (Convert SymmetricalLogScale to numpydoc) -* :ghpull:`14139`: TST: be more explicit about identifying qt4/qt5 imports -* :ghpull:`14290`: Convert SymmetricalLogScale to numpydoc -* :ghpull:`14321`: Backport PR #14313 on branch v3.1.x -* :ghpull:`14313`: Support masked array inputs for to_rgba and to_rgba_array. -* :ghpull:`14320`: Backport PR #14319 on branch v3.1.x (Don't set missing history buttons.) -* :ghpull:`14319`: Don't set missing history buttons. -* :ghpull:`14317`: Backport PR #14295: Fix bug in SymmetricalLogTransform. -* :ghpull:`14302`: Backport PR #14255 on branch v3.1.x (Improve docsstring of Axes.streamplot) -* :ghpull:`14255`: Improve docsstring of Axes.streamplot -* :ghpull:`14295`: Fix bug in SymmetricalLogTransform. -* :ghpull:`14294`: Backport PR #14282 on branch v3.1.x (Fix toolmanager's destroy subplots in tk) -* :ghpull:`14282`: Fix toolmanager's destroy subplots in tk -* :ghpull:`14292`: Backport PR #14289 on branch v3.1.x (BUG: Fix performance regression when plotting values from Numpy array sub-classes) -* :ghpull:`14289`: BUG: Fix performance regression when plotting values from Numpy array sub-classes -* :ghpull:`14287`: Backport PR #14286 on branch v3.1.x (fix minor typo) -* :ghpull:`14284`: Backport PR #14279 on branch v3.1.x (In case fallback to Agg fails, let the exception propagate out.) -* :ghpull:`14254`: Merge up 30x -* :ghpull:`14279`: In case fallback to Agg fails, let the exception propagate out. -* :ghpull:`14268`: Backport PR #14261 on branch v3.1.x (Updated polar documentation) -* :ghpull:`14261`: Updated polar documentation -* :ghpull:`14264`: Backport PR #14260 on branch v3.1.x (Remove old OSX FAQ page) -* :ghpull:`14260`: Remove old OSX FAQ page -* :ghpull:`14249`: Backport PR #14243 on branch v3.1.x (Update docstring of makeMappingArray) -* :ghpull:`14250`: Backport PR #14149 on branch v3.1.x -* :ghpull:`14252`: Backport PR #14248 on branch v3.1.x (Fix TextBox not respecting eventson) -* :ghpull:`14253`: Backport PR #13596 on branch v3.1.x (Normalize properties passed to bxp().) -* :ghpull:`14251`: Backport PR #14241 on branch v3.1.x (Fix linear segmented colormap with one element) -* :ghpull:`13596`: Normalize properties passed to bxp(). -* :ghpull:`14248`: Fix TextBox not respecting eventson -* :ghpull:`14241`: Fix linear segmented colormap with one element -* :ghpull:`14243`: Update docstring of makeMappingArray -* :ghpull:`14238`: Backport PR #14164 on branch v3.1.x (Fix regexp for dvipng version detection) -* :ghpull:`14149`: Avoid using ``axis([xlo, xhi, ylo, yhi])`` in examples. -* :ghpull:`14164`: Fix regexp for dvipng version detection -* :ghpull:`13739`: Fix pressing tab breaks keymap in CanvasTk - -Issues (30): - -* :ghissue:`14620`: Plotting on a log/logit scale overwrites axis inverting -* :ghissue:`14615`: Inverting an axis using its limits does not work for log scale -* :ghissue:`14577`: Calling invert_yaxis() on a 3D plot has either no effect or removes ticks -* :ghissue:`14602`: NavigationToolbar2Tk save_figure function bug -* :ghissue:`1219`: Show fails on figures created with the object-oriented system -* :ghissue:`10167`: Segmentation fault with tricontour -* :ghissue:`13723`: RuntimeError when saving PDFs via parallel processes (not threads!) -* :ghissue:`14315`: Improvement: Better error message if kiwisolver fails to import -* :ghissue:`14356`: matplotlib.units.ConversionError on scatter of dates with a NaN in the first position -* :ghissue:`14467`: Docs for plt.ginput() have the wrong default value for show_clicks keyword argument. -* :ghissue:`14225`: Matplotlib crashes on windows while maximizing plot window when using Multicursor -* :ghissue:`14458`: DOC: small inconsistency in errobar docstring -* :ghissue:`14372`: Document that view_init() arguments should be in degrees -* :ghissue:`12201`: issues clearing rubberband on nbagg at non-default browser zoom -* :ghissue:`13576`: pcolorfast misbehaves when changing axis limits -* :ghissue:`14303`: Unable to import matplotlib on Windows 10 v1903 -* :ghissue:`14283`: RendererSVG CSS 'white-space' property conflicts with default HTML CSS -* :ghissue:`14293`: imshow() producing "inverted" colors since 3.0.3 -* :ghissue:`14322`: Cannot import matplotlib with Python 3.7.x on Win10Pro -* :ghissue:`14137`: Qt5 test auto-skip is not working correctly -* :ghissue:`14301`: scatter() fails on nan-containing input when providing edgecolor -* :ghissue:`14318`: Don't try to set missing history buttons. -* :ghissue:`14265`: symlog looses some points since 3.1.0 (example given) -* :ghissue:`14274`: BUG: plotting with Numpy array subclasses is slow with Matplotlib 3.1.0 (regression) -* :ghissue:`14263`: import pyplot issue - -* :ghissue:`14227`: Update "working with Mpl on OSX" docs -* :ghissue:`13448`: boxplot doesn't normalize properties before applying them -* :ghissue:`14226`: Modify matplotlib TextBox value without triggering callback -* :ghissue:`14232`: LinearSegmentedColormap with N=1 gives confusing error message -* :ghissue:`10365`: Scatter plot with non-sequence ´c´ color should give a better Error message. +Pull Requests (47): + +* :ghpull:`16362`: Backport PR #16347: FIX: catch warnings from pandas in cbook._check_1d +* :ghpull:`16356`: Backport PR #16330 on branch v3.1.x (Clearer signal handling) +* :ghpull:`16330`: Clearer signal handling +* :ghpull:`16348`: Backport PR #16255 on branch v3.1.x (Move version info to sidebar) +* :ghpull:`16346`: Backport PR #16298 on branch v3.2.x (Don't recursively call draw_idle when updating artists at draw time.) +* :ghpull:`16345`: Backport PR #16298 on branch v3.1.x (Don't recursively call draw_idle when updating artists at draw time.) +* :ghpull:`16298`: Don't recursively call draw_idle when updating artists at draw time. +* :ghpull:`16322`: Backport PR #16250: Fix zerolen intersect +* :ghpull:`16320`: Backport PR #16311 on branch v3.1.x (don't override non-Python signal handlers) +* :ghpull:`16311`: don't override non-Python signal handlers +* :ghpull:`16250`: Fix zerolen intersect +* :ghpull:`16259`: TST: something changed in pytest 5.3.3 that breaks our qt fixtures +* :ghpull:`16238`: Merge pull request #16238 from meeseeksmachine/auto-backport-of-pr-16235-on-v3.2.x +* :ghpull:`16237`: Merge pull request #16237 from meeseeksmachine/auto-backport-of-pr-16235-on-v3.1.x +* :ghpull:`16235`: FIX: AttributeError in TimerBase.start +* :ghpull:`16208`: Backport PR #15556 on branch v3.1.x (Fix test suite compat with ghostscript 9.50.) +* :ghpull:`16213`: Backport PR #15763 on branch v3.1.x (Skip webagg test if tornado is not available.) +* :ghpull:`16167`: Backport PR #16166 on branch v3.1.x (Add badge for citing 3.1.2) +* :ghpull:`16166`: Add badge for citing 3.1.2 +* :ghpull:`16144`: Backport PR #16053 on branch v3.1.x (Fix v_interval setter) +* :ghpull:`16053`: Fix v_interval setter +* :ghpull:`16136`: Backport PR #16112 on branch v3.1.x (CI: Fail when failed to install dependencies) +* :ghpull:`16131`: Backport PR #16126 on branch v3.1.x (TST: test_fork: Missing join) +* :ghpull:`16126`: TST: test_fork: Missing join +* :ghpull:`16091`: Backport PR #16086 on branch v3.1.x (FIX: use supported attribute to check pillow version) +* :ghpull:`16040`: Backport PR #16031 on branch v3.1.x (Fix docstring of hillshade().) +* :ghpull:`16032`: Backport PR #16028 on branch v3.1.x (Prevent FigureCanvasQT_draw_idle recursively calling itself.) +* :ghpull:`16028`: Prevent FigureCanvasQT_draw_idle recursively calling itself. +* :ghpull:`16020`: Backport PR #16007 on branch v3.1.x (Fix search on nested pages) +* :ghpull:`16018`: Backport PR #15735 on branch v3.1.x (Cleanup some mplot3d docstrings.) +* :ghpull:`16007`: Fix search on nested pages +* :ghpull:`15957`: Backport PR #15953 on branch v3.1.x (Update donation link) +* :ghpull:`15763`: Skip webagg test if tornado is not available. +* :ghpull:`15881`: Backport PR #15859 on branch v3.1.x (Doc: Move search field into nav bar) +* :ghpull:`15863`: Backport PR #15244 on branch v3.1.x: Change documentation format of rcParams defaults +* :ghpull:`15859`: Doc: Move search field into nav bar +* :ghpull:`15860`: Backport PR #15851 on branch v3.1.x (ffmpeg is available on default ubuntu packages now) +* :ghpull:`15851`: ffmpeg is available on default ubuntu packages now. +* :ghpull:`15843`: Backport PR #15737 on branch v3.1.x (Fix env override in WebAgg backend test.) +* :ghpull:`15760`: Backport PR #15752 on branch v3.1.x (Update boxplot/violinplot faq.) +* :ghpull:`15757`: Backport PR #15751 on branch v3.1.x (Modernize FAQ entry for plt.show().) +* :ghpull:`15735`: Cleanup some mplot3d docstrings. +* :ghpull:`15753`: Backport PR #15661 on branch v3.1.x (Document scope of 3D scatter depthshading.) +* :ghpull:`15741`: Backport PR #15729 on branch v3.1.x (Catch correct parse errror type for dateutil >= 2.8.1) +* :ghpull:`15729`: Catch correct parse errror type for dateutil >= 2.8.1 +* :ghpull:`15737`: Fix env override in WebAgg backend test. +* :ghpull:`15244`: Change documentation format of rcParams defaults + +Issues (5): + +* :ghissue:`16294`: BUG: Interactive mode slow +* :ghissue:`15842`: Path.intersects_path returns True when it shouldn't +* :ghissue:`16163`: libpng error: Read Error when using matplotlib after setting usetex=True +* :ghissue:`15481`: Recursion error +* :ghissue:`15717`: Move search field into nav bar Previous GitHub Stats diff --git a/doc/users/prev_whats_new/github_stats_3.1.2.rst b/doc/users/prev_whats_new/github_stats_3.1.2.rst new file mode 100644 index 000000000000..bb73e7047c25 --- /dev/null +++ b/doc/users/prev_whats_new/github_stats_3.1.2.rst @@ -0,0 +1,202 @@ +.. _github-stats_3-1-2: + +GitHub Stats +============ + +GitHub stats for 2019/05/18 - 2019/06/30 (tag: v3.1.0) + +These lists are automatically generated, and may be incomplete or contain duplicates. + +We closed 30 issues and merged 120 pull requests. +The full list can be seen `on GitHub `__ + +The following 30 authors contributed 323 commits. + +* Adam Gomaa +* Antony Lee +* Ben Root +* Christer Jensen +* chuanzhu xu +* David Stansby +* Deng Tian +* djdt +* Dora Fraeman Caswell +* Elan Ernest +* Elliott Sales de Andrade +* Eric Firing +* Filipe Fernandes +* Ian Thomas +* ImportanceOfBeingErnest +* Jody Klymak +* Johannes H. Jensen +* Jonas Camillus Jeppesen +* LeiSurrre +* Matt Adamson +* MeeseeksMachine +* Molly Rossow +* Nathan Goldbaum +* Nelle Varoquaux +* Paul Ivanov +* RoryIAngus +* Ryan May +* Thomas A Caswell +* Thomas Robitaille +* Tim Hoffmann + +GitHub issues and pull requests: + +Pull Requests (120): + +* :ghpull:`14636`: Don't capture stderr in _check_and_log_subprocess. +* :ghpull:`14655`: Backport PR #14649 on branch v3.1.x (Fix appveyor conda py37) +* :ghpull:`14649`: Fix appveyor conda py37 +* :ghpull:`14646`: Backport PR #14640 on branch v3.1.x (FIX: allow secondary axes to be non-linear) +* :ghpull:`14640`: FIX: allow secondary axes to be non-linear +* :ghpull:`14643`: Second attempt at fixing axis inversion (for mpl3.1). +* :ghpull:`14623`: Fix axis inversion with loglocator and logitlocator. +* :ghpull:`14619`: Backport PR #14598 on branch v3.1.x (Fix inversion of shared axes.) +* :ghpull:`14621`: Backport PR #14613 on branch v3.1.x (Cleanup DateFormatter docstring.) +* :ghpull:`14622`: Backport PR #14611 on branch v3.1.x (Update some axis docstrings.) +* :ghpull:`14611`: Update some axis docstrings. +* :ghpull:`14613`: Cleanup DateFormatter docstring. +* :ghpull:`14598`: Fix inversion of shared axes. +* :ghpull:`14610`: Backport PR #14579 on branch v3.1.x (Fix inversion of 3d axis.) +* :ghpull:`14579`: Fix inversion of 3d axis. +* :ghpull:`14600`: Backport PR #14599 on branch v3.1.x (DOC: Add numpngw to third party packages.) +* :ghpull:`14574`: Backport PR #14568 on branch v3.1.x (Don't assume tk canvas have a manager attached.) +* :ghpull:`14568`: Don't assume tk canvas have a manager attached. +* :ghpull:`14571`: Backport PR #14566 on branch v3.1.x (Move setting of AA_EnableHighDpiScaling before creating QApplication.) +* :ghpull:`14566`: Move setting of AA_EnableHighDpiScaling before creating QApplication. +* :ghpull:`14541`: Backport PR #14535 on branch v3.1.x (Invalidate FT2Font cache when fork()ing.) +* :ghpull:`14535`: Invalidate FT2Font cache when fork()ing. +* :ghpull:`14522`: Backport PR #14040 on branch v3.1.x (Gracefully handle non-finite z in tricontour (issue #10167)) +* :ghpull:`14434`: Backport PR #14296 on branch v3.1.x (Fix barbs to accept array of bool for ``flip_barb``) +* :ghpull:`14518`: Backport PR #14509 on branch v3.1.x (Fix too large icon spacing in Qt5 on non-HiDPI screens) +* :ghpull:`14509`: Fix too large icon spacing in Qt5 on non-HiDPI screens +* :ghpull:`14514`: Backport PR #14256 on branch v3.1.x (Improve docstring of Axes.barbs) +* :ghpull:`14256`: Improve docstring of Axes.barbs +* :ghpull:`14505`: Backport PR #14395 on branch v3.1.x (MAINT: work around non-zero exit status of "pdftops -v" command.) +* :ghpull:`14504`: Backport PR #14445 on branch v3.1.x (FIX: fastpath clipped artists) +* :ghpull:`14502`: Backport PR #14451 on branch v3.1.x (FIX: return points rather than path to fix regression) +* :ghpull:`14445`: FIX: fastpath clipped artists +* :ghpull:`14497`: Backport PR #14491 on branch v3.1.x (Fix uses of PyObject_IsTrue.) +* :ghpull:`14491`: Fix uses of PyObject_IsTrue. +* :ghpull:`14492`: Backport PR #14490 on branch v3.1.x (Fix links of parameter types) +* :ghpull:`14490`: Fix links of parameter types +* :ghpull:`14489`: Backport PR #14459 on branch v3.1.x (Cleanup docstring of DraggableBase.) +* :ghpull:`14459`: Cleanup docstring of DraggableBase. +* :ghpull:`14485`: Backport #14429 on v3.1.x +* :ghpull:`14486`: Backport #14403 on v3.1. +* :ghpull:`14429`: FIX: if the first elements of an array are masked keep checking +* :ghpull:`14481`: Backport PR #14475 on branch v3.1.x (change ginoput docstring to match behavior) +* :ghpull:`14482`: Backport PR #14464 on branch v3.1.x (Mention origin and extent tutorial in API docs for origin kwarg) +* :ghpull:`14464`: Mention origin and extent tutorial in API docs for origin kwarg +* :ghpull:`14468`: Backport PR #14449: Improve docs on gridspec +* :ghpull:`14475`: change ginoput docstring to match behavior +* :ghpull:`14477`: Backport PR #14461 on branch v3.1.x (Fix out of bounds read in backend_tk.) +* :ghpull:`14476`: Backport PR #14474 on branch v3.1.x (Fix default value in docstring of errorbar func) +* :ghpull:`14461`: Fix out of bounds read in backend_tk. +* :ghpull:`14474`: Fix default value in docstring of errorbar func +* :ghpull:`14473`: Backport PR #14472 on branch v3.1.x (Fix NameError in example code for setting label via method) +* :ghpull:`14472`: Fix NameError in example code for setting label via method +* :ghpull:`14449`: Improve docs on gridspec +* :ghpull:`14450`: Backport PR #14422 on branch v3.1.x (Fix ReST note in span selector example) +* :ghpull:`14446`: Backport PR #14438 on branch v3.1.x (Issue #14372 - Add degrees to documentation) +* :ghpull:`14438`: Issue #14372 - Add degrees to documentation +* :ghpull:`14437`: Backport PR #14387 on branch v3.1.x (Fix clearing rubberband on nbagg) +* :ghpull:`14387`: Fix clearing rubberband on nbagg +* :ghpull:`14435`: Backport PR #14425 on branch v3.1.x (Lic restore license paint) +* :ghpull:`14296`: Fix barbs to accept array of bool for ``flip_barb`` +* :ghpull:`14430`: Backport PR #14397 on branch v3.1.x (Correctly set clip_path on pcolorfast return artist.) +* :ghpull:`14397`: Correctly set clip_path on pcolorfast return artist. +* :ghpull:`14409`: Backport PR #14335 on branch v3.1.x (Add explanation of animation.embed_limit to matplotlibrc.template) +* :ghpull:`14335`: Add explanation of animation.embed_limit to matplotlibrc.template +* :ghpull:`14403`: Revert "Preserve whitespace in svg output." +* :ghpull:`14407`: Backport PR #14406 on branch v3.1.x (Remove extra \iint in math_symbol_table for document) +* :ghpull:`14398`: Backport PR #14394 on branch v3.1.x (Update link to "MathML torture test".) +* :ghpull:`14394`: Update link to "MathML torture test". +* :ghpull:`14389`: Backport PR #14388 on branch v3.1.x (Fixed one little spelling error) +* :ghpull:`14385`: Backport PR #14316 on branch v3.1.x (Improve error message for kiwisolver import error (DLL load failed)) +* :ghpull:`14388`: Fixed one little spelling error +* :ghpull:`14384`: Backport PR #14369 on branch v3.1.x (Don't use deprecated mathcircled in docs.) +* :ghpull:`14316`: Improve error message for kiwisolver import error (DLL load failed) +* :ghpull:`14369`: Don't use deprecated mathcircled in docs. +* :ghpull:`14375`: Backport PR #14374 on branch v3.1.x (Check that the figure patch is in bbox_artists before trying to remove.) +* :ghpull:`14374`: Check that the figure patch is in bbox_artists before trying to remove. +* :ghpull:`14040`: Gracefully handle non-finite z in tricontour (issue #10167) +* :ghpull:`14342`: Backport PR #14326 on branch v3.1.x (Correctly apply PNG palette when building ImageBase through Pillow.) +* :ghpull:`14326`: Correctly apply PNG palette when building ImageBase through Pillow. +* :ghpull:`14341`: Backport PR #14337 on branch v3.1.x (Docstring cleanup) +* :ghpull:`14337`: Docstring cleanup +* :ghpull:`14325`: Backport PR #14126 on branch v3.1.x (Simplify grouped bar chart example) +* :ghpull:`14324`: Backport PR #14139 on branch v3.1.x (TST: be more explicit about identifying qt4/qt5 imports) +* :ghpull:`14126`: Simplify grouped bar chart example +* :ghpull:`14323`: Backport PR #14290 on branch v3.1.x (Convert SymmetricalLogScale to numpydoc) +* :ghpull:`14139`: TST: be more explicit about identifying qt4/qt5 imports +* :ghpull:`14290`: Convert SymmetricalLogScale to numpydoc +* :ghpull:`14321`: Backport PR #14313 on branch v3.1.x +* :ghpull:`14313`: Support masked array inputs for to_rgba and to_rgba_array. +* :ghpull:`14320`: Backport PR #14319 on branch v3.1.x (Don't set missing history buttons.) +* :ghpull:`14319`: Don't set missing history buttons. +* :ghpull:`14317`: Backport PR #14295: Fix bug in SymmetricalLogTransform. +* :ghpull:`14302`: Backport PR #14255 on branch v3.1.x (Improve docsstring of Axes.streamplot) +* :ghpull:`14255`: Improve docsstring of Axes.streamplot +* :ghpull:`14295`: Fix bug in SymmetricalLogTransform. +* :ghpull:`14294`: Backport PR #14282 on branch v3.1.x (Fix toolmanager's destroy subplots in tk) +* :ghpull:`14282`: Fix toolmanager's destroy subplots in tk +* :ghpull:`14292`: Backport PR #14289 on branch v3.1.x (BUG: Fix performance regression when plotting values from Numpy array sub-classes) +* :ghpull:`14289`: BUG: Fix performance regression when plotting values from Numpy array sub-classes +* :ghpull:`14287`: Backport PR #14286 on branch v3.1.x (fix minor typo) +* :ghpull:`14284`: Backport PR #14279 on branch v3.1.x (In case fallback to Agg fails, let the exception propagate out.) +* :ghpull:`14254`: Merge up 30x +* :ghpull:`14279`: In case fallback to Agg fails, let the exception propagate out. +* :ghpull:`14268`: Backport PR #14261 on branch v3.1.x (Updated polar documentation) +* :ghpull:`14261`: Updated polar documentation +* :ghpull:`14264`: Backport PR #14260 on branch v3.1.x (Remove old OSX FAQ page) +* :ghpull:`14260`: Remove old OSX FAQ page +* :ghpull:`14249`: Backport PR #14243 on branch v3.1.x (Update docstring of makeMappingArray) +* :ghpull:`14250`: Backport PR #14149 on branch v3.1.x +* :ghpull:`14252`: Backport PR #14248 on branch v3.1.x (Fix TextBox not respecting eventson) +* :ghpull:`14253`: Backport PR #13596 on branch v3.1.x (Normalize properties passed to bxp().) +* :ghpull:`14251`: Backport PR #14241 on branch v3.1.x (Fix linear segmented colormap with one element) +* :ghpull:`13596`: Normalize properties passed to bxp(). +* :ghpull:`14248`: Fix TextBox not respecting eventson +* :ghpull:`14241`: Fix linear segmented colormap with one element +* :ghpull:`14243`: Update docstring of makeMappingArray +* :ghpull:`14238`: Backport PR #14164 on branch v3.1.x (Fix regexp for dvipng version detection) +* :ghpull:`14149`: Avoid using ``axis([xlo, xhi, ylo, yhi])`` in examples. +* :ghpull:`14164`: Fix regexp for dvipng version detection +* :ghpull:`13739`: Fix pressing tab breaks keymap in CanvasTk + +Issues (30): + +* :ghissue:`14620`: Plotting on a log/logit scale overwrites axis inverting +* :ghissue:`14615`: Inverting an axis using its limits does not work for log scale +* :ghissue:`14577`: Calling invert_yaxis() on a 3D plot has either no effect or removes ticks +* :ghissue:`14602`: NavigationToolbar2Tk save_figure function bug +* :ghissue:`1219`: Show fails on figures created with the object-oriented system +* :ghissue:`10167`: Segmentation fault with tricontour +* :ghissue:`13723`: RuntimeError when saving PDFs via parallel processes (not threads!) +* :ghissue:`14315`: Improvement: Better error message if kiwisolver fails to import +* :ghissue:`14356`: matplotlib.units.ConversionError on scatter of dates with a NaN in the first position +* :ghissue:`14467`: Docs for plt.ginput() have the wrong default value for show_clicks keyword argument. +* :ghissue:`14225`: Matplotlib crashes on windows while maximizing plot window when using Multicursor +* :ghissue:`14458`: DOC: small inconsistency in errobar docstring +* :ghissue:`14372`: Document that view_init() arguments should be in degrees +* :ghissue:`12201`: issues clearing rubberband on nbagg at non-default browser zoom +* :ghissue:`13576`: pcolorfast misbehaves when changing axis limits +* :ghissue:`14303`: Unable to import matplotlib on Windows 10 v1903 +* :ghissue:`14283`: RendererSVG CSS 'white-space' property conflicts with default HTML CSS +* :ghissue:`14293`: imshow() producing "inverted" colors since 3.0.3 +* :ghissue:`14322`: Cannot import matplotlib with Python 3.7.x on Win10Pro +* :ghissue:`14137`: Qt5 test auto-skip is not working correctly +* :ghissue:`14301`: scatter() fails on nan-containing input when providing edgecolor +* :ghissue:`14318`: Don't try to set missing history buttons. +* :ghissue:`14265`: symlog looses some points since 3.1.0 (example given) +* :ghissue:`14274`: BUG: plotting with Numpy array subclasses is slow with Matplotlib 3.1.0 (regression) +* :ghissue:`14263`: import pyplot issue - +* :ghissue:`14227`: Update "working with Mpl on OSX" docs +* :ghissue:`13448`: boxplot doesn't normalize properties before applying them +* :ghissue:`14226`: Modify matplotlib TextBox value without triggering callback +* :ghissue:`14232`: LinearSegmentedColormap with N=1 gives confusing error message +* :ghissue:`10365`: Scatter plot with non-sequence ´c´ color should give a better Error message. From 1607430b3b220065e4819ad8f8a6efe865899833 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sun, 5 Jan 2020 21:47:15 -0500 Subject: [PATCH 031/113] Merge pull request #16065 from timhoffm/doc-index-community DOC: Nicer formatting of community aspects on front page Conflicts: doc/index.rst Deleted the final paragraph about GH to match all other branches. --- doc/_static/fa/LICENSE | 5 + doc/_static/fa/discourse-brands.svg | 1 + doc/_static/fa/envelope-regular.svg | 1 + doc/_static/fa/github-brands.svg | 1 + doc/_static/fa/gitter-brands.svg | 1 + doc/_static/fa/hashtag-solid.svg | 1 + doc/_static/fa/plus-square-regular.svg | 1 + doc/_static/fa/question-circle-regular.svg | 1 + doc/_static/fa/stack-overflow-brands.svg | 1 + doc/_static/mpl.css | 40 +++++++- doc/index.rst | 103 +++++++++++++-------- 11 files changed, 117 insertions(+), 39 deletions(-) create mode 100644 doc/_static/fa/LICENSE create mode 100644 doc/_static/fa/discourse-brands.svg create mode 100644 doc/_static/fa/envelope-regular.svg create mode 100644 doc/_static/fa/github-brands.svg create mode 100644 doc/_static/fa/gitter-brands.svg create mode 100644 doc/_static/fa/hashtag-solid.svg create mode 100644 doc/_static/fa/plus-square-regular.svg create mode 100644 doc/_static/fa/question-circle-regular.svg create mode 100644 doc/_static/fa/stack-overflow-brands.svg diff --git a/doc/_static/fa/LICENSE b/doc/_static/fa/LICENSE new file mode 100644 index 000000000000..81369b90fe23 --- /dev/null +++ b/doc/_static/fa/LICENSE @@ -0,0 +1,5 @@ +Font Awsome SVG Icons are covered by CC BY 4.0 License. + +https://fontawesome.com/license/free + +Icons are based on Font Awesome 5.11.2 and colors have been adapted. diff --git a/doc/_static/fa/discourse-brands.svg b/doc/_static/fa/discourse-brands.svg new file mode 100644 index 000000000000..3b8e2e0fab0f --- /dev/null +++ b/doc/_static/fa/discourse-brands.svg @@ -0,0 +1 @@ + diff --git a/doc/_static/fa/envelope-regular.svg b/doc/_static/fa/envelope-regular.svg new file mode 100644 index 000000000000..9f82026d241c --- /dev/null +++ b/doc/_static/fa/envelope-regular.svg @@ -0,0 +1 @@ + diff --git a/doc/_static/fa/github-brands.svg b/doc/_static/fa/github-brands.svg new file mode 100644 index 000000000000..52e76df0df4a --- /dev/null +++ b/doc/_static/fa/github-brands.svg @@ -0,0 +1 @@ + diff --git a/doc/_static/fa/gitter-brands.svg b/doc/_static/fa/gitter-brands.svg new file mode 100644 index 000000000000..f1d59e045c03 --- /dev/null +++ b/doc/_static/fa/gitter-brands.svg @@ -0,0 +1 @@ + diff --git a/doc/_static/fa/hashtag-solid.svg b/doc/_static/fa/hashtag-solid.svg new file mode 100644 index 000000000000..c7c033faeac2 --- /dev/null +++ b/doc/_static/fa/hashtag-solid.svg @@ -0,0 +1 @@ + diff --git a/doc/_static/fa/plus-square-regular.svg b/doc/_static/fa/plus-square-regular.svg new file mode 100644 index 000000000000..3303fd81116a --- /dev/null +++ b/doc/_static/fa/plus-square-regular.svg @@ -0,0 +1 @@ + diff --git a/doc/_static/fa/question-circle-regular.svg b/doc/_static/fa/question-circle-regular.svg new file mode 100644 index 000000000000..5ddce26452f9 --- /dev/null +++ b/doc/_static/fa/question-circle-regular.svg @@ -0,0 +1 @@ + diff --git a/doc/_static/fa/stack-overflow-brands.svg b/doc/_static/fa/stack-overflow-brands.svg new file mode 100644 index 000000000000..de164d4a2cf0 --- /dev/null +++ b/doc/_static/fa/stack-overflow-brands.svg @@ -0,0 +1 @@ + diff --git a/doc/_static/mpl.css b/doc/_static/mpl.css index dd5d15fac594..bcc46d1e9bb8 100644 --- a/doc/_static/mpl.css +++ b/doc/_static/mpl.css @@ -1051,7 +1051,7 @@ div.responsive_subfig img { width: 100%; } -@media only screen and (max-width: 1000px){ +@media only screen and (max-width: 930px){ /* The value of 1000px was handcrafted to provide a more or less */ /* smooth transition between the 1x4 and the 2x2 layouts. It is */ /* NB: it is slightly below 1024px: so one should still have a */ @@ -1181,3 +1181,41 @@ nav.main-nav{ padding: 3px 6px; width: 198px; } + +/* community items on main page */ +div.box { + display: flex; + flex-flow: row wrap; +} + +div.box-item { + flex: 0 0 45%; + padding: 4px; + margin: 8px 12px; +} + +div.box-item img { + float: left; + width: 30px; + height: 30px; + fill: #888; + +} +div.box-item p { + margin: 0 0 0 50px; +} + +div.box-item ul { + margin: 0 0 0 50px; + padding-left: 20px; +} + +hr.box-sep { + margin: 1em 2em; +} + +@media only screen and (max-width: 930px){ + div.box-item { + flex: 0 0 90%; + } +} \ No newline at end of file diff --git a/doc/index.rst b/doc/index.rst index cb9c02f4e860..c630e808468f 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -69,37 +69,71 @@ Software Foundation Code of Conduct `_ in everything we do. .. _coc: http://www.python.org/psf/codeofconduct/ -- Join our community at `discourse.matplotlib.org`_ to get help, discuss - contributing & development, and share your work. -- If you have questions, be sure to check the :doc:`FAQ `, the - :doc:`API ` docs, and the `search `_ tool - searches all of the documentation, including full text search of over 350 - complete examples which exercise almost every corner of Matplotlib. -- If its something quick join the `gitter channel`_ to chat with the - community. -- If you prefer email there are the matplotlib-users_, matplotlib-devel_, - and matplotlib-announce_ mailing lists. -- Check out the Matplotlib tag on stackoverflow_. -- Tweet us at Twitter_! or see cool plots on Instagram_! - -.. _discourse.matplotlib.org: https://discourse.matplotlib.org -.. _gitter channel: https://gitter.im/matplotlib/matplotlib -.. _matplotlib-users: https://mail.python.org/mailman/listinfo/matplotlib-users -.. _matplotlib-devel: https://mail.python.org/mailman/listinfo/matplotlib-devel -.. _matplotlib-announce: https://mail.python.org/mailman/listinfo/matplotlib-announce -.. _stackoverflow: http://stackoverflow.com/questions/tagged/matplotlib -.. _Twitter: https://twitter.com/matplotlib -.. _Instagram: https://www.instagram.com/matplotart/ - -You can file bugs, patches and feature requests on the `issue tracker`_, but it -is a good idea to ping us on Discourse_ as well. - -.. _Discourse: https://discourse.matplotlib.org - -To keep up to date with what's going on in Matplotlib, see the :doc:`what's -new ` page or browse the `source code`_. Anything that could -require changes to your existing code is logged in the :doc:`API changes -` file. + +.. raw:: html + +

Get help

+
+
+ Discourse +

Join our community at discourse.matplotlib.org + to get help, discuss contributing & development, and share your work.

+
+
+ Questions +

If you have questions, be sure to check the FAQ, + the API docs. The full text + search is a good way to discover the docs including the many examples.

+
+
+ Stackoverflow +

Check out the Matplotlib tag on stackoverflow.

+
+
+ Gitter +

Short questions may be posted on the gitter channel.

+
+
+
+

News

+
+
+ News +

To keep up to date with what's going on in Matplotlib, see the + what's new page or browse the + source code. Anything that could + require changes to your existing code is logged in the + API changes file.

+
+
+ Social media +

Tweet us at Twitter! + or see cool plots on Instagram!

+
+
+
+

Development

+
+
+ Github +

Matplotlib is hosted on GitHub.

+ +

It is a good idea to ping us on Discourse as well.

+
+
+ Mailing lists +

Mailing lists

+ +
+
+ Toolkits ======== @@ -171,10 +205,3 @@ Foundation (PSF) license `_. There is an active developer community and a long list of people who have made significant :doc:`contributions `. - -Matplotlib is hosted on `Github `_. `Issues `_ -and `Pull requests`_ are tracked at Github too. - -.. _source code: https://github.com/matplotlib/matplotlib -.. _issue tracker: https://github.com/matplotlib/matplotlib/issues -.. _pull requests: https://github.com/matplotlib/matplotlib/pulls From 4a3f033fdd9d55aeb712bc4254a8fcf5f759d66c Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sat, 1 Feb 2020 18:49:14 -0500 Subject: [PATCH 032/113] REL: v3.1.3 This is the final planned release of the 3.1.x series. This release contains several critical bug-fixes: - suppress a warning with Pandas 1.0 - support pillow >= 7 - support dateutils >= 2.8.1 - prevent an infinite recursion - do not clobber non-python registered signal handler - fix path intersection computation with 0 length segments - fix performance regression in draw_idle - several minor bugs From f2736efb186e4f9ca959cba02b0911f6ba00ba4d Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sat, 1 Feb 2020 18:50:04 -0500 Subject: [PATCH 033/113] MNT: bump branch away from tag From df83918cdea78da803678294e266b0c885ee8202 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sat, 1 Feb 2020 20:14:43 -0500 Subject: [PATCH 034/113] DOC: update github stats --- doc/users/github_stats.rst | 263 +++++- .../prev_whats_new/github_stats_3.1.2.rst | 857 ++++++++++++++++++ 2 files changed, 1108 insertions(+), 12 deletions(-) create mode 100644 doc/users/prev_whats_new/github_stats_3.1.2.rst diff --git a/doc/users/github_stats.rst b/doc/users/github_stats.rst index ea590c697027..0c67fc8f008e 100644 --- a/doc/users/github_stats.rst +++ b/doc/users/github_stats.rst @@ -3,14 +3,14 @@ GitHub Stats ============ -GitHub stats for 2019/07/01 - 2019/10/15 (tag: v3.1.1) +GitHub stats for 2019/05/18 - 2020/02/01 (tag: v3.1.0) These lists are automatically generated, and may be incomplete or contain duplicates. -We closed 97 issues and merged 598 pull requests. +We closed 116 issues and merged 795 pull requests. The full list can be seen `on GitHub `__ -The following 140 authors contributed 2611 commits. +The following 161 authors contributed 3352 commits. * Abhinav Sagar * Abhinuv Nitin Pitale @@ -20,6 +20,7 @@ The following 140 authors contributed 2611 commits. * Alexander Rudy * Antony Lee * Ao Liu (frankliuao) +* Ardie Orden * Ashley Whetter * Ben Root * Benjamin Bengfort @@ -27,11 +28,14 @@ The following 140 authors contributed 2611 commits. * Bharat123rox * Bingyao Liu * Brigitta Sipocz +* Bruno Pagani * brut * Carsten * Carsten Schelp +* chaoyi1 * Cho Yin Yong * Chris Barnes +* Christer Jensen * Christian Brodbeck * Christoph Pohl * chuanzhu xu @@ -39,10 +43,12 @@ The following 140 authors contributed 2611 commits. * Cong Ma * dabana * DanielMatu +* David Chudzicki * David Stansby * Deng Tian * depano.carlos@gmail.com * djdt +* Dora Fraeman Caswell * Elan Ernest * Elliott Sales de Andrade * Emlyn Price @@ -56,6 +62,7 @@ The following 140 authors contributed 2611 commits. * Greg Lucas * hannah * Harshal Prakash Patankar +* Ian Hincks * Ian Thomas * ilopata1 * ImportanceOfBeingErnest @@ -65,9 +72,11 @@ The following 140 authors contributed 2611 commits. * Javad * jb-leger * Jean-Benoist Leger +* jfbu * joaonsg * Jody Klymak * Joel Frederico +* Johannes H. Jensen * Johnny Gill * Jonas Camillus Jeppesen * Jorge Moraleda @@ -75,11 +84,14 @@ The following 140 authors contributed 2611 commits. * Joseph Albert * Jouni K. Seppänen * Joy Bhalla +* Juanjo Bazán * Julian Mehne +* kolibril13 * krishna katyal * ksunden * Kyle Sunden * Larry Bradley +* lepuchi * luftek * Maciej Dems * Maik Riechert @@ -96,6 +108,7 @@ The following 140 authors contributed 2611 commits. * Mingkai Dong * MinRK * miquelastein +* Molly Rossow * Nathan Goldbaum * nathan78906 * Nelle Varoquaux @@ -103,7 +116,9 @@ The following 140 authors contributed 2611 commits. * Nicolas Courtemanche * Nikita Kniazev * njwhite +* O. Castany * Oliver Natt +* Olivier * Om Sitapara * omsitapara23 * Oriol (Prodesk) @@ -118,20 +133,25 @@ The following 140 authors contributed 2611 commits. * Peter Schutt * pharshalp * Phil Elson +* Philippe Pinard * Rebecca W Perry * ResidentMario * Richard Ji-Cathriner * RoryIAngus * Ryan May +* S. Fukuda * Samesh * Samesh Lakhotia * sasoripathos * SBCV * Sebastian Bullinger * Sergey Royz +* Siddhesh Poyarekar * Simon Legner +* SojiroFukuda * Steve Dower * Taras +* Ted Drain * teddyrendahl * Thomas A Caswell * Thomas Hisch @@ -141,7 +161,7 @@ The following 140 authors contributed 2611 commits. * Tim Hoffmann * Tom Flannaghan * Travis CI -* V\. Armando Solé +* V. Armando Solé * Vincent L.M. Mazoyer * Viraj Mohile * Wafa Soofi @@ -152,11 +172,210 @@ The following 140 authors contributed 2611 commits. * Yuya * Zhili (Jerry) Pan * zhoubecky +* Zulko GitHub issues and pull requests: -Pull Requests (598): +Pull Requests (795): +* :ghpull:`16226`: Reorganize intro section on main page +* :ghpull:`16364`: Backport PR #16344 on branch v3.2.x (Cast vmin/vmax to floats before nonsingular-expanding them.) +* :ghpull:`16344`: Cast vmin/vmax to floats before nonsingular-expanding them. +* :ghpull:`16360`: Backport PR #16347 on branch v3.2.x (FIX: catch warnings from pandas in cbook._check_1d) +* :ghpull:`16357`: Backport PR #16330 on branch v3.2.x (Clearer signal handling) +* :ghpull:`16349`: Backport PR #16255 on branch v3.2.x (Move version info to sidebar) +* :ghpull:`16331`: Backport PR #16308 on branch v3.2.x (CI: Use Ubuntu Bionic compatible package names) +* :ghpull:`16332`: Backport PR #16308 on v3.2.x: CI: Use Ubuntu Bionic compatible package names +* :ghpull:`16324`: Backport PR #16323 on branch v3.2.x (Add sphinx doc for Axis.axis_name.) +* :ghpull:`16325`: Backport PR #15462 on v3.2.x: Simplify azure setup. +* :ghpull:`16323`: Add sphinx doc for Axis.axis_name. +* :ghpull:`16321`: Backport PR #16311 on branch v3.2.x (don't override non-Python signal handlers) +* :ghpull:`16308`: CI: Use Ubuntu Bionic compatible package names +* :ghpull:`16306`: Backport PR #16300 on branch v3.2.x (Don't default to negative radii in polar plot.) +* :ghpull:`16305`: Backport PR #16250 on branch v3.2.x (Fix zerolen intersect) +* :ghpull:`16300`: Don't default to negative radii in polar plot. +* :ghpull:`16278`: Backport PR #16273 on branch v3.2.x (DOC: Changing the spelling of co-ordinates.) +* :ghpull:`16277`: Prefer using MouseButton to numeric values in docs and defaults. +* :ghpull:`16248`: Update matplotlib.__doc__. +* :ghpull:`16260`: Backport PR #16259 on branch v3.2.x (TST: something changed in pytest 5.3.3 that breaks our qt fixtures) +* :ghpull:`16211`: DOC: ValidateInterval was deprecated in 3.2, not 3.1 +* :ghpull:`16224`: Backport PR #16223 on branch v3.2.x (Added DNA Features Viewer description + screenshot in docs/thirdparty/) +* :ghpull:`16223`: Added DNA Features Viewer description + screenshot in docs/thirdparty/ +* :ghpull:`16222`: Backport PR #16212 on branch v3.2.x (Fix deprecation from #13544) +* :ghpull:`16212`: Fix deprecation from #13544 +* :ghpull:`16207`: Backport PR #16189 on branch v3.2.x (MNT: set default canvas when un-pickling) +* :ghpull:`16189`: MNT: set default canvas when un-pickling +* :ghpull:`16168`: Backport PR #16166 on branch v3.2.x (Add badge for citing 3.1.2) +* :ghpull:`16148`: Backport PR #16128 on branch v3.2.x (CI: Do not use nbformat 5.0.0/5.0.1 for testing) +* :ghpull:`16145`: Backport PR #16053 on branch v3.2.x (Fix v_interval setter) +* :ghpull:`16128`: CI: Do not use nbformat 5.0.0/5.0.1 for testing +* :ghpull:`16135`: Backport PR #16112 on branch v3.2.x (CI: Fail when failed to install dependencies) +* :ghpull:`16132`: Backport PR #16126 on branch v3.2.x (TST: test_fork: Missing join) +* :ghpull:`16124`: Backport PR #16105 on branch v3.2.x (Fix legend dragging.) +* :ghpull:`16122`: Backport PR #16113 on branch v3.2.x (Renderer Graphviz inheritance diagrams as svg) +* :ghpull:`16105`: Fix legend dragging. +* :ghpull:`16113`: Renderer Graphviz inheritance diagrams as svg +* :ghpull:`16112`: CI: Fail when failed to install dependencies +* :ghpull:`16119`: Backport PR #16065 on branch v3.2.x (Nicer formatting of community aspects on front page) +* :ghpull:`16074`: Backport PR #16061 on branch v3.2.x (Fix deprecation message for axes_grid1.colorbar.) +* :ghpull:`16093`: Backport PR #16079 on branch v3.2.x (Fix restuctured text formatting) +* :ghpull:`16094`: Backport PR #16080 on branch v3.2.x (Cleanup docstrings in backend_bases.py) +* :ghpull:`16086`: FIX: use supported attribute to check pillow version +* :ghpull:`16084`: Backport PR #16077 on branch v3.2.x (Fix some typos) +* :ghpull:`16077`: Fix some typos +* :ghpull:`16079`: Fix restuctured text formatting +* :ghpull:`16080`: Cleanup docstrings in backend_bases.py +* :ghpull:`16061`: Fix deprecation message for axes_grid1.colorbar. +* :ghpull:`16006`: Ignore pos in StrCategoryFormatter.__call__ to display correct label in the preview window +* :ghpull:`16056`: Backport PR #15864 on branch v3.2.x ([Add the info of 'sviewgui' in thirdparty package]) +* :ghpull:`15864`: Add 'sviewgui' to list of thirdparty packages +* :ghpull:`16055`: Backport PR #16037 on branch v3.2.x (Doc: use empty ScalarMappable for colorbars with no associated image.) +* :ghpull:`16054`: Backport PR #16048 on branch v3.2.x (Document that colorbar() takes a label kwarg.) +* :ghpull:`16037`: Doc: use empty ScalarMappable for colorbars with no associated image. +* :ghpull:`16048`: Document that colorbar() takes a label kwarg. +* :ghpull:`16042`: Backport PR #16031 on branch v3.2.x (Fix docstring of hillshade().) +* :ghpull:`16033`: Backport PR #16028 on branch v3.2.x (Prevent FigureCanvasQT_draw_idle recursively calling itself.) +* :ghpull:`16021`: Backport PR #16007 on branch v3.2.x (Fix search on nested pages) +* :ghpull:`16019`: Backport PR #15735 on branch v3.2.x (Cleanup some mplot3d docstrings.) +* :ghpull:`15987`: Backport PR #15886 on branch v3.2.x (Fix Annotation using different units and different coords on x/y.) +* :ghpull:`15886`: Fix Annotation using different units and different coords on x/y. +* :ghpull:`15984`: Backport PR #15970 on branch v3.2.x (Process clip paths the same way as regular Paths.) +* :ghpull:`15970`: Process clip paths the same way as regular Paths. +* :ghpull:`15963`: Backport PR #15937 on branch v3.2.x (Don't hide exceptions in FontManager.addfont.) +* :ghpull:`15956`: Backport PR #15901 on branch v3.2.x (Update backend_nbagg for removal of Gcf._activeQue.) +* :ghpull:`15937`: Don't hide exceptions in FontManager.addfont. +* :ghpull:`15959`: Backport PR #15953 on branch v3.2.x (Update donation link) +* :ghpull:`15901`: Update backend_nbagg for removal of Gcf._activeQue. +* :ghpull:`15954`: Backport PR #15914 on branch v3.2.x (Example for sigmoid function with horizontal lines) +* :ghpull:`15914`: Example for sigmoid function with horizontal lines +* :ghpull:`15930`: Backport PR #15925 on branch v3.2.x (Optimize setting units to None when they're already None.) +* :ghpull:`15925`: Optimize setting units to None when they're already None. +* :ghpull:`15915`: Backport PR #15903 on branch v3.2.x (Correctly handle non-affine transData in Collection.get_datalim.) +* :ghpull:`15903`: Correctly handle non-affine transData in Collection.get_datalim. +* :ghpull:`15908`: Backport PR #15857 on branch v3.2.x (LassoSelection shouldn't useblit on canvas not supporting blitting.) +* :ghpull:`15857`: LassoSelection shouldn't useblit on canvas not supporting blitting. +* :ghpull:`15905`: Backport PR #15763 on branch v3.2.x (Skip webagg test if tornado is not available.) +* :ghpull:`15882`: Backport PR #15859 on branch v3.2.x (Doc: Move search field into nav bar) +* :ghpull:`15868`: Backport PR #15848 on branch v3.2.x: Cleanup environment variables FAQ +* :ghpull:`15872`: Backport PR #15869 on branch v3.2.x (Update markers docs.) +* :ghpull:`15869`: Update markers docs. +* :ghpull:`15867`: Backport PR #15789 on branch v3.2.x (Cleanup xticks/yticks docstrings.) +* :ghpull:`15870`: Backport PR #15865 on branch v3.2.x (Fix a typo) +* :ghpull:`15871`: Backport PR #15824 on branch v3.2.x (Document doc style for default values) +* :ghpull:`15824`: Document doc style for default values +* :ghpull:`15865`: Fix a typo +* :ghpull:`15789`: Cleanup xticks/yticks docstrings. +* :ghpull:`15862`: Backport PR #15851 on branch v3.2.x (ffmpeg is available on default ubuntu packages now) +* :ghpull:`15848`: Cleanup environment variables FAQ. +* :ghpull:`15844`: Backport PR #15841 on branch v3.2.x (DOC: specify the expected shape in the Collection.set_offset) +* :ghpull:`15841`: DOC: specify the expected shape in the Collection.set_offset +* :ghpull:`15837`: Backport PR #15799 on branch v3.2.x (Improve display of author names on PDF titlepage of matplotlib own docs) +* :ghpull:`15799`: Improve display of author names on PDF titlepage of matplotlib own docs +* :ghpull:`15831`: Backport PR #15829 on branch v3.2.x (In C extensions, use FutureWarning, not DeprecationWarning.) +* :ghpull:`15829`: In C extensions, use FutureWarning, not DeprecationWarning. +* :ghpull:`15818`: Backport PR #15619 on branch v3.2.x (Improve zorder demo) +* :ghpull:`15819`: Backport PR #15601 on branch v3.2.x (Fix FontProperties conversion to/from strings) +* :ghpull:`15601`: Fix FontProperties conversion to/from strings +* :ghpull:`15619`: Improve zorder demo +* :ghpull:`15810`: Backport PR #15809 on branch v3.2.x (Exclude artists from legend using label attributte) +* :ghpull:`15809`: Exclude artists from legend using label attributte +* :ghpull:`15808`: Backport PR #15513 on branch v3.2.x (Separate plots using #### in make_room_for_ylabel_using_axesgrid.py) +* :ghpull:`15513`: Separate plots using #### in make_room_for_ylabel_using_axesgrid.py +* :ghpull:`15807`: Backport PR #15791 on branch v3.2.x (Cleanup backend_bases docstrings.) +* :ghpull:`15791`: Cleanup backend_bases docstrings. +* :ghpull:`15803`: Backport PR #15795 on branch v3.2.x (Remove incorrect statement re: colorbars in image tutorial.) +* :ghpull:`15795`: Remove incorrect statement re: colorbars in image tutorial. +* :ghpull:`15794`: Backport PR #15793 on branch v3.2.x (fix a couple typos in tutorials) +* :ghpull:`15793`: fix a couple typos in tutorials +* :ghpull:`15774`: Backport PR #15748 on branch v3.2.x (Fix incorrect macro in FT2Font setup.) +* :ghpull:`15748`: Fix incorrect macro in FT2Font setup. +* :ghpull:`15759`: Backport PR #15751 on branch v3.2.x (Modernize FAQ entry for plt.show().) +* :ghpull:`15762`: Backport PR #15752 on branch v3.2.x (Update boxplot/violinplot faq.) +* :ghpull:`15755`: Backport PR #15661 on branch v3.2.x (Document scope of 3D scatter depthshading.) +* :ghpull:`15742`: Backport PR #15729 on branch v3.2.x (Catch correct parse errror type for dateutil >= 2.8.1) +* :ghpull:`15738`: Backport PR #15737 on branch v3.2.x (Fix env override in WebAgg backend test.) +* :ghpull:`15724`: Backport PR #15718 on branch v3.2.x (Update donation link) +* :ghpull:`15716`: Backport PR #15683 on branch v3.2.x (Cleanup dates.py docstrings.) +* :ghpull:`15683`: Cleanup dates.py docstrings. +* :ghpull:`15688`: Backport PR #15682 on branch v3.2.x (Make histogram_bin_edges private.) +* :ghpull:`15682`: Make histogram_bin_edges private. +* :ghpull:`15666`: Backport PR #15649 on branch v3.2.x (Fix searchindex.js loading when ajax fails (because e.g. CORS in embedded iframes)) +* :ghpull:`15669`: Backport PR #15654 on branch v3.2.x (Fix some broken links.) +* :ghpull:`15660`: Backport PR #15647 on branch v3.2.x (Update some links) +* :ghpull:`15653`: Backport PR #15623 on branch v3.2.x (Docstring for Artist.mouseover) +* :ghpull:`15623`: Docstring for Artist.mouseover +* :ghpull:`15634`: Backport PR #15626 on branch v3.2.x (Note minimum supported version for fontconfig.) +* :ghpull:`15633`: Backport PR #15620 on branch v3.2.x (TST: Increase tolerance of some tests for aarch64) +* :ghpull:`15626`: Note minimum supported version for fontconfig. +* :ghpull:`15632`: Backport PR #15627 on branch v3.2.x (Make it easier to test various animation writers in examples.) +* :ghpull:`15620`: TST: Increase tolerance of some tests for aarch64 +* :ghpull:`15627`: Make it easier to test various animation writers in examples. +* :ghpull:`15618`: Backport PR #15613 on branch v3.2.x (Revert "Don't bother with manually resizing the Qt main window.") +* :ghpull:`15613`: Revert "Don't bother with manually resizing the Qt main window." +* :ghpull:`15593`: Backport PR #15590 on branch v3.2.x (Rename numpy to NumPy in docs.) +* :ghpull:`15590`: Rename numpy to NumPy in docs. +* :ghpull:`15588`: Backport PR #15478 on branch v3.2.x (Make ConciseDateFormatter obey timezone) +* :ghpull:`15478`: Make ConciseDateFormatter obey timezone +* :ghpull:`15583`: Backport PR #15512 on branch v3.2.x +* :ghpull:`15584`: Backport PR #15579 on branch v3.2.x (Remove matplotlib.sphinxext.tests from __init__.py) +* :ghpull:`15579`: Remove matplotlib.sphinxext.tests from __init__.py +* :ghpull:`15577`: Backport PR #14705 on branch v3.2.x (Correctly size non-ASCII characters in agg backend.) +* :ghpull:`14705`: Correctly size non-ASCII characters in agg backend. +* :ghpull:`15572`: Backport PR #15452 on branch v3.2.x (Improve example for tick formatters) +* :ghpull:`15570`: Backport PR #15561 on branch v3.2.x (Update thirdparty scalebar) +* :ghpull:`15452`: Improve example for tick formatters +* :ghpull:`15545`: Backport PR #15429 on branch v3.2.x (Fix OSX build on azure) +* :ghpull:`15544`: Backport PR #15537 on branch v3.2.x (Add a third party package in the doc: matplotlib-scalebar) +* :ghpull:`15561`: Update thirdparty scalebar +* :ghpull:`15567`: Backport PR #15562 on branch v3.2.x (Improve docsting of AxesImage) +* :ghpull:`15562`: Improve docsting of AxesImage +* :ghpull:`15565`: Backport PR #15556 on branch v3.2.x (Fix test suite compat with ghostscript 9.50.) +* :ghpull:`15556`: Fix test suite compat with ghostscript 9.50. +* :ghpull:`15560`: Backport PR #15553 on branch v3.2.x (DOC: add cache-buster query string to css path) +* :ghpull:`15552`: Backport PR #15528 on branch v3.2.x (Declutter home page) +* :ghpull:`15554`: Backport PR #15523 on branch v3.2.x (numpydoc AxesImage) +* :ghpull:`15523`: numpydoc AxesImage +* :ghpull:`15549`: Backport PR #15516 on branch v3.2.x (Add logo like font) +* :ghpull:`15543`: Backport PR #15539 on branch v3.2.x (Small cleanups to backend docs.) +* :ghpull:`15542`: Backport PR #15540 on branch v3.2.x (axisartist tutorial fixes.) +* :ghpull:`15537`: Add a third party package in the doc: matplotlib-scalebar +* :ghpull:`15541`: Backport PR #15533 on branch v3.2.x (Use svg instead of png for website logo) +* :ghpull:`15539`: Small cleanups to backend docs. +* :ghpull:`15540`: axisartist tutorial fixes. +* :ghpull:`15538`: Backport PR #15535 on branch v3.2.x (Avoid really long lines in event handling docs.) +* :ghpull:`15535`: Avoid really long lines in event handling docs. +* :ghpull:`15531`: Backport PR #15527 on branch v3.2.x (Clarify imshow() docs concerning scaling and grayscale images) +* :ghpull:`15527`: Clarify imshow() docs concerning scaling and grayscale images +* :ghpull:`15522`: Backport PR #15500 on branch v3.2.x (Improve antialiasing example) +* :ghpull:`15524`: Backport PR #15499 on branch v3.2.x (Do not show path in font table example) +* :ghpull:`15525`: Backport PR #15498 on branch v3.2.x (Simplify matshow example) +* :ghpull:`15498`: Simplify matshow example +* :ghpull:`15499`: Do not show path in font table example +* :ghpull:`15521`: Backport PR #15519 on branch v3.2.x (FIX: fix anti-aliasing zoom bug) +* :ghpull:`15500`: Improve antialiasing example +* :ghpull:`15519`: FIX: fix anti-aliasing zoom bug +* :ghpull:`15510`: Backport PR #15489 on branch v3.2.x (DOC: adding main nav to site) +* :ghpull:`15495`: Backport PR #15486 on branch v3.2.x (Fixes an error in the documentation of Ellipse) +* :ghpull:`15488`: Backport PR #15372 on branch v3.2.x (Add example for drawstyle) +* :ghpull:`15490`: Backport PR #15487 on branch v3.2.x (Fix window not always raised in Qt example) +* :ghpull:`15487`: Fix window not always raised in Qt example +* :ghpull:`15372`: Add example for drawstyle +* :ghpull:`15485`: Backport PR #15454 on branch v3.2.x (Rewrite Anscombe's quartet example) +* :ghpull:`15483`: Backport PR #15480 on branch v3.2.x (Fix wording in [packages] section of setup.cfg) +* :ghpull:`15454`: Rewrite Anscombe's quartet example +* :ghpull:`15480`: Fix wording in [packages] section of setup.cfg +* :ghpull:`15477`: Backport PR #15464 on branch v3.2.x (Remove unused code (remainder from #15453)) +* :ghpull:`15471`: Backport PR #15460 on branch v3.2.x (Fix incorrect value check in axes_grid.) +* :ghpull:`15456`: Backport PR #15453 on branch v3.2.x (Improve example for tick locators) +* :ghpull:`15457`: Backport PR #15450 on branch v3.2.x (API: rename DivergingNorm to TwoSlopeNorm) +* :ghpull:`15450`: API: rename DivergingNorm to TwoSlopeNorm +* :ghpull:`15434`: In imsave, let pnginfo have precedence over metadata. +* :ghpull:`15445`: Backport PR #15439 on branch v3.2.x (DOC: mention discourse main page) +* :ghpull:`15425`: Backport PR #15422 on branch v3.2.x (FIX: typo in attribute lookup) +* :ghpull:`15449`: DOC: fix build +* :ghpull:`15429`: Fix OSX build on azure +* :ghpull:`15420`: Backport PR #15380 on branch v3.2.x (Update docs of BoxStyle) +* :ghpull:`15380`: Update docs of BoxStyle * :ghpull:`15300`: CI: use python -m to make sure we are using the pip/pytest we want * :ghpull:`15414`: Backport PR #15413 on branch v3.2.x (catch OSError instead of FileNotFoundError in _get_executable_info to resolve #15399) * :ghpull:`15413`: catch OSError instead of FileNotFoundError in _get_executable_info to resolve #15399 @@ -198,7 +417,6 @@ Pull Requests (598): * :ghpull:`15239`: Composite against white, not the savefig.facecolor rc, in print_jpeg. * :ghpull:`15227`: contains_point() docstring fixes * :ghpull:`15242`: Cleanup widgets docstrings. -* :ghpull:`15244`: Change documentation format of rcParams defaults * :ghpull:`14889`: Support pixel-by-pixel alpha in imshow. * :ghpull:`14928`: Logit scale nonsingular * :ghpull:`14998`: Fix nonlinear spine positions & inline Spine._calc_offset_transform into get_spine_transform. @@ -224,7 +442,7 @@ Pull Requests (598): * :ghpull:`13510`: Change Locator MAXTICKS checking to emitting a log at WARNING level. * :ghpull:`15184`: Mark missing_references extension as parallel read safe * :ghpull:`15150`: Autodetect whether pgf can use \includegraphics[interpolate]. -* :ghpull:`15163`: 3.2.0 API changes page +* :ghpull:`15163`: 3.2.0 API changes page * :ghpull:`15176`: What's new for 3.2.0 * :ghpull:`11947`: Ensure streamplot Euler step is always called when going out of bounds. * :ghpull:`13702`: Deduplicate methods shared between Container and Artist. @@ -294,7 +512,7 @@ Pull Requests (598): * :ghpull:`15067`: Fix cross-references in API changes < 1.0 * :ghpull:`15061`: Fix cross-references in tutorials and FAQ * :ghpull:`15060`: Fix cross-references in examples. -* :ghpull:`14957`: Documentation for using ConnectionPatch across Axes with constrained\_… +* :ghpull:`14957`: Documentation for using ConnectionPatch across Axes with constrained_… * :ghpull:`15053`: Make citation bit of README less wordy * :ghpull:`15044`: numpydoc set_size_inches docstring * :ghpull:`15050`: Clarify unnecessary special handling for colons in paths. @@ -448,7 +666,7 @@ Pull Requests (598): * :ghpull:`14763`: Deprecate math_symbol_table function directive * :ghpull:`14762`: Decrease uses of get_canvas_width_height. * :ghpull:`14748`: Cleanup demo_text_path. -* :ghpull:`14740`: Remove sudo tag in travis +* :ghpull:`14740`: Remove sudo tag in travis * :ghpull:`14737`: Cleanup twin axes docstrings. * :ghpull:`14729`: Small simplifications. * :ghpull:`14726`: Trivial simplification to Axis3d._get_coord_info. @@ -743,7 +961,7 @@ Pull Requests (598): * :ghpull:`13620`: Improve watermark example * :ghpull:`13589`: Kill Axes._connected. * :ghpull:`13428`: free cart pendulum animation example -* :ghpull:`10487`: fixed transparency bug +* :ghpull:`10487`: fixed transparency bug * :ghpull:`13551`: Fix IndexError for pyplot.legend() when plotting empty bar chart with label * :ghpull:`13524`: Cleanup docs for GraphicsContextBase.{get,set}_dashes. * :ghpull:`13556`: Cleanup warnings handling in tests. @@ -756,8 +974,28 @@ Pull Requests (598): * :ghpull:`13527`: Make SubplotSpec.num2 never None. * :ghpull:`12249`: Replaced noqa-comments by using Axes3D.name instead of '3d' for proje… -Issues (97): +Issues (116): +* :ghissue:`8291`: Unable to pickle.load(fig) with mpl in jupyter notebook +* :ghissue:`16127`: nbformat 5.0.0 missing schema files +* :ghissue:`15849`: Using pandas.Timestamp in blended coordinate system of ax.annotate. +* :ghissue:`6015`: scatterplot axis autoscale fails for small data values +* :ghissue:`15806`: 3.2.0 may break some Cartopy tests +* :ghissue:`15852`: Lasso selector does not show in Jupyter notebook +* :ghissue:`15820`: Show incomplete tick labels when using mixed chinese and english characters +* :ghissue:`15770`: DOCS 2D Line label option ``_nolegend_`` is not documented +* :ghissue:`15611`: BUG: Qt5Agg window size regression +* :ghissue:`7130`: Incorrect autoscaling of polar plot limits after scatter +* :ghissue:`15576`: Multi-line ticks cause cut-offs +* :ghissue:`8609`: Clipped tick labels +* :ghissue:`15517`: antialiased image check seems wrong when used on zoomed image +* :ghissue:`13400`: Qt Embedding w/ Spyder +* :ghissue:`14724`: drawstyle parameter of line needs example +* :ghissue:`13619`: Importing matplotlib.animation prevents python script from executing in the background +* :ghissue:`14270`: Secondary axis called with [0, 1] might produce exceptions in case these are invalid data +* :ghissue:`15417`: Why is smart_bounds() being deprecated? +* :ghissue:`9778`: Blanks in colorbar just inside of 'extend' arrowpoints when using AxesGrid +* :ghissue:`15336`: DivergingNorm is a misleading name * :ghissue:`15399`: OSError: [Errno 86] Bad CPU type in executable: 'convert' on import matplotlib.animation * :ghissue:`15109`: matplotlib.collections inheritance diagram small/blurry * :ghissue:`15331`: Log Scale: FloatingPointError: underflow encountered in power @@ -807,7 +1045,6 @@ Issues (97): * :ghissue:`13033`: 'NoneType' has no attribute '_alive' when using plt in a context manager * :ghissue:`13891`: Blurry app icon on macOS * :ghissue:`14656`: Axes title default color -* :ghissue:`6324`: artist.contains should check that the event occured in the same figure * :ghissue:`14831`: DOC: Webpage not formated correctly on gallery docs * :ghissue:`13819`: Aspect ratio for not so common scales * :ghissue:`8878`: Setting aspect ratio for semi-log plots @@ -867,3 +1104,5 @@ Previous GitHub Stats :reversed: prev_whats_new/github_stats_* + + diff --git a/doc/users/prev_whats_new/github_stats_3.1.2.rst b/doc/users/prev_whats_new/github_stats_3.1.2.rst new file mode 100644 index 000000000000..4cb259fc18bb --- /dev/null +++ b/doc/users/prev_whats_new/github_stats_3.1.2.rst @@ -0,0 +1,857 @@ +.. _github-stats_3-1-2: + +GitHub Stats +============ + +GitHub stats for 2019/07/01 - 2019/10/15 (tag: v3.1.1) + +These lists are automatically generated, and may be incomplete or contain duplicates. + +We closed 97 issues and merged 598 pull requests. +The full list can be seen `on GitHub `__ + +The following 140 authors contributed 2611 commits. + +* Abhinav Sagar +* Abhinuv Nitin Pitale +* Adam Gomaa +* Akshay Nair +* Alex Rudy +* Alexander Rudy +* Antony Lee +* Ao Liu (frankliuao) +* Ashley Whetter +* Ben Root +* Benjamin Bengfort +* Benjamin Congdon +* Bharat123rox +* Bingyao Liu +* Brigitta Sipocz +* brut +* Carsten +* Carsten Schelp +* Cho Yin Yong +* Chris Barnes +* Christian Brodbeck +* Christoph Pohl +* chuanzhu xu +* Colin +* Cong Ma +* dabana +* DanielMatu +* David Stansby +* Deng Tian +* depano.carlos@gmail.com +* djdt +* Elan Ernest +* Elliott Sales de Andrade +* Emlyn Price +* Eric Firing +* Eric Wieser +* Federico Ariza +* Filipe Fernandes +* fourpoints +* fredrik-1 +* Gazing +* Greg Lucas +* hannah +* Harshal Prakash Patankar +* Ian Thomas +* ilopata1 +* ImportanceOfBeingErnest +* Jacobson Okoro +* James A. Bednar +* Jarrod Millman +* Javad +* jb-leger +* Jean-Benoist Leger +* joaonsg +* Jody Klymak +* Joel Frederico +* Johnny Gill +* Jonas Camillus Jeppesen +* Jorge Moraleda +* Joscha Reimer +* Joseph Albert +* Jouni K. Seppänen +* Joy Bhalla +* Julian Mehne +* krishna katyal +* ksunden +* Kyle Sunden +* Larry Bradley +* luftek +* Maciej Dems +* Maik Riechert +* Mark Wolf +* Mark Wolfman +* Matte +* Matthias Bussonnier +* Matthias Geier +* MatthieuDartiailh +* Max Chen +* Max Shinn +* MeeseeksMachine +* Michael Droettboom +* Mingkai Dong +* MinRK +* miquelastein +* Nathan Goldbaum +* nathan78906 +* Nelle Varoquaux +* Nick White +* Nicolas Courtemanche +* Nikita Kniazev +* njwhite +* Oliver Natt +* Om Sitapara +* omsitapara23 +* Oriol (Prodesk) +* Oriol Abril +* Patrick Feiring +* Patrick Shriwise +* PatrickFeiring +* Paul +* Paul Hobson +* Paul Hoffman +* Paul Ivanov +* Peter Schutt +* pharshalp +* Phil Elson +* Rebecca W Perry +* ResidentMario +* Richard Ji-Cathriner +* RoryIAngus +* Ryan May +* Samesh +* Samesh Lakhotia +* sasoripathos +* SBCV +* Sebastian Bullinger +* Sergey Royz +* Simon Legner +* Steve Dower +* Taras +* teddyrendahl +* Thomas A Caswell +* Thomas Hisch +* Thomas Robitaille +* Till Hoffmann +* tillahoffmann +* Tim Hoffmann +* Tom Flannaghan +* Travis CI +* V\. Armando Solé +* Vincent L.M. Mazoyer +* Viraj Mohile +* Wafa Soofi +* Warren Weckesser +* y1thof +* yeo +* Yong Cho Yin +* Yuya +* Zhili (Jerry) Pan +* zhoubecky + +GitHub issues and pull requests: + +Pull Requests (598): + +* :ghpull:`15300`: CI: use python -m to make sure we are using the pip/pytest we want +* :ghpull:`15414`: Backport PR #15413 on branch v3.2.x (catch OSError instead of FileNotFoundError in _get_executable_info to resolve #15399) +* :ghpull:`15413`: catch OSError instead of FileNotFoundError in _get_executable_info to resolve #15399 +* :ghpull:`15406`: Backport PR #15347 on branch v3.2.x (Fix axes.hist bins units) +* :ghpull:`15405`: Backport PR #15391 on branch v3.2.x (Increase fontsize in inheritance graphs) +* :ghpull:`15347`: Fix axes.hist bins units +* :ghpull:`15391`: Increase fontsize in inheritance graphs +* :ghpull:`15389`: Backport PR #15379 on branch v3.2.x (Document formatting strings in the docs) +* :ghpull:`15379`: Document formatting strings in the docs +* :ghpull:`15386`: Backport PR #15385 on branch v3.2.x (Reword hist() doc.) +* :ghpull:`15385`: Reword hist() doc. +* :ghpull:`15377`: Backport PR #15357 on branch v3.2.x (Add 'step' and 'barstacked' to histogram_histtypes demo) +* :ghpull:`15357`: Add 'step' and 'barstacked' to histogram_histtypes demo +* :ghpull:`15366`: Backport PR #15364 on branch v3.2.x (DOC: fix typo in colormap docs) +* :ghpull:`15362`: Backport PR #15350 on branch v3.2.x (Don't generate double-reversed cmaps ("viridis_r_r", ...).) +* :ghpull:`15360`: Backport PR #15258 on branch v3.2.x (Don't fallback to view limits when autoscale()ing no data.) +* :ghpull:`15350`: Don't generate double-reversed cmaps ("viridis_r_r", ...). +* :ghpull:`15258`: Don't fallback to view limits when autoscale()ing no data. +* :ghpull:`15299`: Backport PR #15296 on branch v3.2.x (Fix typo/bug from 18cecf7) +* :ghpull:`15327`: Backport PR #15326 on branch v3.2.x (List of minimal versions of dependencies) +* :ghpull:`15326`: List of minimal versions of dependencies +* :ghpull:`15317`: Backport PR #15291 on branch v3.2.x (Remove error_msg_qt from backend_qt4.) +* :ghpull:`15316`: Backport PR #15283 on branch v3.2.x (Don't default axes_grid colorbar locator to MaxNLocator.) +* :ghpull:`15291`: Remove error_msg_qt from backend_qt4. +* :ghpull:`15283`: Don't default axes_grid colorbar locator to MaxNLocator. +* :ghpull:`15315`: Backport PR #15308 on branch v3.2.x (Doc: Add close event to list of events) +* :ghpull:`15308`: Doc: Add close event to list of events +* :ghpull:`15312`: Backport PR #15307 on branch v3.2.x (DOC: center footer) +* :ghpull:`15307`: DOC: center footer +* :ghpull:`15276`: Backport PR #15271 on branch v3.2.x (Fix font weight validation) +* :ghpull:`15279`: Backport PR #15252 on branch v3.2.x (Mention labels and milestones in PR review guidelines) +* :ghpull:`15252`: Mention labels and milestones in PR review guidelines +* :ghpull:`15268`: Backport PR #15266 on branch v3.2.x (Embedding in Tk example: Fix toolbar being clipped.) +* :ghpull:`15269`: Backport PR #15267 on branch v3.2.x (added multi-letter example to mathtext tutorial) +* :ghpull:`15267`: added multi-letter example to mathtext tutorial +* :ghpull:`15266`: Embedding in Tk example: Fix toolbar being clipped. +* :ghpull:`15243`: Move some new API changes to the correct place +* :ghpull:`15245`: Fix incorrect calls to warn_deprecated. +* :ghpull:`15239`: Composite against white, not the savefig.facecolor rc, in print_jpeg. +* :ghpull:`15227`: contains_point() docstring fixes +* :ghpull:`15242`: Cleanup widgets docstrings. +* :ghpull:`15244`: Change documentation format of rcParams defaults +* :ghpull:`14889`: Support pixel-by-pixel alpha in imshow. +* :ghpull:`14928`: Logit scale nonsingular +* :ghpull:`14998`: Fix nonlinear spine positions & inline Spine._calc_offset_transform into get_spine_transform. +* :ghpull:`15231`: Doc: Do not write default for non-existing rcParams +* :ghpull:`15222`: Cleanup projections/__init__.py. +* :ghpull:`15228`: Minor docstring style cleanup +* :ghpull:`15237`: Cleanup widgets.py. +* :ghpull:`15229`: Doc: Fix Bbox and BboxBase links +* :ghpull:`15235`: Kill FigureManagerTk._num. +* :ghpull:`15234`: Drop mention of msinttypes in Windows build. +* :ghpull:`15224`: Avoid infinite loop when switching actions in qt backend. +* :ghpull:`15230`: Doc: Remove hard-documented rcParams defaults +* :ghpull:`15149`: pyplot.style.use() to accept pathlib.Path objects as arguments +* :ghpull:`15220`: Correctly format floats passed to pgf backend. +* :ghpull:`15216`: Update docstrings of contains_point(s) methods +* :ghpull:`15209`: Exclude s-g generated files from flake8 check. +* :ghpull:`15204`: PEP8ify some variable names. +* :ghpull:`15196`: Force html4 writer for sphinx 2 +* :ghpull:`13544`: Improve handling of subplots spanning multiple gridspec cells. +* :ghpull:`15194`: Trivial style fixes. +* :ghpull:`15202`: Deprecate the renderer parameter to Figure.tight_layout. +* :ghpull:`15180`: Add some more internal links to 3.2.0 what's new +* :ghpull:`13510`: Change Locator MAXTICKS checking to emitting a log at WARNING level. +* :ghpull:`15184`: Mark missing_references extension as parallel read safe +* :ghpull:`15150`: Autodetect whether pgf can use \includegraphics[interpolate]. +* :ghpull:`15163`: 3.2.0 API changes page +* :ghpull:`15176`: What's new for 3.2.0 +* :ghpull:`11947`: Ensure streamplot Euler step is always called when going out of bounds. +* :ghpull:`13702`: Deduplicate methods shared between Container and Artist. +* :ghpull:`15169`: TST: verify warnings fail the test suite +* :ghpull:`14888`: Replace some polar baseline images by check_figures_equal. +* :ghpull:`15027`: More readability improvements on axis3d. +* :ghpull:`15171`: Add useful error message when trying to add Slider to 3DAxes +* :ghpull:`13775`: Doc: Scatter Hist example update +* :ghpull:`15164`: removed a typo +* :ghpull:`15152`: Support for shorthand hex colors. +* :ghpull:`15159`: Follow up on #14424 for docstring +* :ghpull:`14424`: ENH: Add argument size validation to quiver. +* :ghpull:`15137`: DOC: add example to power limit API change note +* :ghpull:`15144`: Improve local page contents CSS +* :ghpull:`15143`: Restore doc references. +* :ghpull:`15124`: Replace parameter lists with square brackets +* :ghpull:`13077`: fix FreeType build on Azure +* :ghpull:`15123`: Improve categorical example +* :ghpull:`15134`: Fix missing references in doc build. +* :ghpull:`13937`: Use PYTHONFAULTHANDLER to switch on the Python fault handler. +* :ghpull:`13452`: Replace axis_artist.AttributeCopier by normal inheritance. +* :ghpull:`15045`: Resize canvas when changing figure size +* :ghpull:`15122`: Fixed app creation in qt5 backend (see #15100) +* :ghpull:`15099`: Add lightsource parameter to bar3d +* :ghpull:`14876`: Inline some afm parsing code. +* :ghpull:`15119`: Deprecate a validator for a deprecated rcParam value. +* :ghpull:`15121`: Fix Stacked bar graph example +* :ghpull:`15113`: Cleanup layout_from_subplotspec. +* :ghpull:`13543`: Remove zip_safe=False flag from setup.py. +* :ghpull:`12860`: ENH: LogLocator: check for correct dimension of subs added +* :ghpull:`14349`: Replace ValidateInterval by simpler specialized validators. +* :ghpull:`14352`: Remove redundant is_landscape kwarg from backend_ps helpers. +* :ghpull:`15087`: Pass gid to renderer +* :ghpull:`14703`: Don't bother with manually resizing the Qt main window. +* :ghpull:`14833`: Reuse TexManager implementation in convert_psfrags. +* :ghpull:`14893`: Update layout.html for sphinx themes +* :ghpull:`15098`: Simplify symlog range determination logic +* :ghpull:`15112`: Cleanup legend() docstring. +* :ghpull:`15108`: Fix doc build and resync matplotlibrc.template with actual defaults. +* :ghpull:`14940`: Fix text kerning calculations and some FT2Font cleanup +* :ghpull:`15082`: Privatize font_manager.JSONEncoder. +* :ghpull:`15106`: Update docs of GridSpec +* :ghpull:`14832`: ENH:made default tick formatter to switch to scientific notation earlier +* :ghpull:`15086`: Style fixes. +* :ghpull:`15073`: Add entry for blume to thirdparty package index +* :ghpull:`15095`: Simplify _png extension by handling file open/close in Python. +* :ghpull:`15092`: MNT: Add test for aitoff-projection +* :ghpull:`15101`: Doc: fix typo in contour doc +* :ghpull:`14624`: Fix axis inversion with loglocator and logitlocator. +* :ghpull:`15088`: Fix more doc references. +* :ghpull:`15063`: Add Comic Neue as a fantasy font. +* :ghpull:`14867`: Propose change to PR merging policy. +* :ghpull:`15068`: Add FontManager.addfont to register fonts at specific paths. +* :ghpull:`13397`: Deprecate axes_grid1.colorbar (in favor of matplotlib's own). +* :ghpull:`14521`: Move required_interactive_framework to canvas class. +* :ghpull:`15083`: Cleanup spines example. +* :ghpull:`14997`: Correctly set formatters and locators on removed shared axis +* :ghpull:`15064`: Fix eps hatching in MacOS Preview +* :ghpull:`15074`: Write all ACCEPTS markers in docstrings as comments. +* :ghpull:`15078`: Clarify docstring of FT2Font.get_glyph_name. +* :ghpull:`15080`: Fix cross-references in API changes < 3.0.0. +* :ghpull:`15072`: Cleanup patheffects. +* :ghpull:`15071`: Cleanup offsetbox.py. +* :ghpull:`15070`: Fix cross-references in API changes < 2.0.0. +* :ghpull:`10691`: Fix for shared axes diverging after setting tick markers +* :ghpull:`15069`: Style fixes for font_manager.py. +* :ghpull:`15067`: Fix cross-references in API changes < 1.0 +* :ghpull:`15061`: Fix cross-references in tutorials and FAQ +* :ghpull:`15060`: Fix cross-references in examples. +* :ghpull:`14957`: Documentation for using ConnectionPatch across Axes with constrained\_… +* :ghpull:`15053`: Make citation bit of README less wordy +* :ghpull:`15044`: numpydoc set_size_inches docstring +* :ghpull:`15050`: Clarify unnecessary special handling for colons in paths. +* :ghpull:`14797`: DOC: create a Agg figure without pyplot in buffer example +* :ghpull:`14844`: Add citation info to README +* :ghpull:`14884`: Do not allow canvas size to become smaller than MinSize in wx backend… +* :ghpull:`14941`: Improvements to make_icons.py. +* :ghpull:`15048`: DOC: more nitpick follow up +* :ghpull:`15043`: Fix Docs: Don’t warn for unused ignores +* :ghpull:`15025`: Re-write text wrapping logic +* :ghpull:`14840`: Don't assume transform is valid on access to matrix. +* :ghpull:`14862`: Make optional in docstrings optional +* :ghpull:`15028`: Python version conf.py +* :ghpull:`15033`: FIX: un-break nightly wheels on py37 +* :ghpull:`15046`: v3.1.x merge up +* :ghpull:`15015`: Fix bad missing-references.json due to PR merge race condition. +* :ghpull:`14581`: Make logscale bar/hist autolimits more consistents. +* :ghpull:`15034`: Doc fix nitpick +* :ghpull:`14614`: Deprecate {x,y,z}axis_date. +* :ghpull:`14991`: Handle inherited is_separable, has_inverse in transform props detection. +* :ghpull:`15032`: Clarify effect of axis('equal') on explicit data limits +* :ghpull:`15031`: Update docs of GridSpec +* :ghpull:`14106`: Describe FigureManager +* :ghpull:`15024`: Update docs of GridSpecBase +* :ghpull:`14906`: Deprecate some FT2Image methods. +* :ghpull:`14963`: More Axis3D cleanup. +* :ghpull:`15009`: Provide signatures to some C-level classes and methods. +* :ghpull:`14968`: DOC: colormap manipulation tutorial update +* :ghpull:`15006`: Deprecate get/set_*ticks minor positional use +* :ghpull:`14989`: DOC:Update axes documentation +* :ghpull:`14871`: Parametrize determinism tests. +* :ghpull:`14768`: DOC: Enable nitpicky +* :ghpull:`15013`: Matplotlib requires Python 3.6, which in turn requires Mac OS X 10.6+ +* :ghpull:`15012`: Fix typesetting of "GitHub" +* :ghpull:`14954`: Cleanup polar_legend example. +* :ghpull:`14519`: Check parameters of ColorbarBase +* :ghpull:`14942`: Make _classic_test style a tiny patch on top of classic. +* :ghpull:`14988`: pathlibify/fstringify setup/setupext. +* :ghpull:`14511`: Deprecate allowing scalars for fill_between where +* :ghpull:`14493`: Remove deprecated fig parameter form GridSpecBase.get_subplot_params() +* :ghpull:`14995`: Further improve backend tutorial. +* :ghpull:`15000`: Use warnings.warn, not logging.warning, in microseconds locator warning. +* :ghpull:`14990`: Fix nonsensical transform in mixed-mode axes aspect computation. +* :ghpull:`15002`: No need to access filesystem in test_dates.py. +* :ghpull:`14549`: Improve backends documentation +* :ghpull:`14774`: Fix image bbox clip. +* :ghpull:`14978`: Typo fixes in pyplot.py +* :ghpull:`14702`: Don't enlarge toolbar for Qt high-dpi. +* :ghpull:`14922`: Autodetect some transform properties. +* :ghpull:`14962`: Replace inspect.getfullargspec by inspect.signature. +* :ghpull:`14958`: Improve docs of toplevel module. +* :ghpull:`14926`: Save a matrix unpacking/repacking in offsetbox. +* :ghpull:`14961`: Cleanup demo_agg_filter. +* :ghpull:`14924`: Kill the C-level (private) RendererAgg.buffer_rgba, which returns a copy. +* :ghpull:`14946`: Delete virtualenv faq. +* :ghpull:`14944`: Shorten style.py. +* :ghpull:`14931`: Deprecate some obscure rcParam synonyms. +* :ghpull:`14947`: Fix inaccuracy re: backends in intro tutorial. +* :ghpull:`14904`: Fix typo in secondary_axis.py example. +* :ghpull:`14925`: Support passing spine bounds as single tuple. +* :ghpull:`14921`: DOC: Make abbreviation of versus consistent. +* :ghpull:`14739`: Improve indentation of Line2D properties in docstrings. +* :ghpull:`14923`: In examples, prefer buffer_rgba to print_to_buffer. +* :ghpull:`14908`: Make matplotlib.style.available sorted alphabetically. +* :ghpull:`13567`: Deprecate MovieWriterRegistry cache-dirtyness system. +* :ghpull:`14879`: Error out when unsupported kwargs are passed to Scale. +* :ghpull:`14512`: Logit scale, changes in LogitLocator and LogitFormatter +* :ghpull:`12415`: ENH: fig.set_size to allow non-inches units +* :ghpull:`13783`: Deprecate disable_internet. +* :ghpull:`14886`: Further simplify the flow of pdf text output. +* :ghpull:`14894`: Make slowness warning for legend(loc="best") more accurate. +* :ghpull:`14891`: Fix nightly test errors +* :ghpull:`14895`: Fix typos +* :ghpull:`14890`: Remove unused private helper method in mplot3d. +* :ghpull:`14872`: Unify text layout paths. +* :ghpull:`8183`: Allow array alpha for imshow +* :ghpull:`13832`: Vectorize handling of stacked/cumulative in hist(). +* :ghpull:`13630`: Simplify PolarAxes.can_pan. +* :ghpull:`14565`: Rewrite an argument check to _check_getitem +* :ghpull:`14875`: Cleanup afm module docstring. +* :ghpull:`14880`: Fix animation blitting for plots with shared axes +* :ghpull:`14870`: FT2Font.get_char_index never returns None. +* :ghpull:`13463`: Deprecate Locator.autoscale. +* :ghpull:`13724`: ENH: anti-alias down-sampled images +* :ghpull:`14848`: Clearer error message for plt.axis() +* :ghpull:`14660`: colorbar(label=None) should give an empty label +* :ghpull:`14654`: Cleanup of docstrings of scales +* :ghpull:`14868`: Update bar stacked example to directly manipulate axes. +* :ghpull:`14749`: Fix get_canvas_width_height() for pgf backend. +* :ghpull:`14776`: Make ExecutableUnavailableError +* :ghpull:`14843`: Don't try to cleanup CallbackRegistry during interpreter shutdown. +* :ghpull:`14849`: Improve tkagg icon resolution +* :ghpull:`14866`: changed all readme headings to verbs +* :ghpull:`13364`: Numpyfy tick handling code in Axis3D. +* :ghpull:`13642`: FIX: get_datalim for collection +* :ghpull:`14860`: Stopgap fix for pandas converters in tests. +* :ghpull:`6498`: Check canvas identity in Artist.contains. +* :ghpull:`14707`: Add titlecolor in rcParams +* :ghpull:`14853`: Fix typo in set_adjustable check. +* :ghpull:`14845`: More cleanups. +* :ghpull:`14809`: Clearer calls to ConnectionPatch. +* :ghpull:`14716`: Use str instead of string as type in docstrings +* :ghpull:`14338`: Simplify/pathlibify image_comparison. +* :ghpull:`8930`: timedelta formatter +* :ghpull:`14733`: Deprecate FigureFrameWx.statusbar & NavigationToolbar2Wx.statbar. +* :ghpull:`14713`: Unite masked and NaN plot examples +* :ghpull:`14576`: Let Axes3D share have_units, _on_units_changed with 2d axes. +* :ghpull:`14575`: Make ticklabel_format work both for 2D and 3D axes. +* :ghpull:`14834`: DOC: Webpage not formated correctly on gallery docs +* :ghpull:`14730`: Factor out common parts of wx event handlers. +* :ghpull:`14727`: Fix axes aspect for non-linear, non-log, possibly mixed-scale axes. +* :ghpull:`14835`: Only allow set_adjustable("datalim") for axes with standard data ratios. +* :ghpull:`14746`: Simplify Arrow constructor. +* :ghpull:`14752`: Doc changes to git setup +* :ghpull:`14732`: Deduplicate wx configure_subplots tool. +* :ghpull:`14715`: Use array-like in docs +* :ghpull:`14728`: More floating_axes cleanup. +* :ghpull:`14719`: Make Qt navtoolbar more robust against removal of either pan or zoom. +* :ghpull:`14695`: Various small simplifications +* :ghpull:`14745`: Replace Affine2D().scale(x, x) by Affine2D().scale(x). +* :ghpull:`14687`: Add missing spaces after commas in docs +* :ghpull:`14810`: Lighten icons of NavigationToolbar2QT on dark-themes +* :ghpull:`14786`: Deprecate axis_artist.BezierPath. +* :ghpull:`14750`: Misc. simplifications. +* :ghpull:`14807`: API change note on automatic blitting detection for backends +* :ghpull:`11004`: Deprecate smart_bounds handling in Axis and Spine +* :ghpull:`14785`: Kill some never-used attributes. +* :ghpull:`14723`: Cleanup some parameter descriptions in matplotlibrc.template +* :ghpull:`14808`: Small docstring updates +* :ghpull:`14686`: Inset orientation +* :ghpull:`14805`: Simplify text_layout example. +* :ghpull:`12052`: Make AxesImage.contains account for transforms +* :ghpull:`11860`: Let MovieFileWriter save temp files in a new dir +* :ghpull:`11423`: FigureCanvas Designer +* :ghpull:`10688`: Add legend handler and artist for FancyArrow +* :ghpull:`8321`: Added ContourSet clip_path kwarg and set_clip_path() method (#2369) +* :ghpull:`14641`: Simplify _process_plot_var_args. +* :ghpull:`14631`: Refactor from_levels_and_colors. +* :ghpull:`14790`: DOC:Add link to style examples in matplotlib.style documentation +* :ghpull:`14799`: Deprecate dates.mx2num. +* :ghpull:`14793`: Remove sudo tag in travis +* :ghpull:`14795`: Autodetect whether a canvas class supports blitting. +* :ghpull:`14794`: DOC: Update the documetation of homepage of website +* :ghpull:`14629`: Delete HTML build sources to save on artefact upload time +* :ghpull:`14792`: Fix spelling typos +* :ghpull:`14789`: Prefer Affine2D.translate to offset_transform in examples. +* :ghpull:`14783`: Cleanup mlab.detrend. +* :ghpull:`14791`: Make 'extended' and 'expanded' synonymous in font_manager +* :ghpull:`14787`: Remove axis_artist _update, which is always a noop. +* :ghpull:`14758`: Compiling C-ext with incorrect FreeType libs makes future compiles break +* :ghpull:`14763`: Deprecate math_symbol_table function directive +* :ghpull:`14762`: Decrease uses of get_canvas_width_height. +* :ghpull:`14748`: Cleanup demo_text_path. +* :ghpull:`14740`: Remove sudo tag in travis +* :ghpull:`14737`: Cleanup twin axes docstrings. +* :ghpull:`14729`: Small simplifications. +* :ghpull:`14726`: Trivial simplification to Axis3d._get_coord_info. +* :ghpull:`14718`: Add explanations for single character color names. +* :ghpull:`14710`: Pin pydocstyle<4.0 +* :ghpull:`14709`: Try to improve the readability and styling of matplotlibrc.template file +* :ghpull:`14278`: Inset axes bug and docs fix +* :ghpull:`14478`: MNT: protect from out-of-bounds data access at the c level +* :ghpull:`14569`: More deduplication of backend_tools. +* :ghpull:`14652`: Soft-deprecate transform_point. +* :ghpull:`14664`: Improve error reporting for scatter c as invalid RGBA. +* :ghpull:`14625`: Don't double-wrap in silent_list. +* :ghpull:`14689`: Update embedding_in_wx4 example. +* :ghpull:`14679`: Further simplify colormap reversal. +* :ghpull:`14667`: Move most of pytest's conf to conftest.py. +* :ghpull:`14632`: Remove reference to old Tk/Windows bug. +* :ghpull:`14673`: More shortening of setup.py prints. +* :ghpull:`14678`: Fix small typo +* :ghpull:`14680`: Format parameters in descriptions with emph instead of backticks +* :ghpull:`14674`: Simplify colormap reversal. +* :ghpull:`14672`: Artist tutorial fixes +* :ghpull:`14653`: Remove some unnecessary prints from setup.py. +* :ghpull:`14662`: Add a _check_getitem helper to go with _check_in_list/_check_isinstance. +* :ghpull:`14666`: Update IPython's doc link in Image tutorial +* :ghpull:`14671`: Improve readability of matplotlibrc.template +* :ghpull:`14665`: Fix a typo in pyplot tutorial +* :ghpull:`14616`: Use builtin round instead of np.round for scalars. +* :ghpull:`12554`: backend_template docs and fixes +* :ghpull:`14635`: Fix bug when setting negative limits and using log scale +* :ghpull:`14604`: Update hist() docstring following removal of normed kwarg. +* :ghpull:`14630`: Remove the private Tick._name attribute. +* :ghpull:`14555`: Coding guidelines concerning the API +* :ghpull:`14516`: Document and test _get_packed_offsets() +* :ghpull:`14628`: matplotlib > Matplotlib in devel docs +* :ghpull:`14627`: gitignore pip-wheel-metadta/ directory +* :ghpull:`14612`: Update some mplot3d docs. +* :ghpull:`14617`: Remove a Py2.4(!) backcompat fix. +* :ghpull:`14605`: Update hist2d() docstring. +* :ghpull:`13084`: When linking against libpng/zlib on Windows, use upstream lib names. +* :ghpull:`13685`: Remove What's new fancy example +* :ghpull:`14573`: Cleanup jpl_units. +* :ghpull:`14583`: Fix overly long lines in setupext. +* :ghpull:`14588`: Remove [status] suppress from setup.cfg. +* :ghpull:`14591`: Style fixes for secondary_axis. +* :ghpull:`14594`: DOC: Make temperature scale example use a closure for easier reusability +* :ghpull:`14447`: FIX: allow secondary axes minor locators to be set +* :ghpull:`14567`: Fix unicode_minus + usetex. +* :ghpull:`14351`: Remove some redundant check_in_list calls. +* :ghpull:`14550`: Restore thumbnail of usage guide +* :ghpull:`10222`: Use symlinks instead of copies for test result_images. +* :ghpull:`14267`: cbook docs cleanup +* :ghpull:`14556`: Improve @deprecated's docstring. +* :ghpull:`14557`: Clarify how to work with threads. +* :ghpull:`14545`: In contributing.rst, encourage kwonly args and minimizing public APIs. +* :ghpull:`14533`: Misc. style fixes. +* :ghpull:`14542`: Move plot_directive doc to main API index. +* :ghpull:`14499`: Improve custom figure example +* :ghpull:`14543`: Remove the "Developing a new backend" section from contributing guide. +* :ghpull:`14540`: Simplify backend switching in plot_directive. +* :ghpull:`14539`: Don't overindent enumerated list in plot_directive docstring. +* :ghpull:`14537`: Slightly tighten the Bbox API. +* :ghpull:`14223`: Rewrite intro to usage guide. +* :ghpull:`14495`: Numpydocify axes_artist.py +* :ghpull:`14529`: mpl_toolkits style fixes. +* :ghpull:`14528`: mathtext style fixes. +* :ghpull:`13536`: Make unit converters also handle instances of subclasses. +* :ghpull:`13730`: Include FreeType error codes in FreeType exception messages. +* :ghpull:`14500`: Fix pydocstyle D403 (First word of the first line should be properly capitalized) in examples +* :ghpull:`14506`: Simplify Qt tests. +* :ghpull:`14513`: More fixes to pydocstyle D403 (First word capitalization) +* :ghpull:`14496`: Fix pydocstyle D208 (Docstring is over-indented) +* :ghpull:`14347`: Deprecate rcsetup.validate_path_exists. +* :ghpull:`14383`: Remove the ````package_data.dlls```` setup.cfg entry. +* :ghpull:`14346`: Simplify various validators in rcsetup. +* :ghpull:`14366`: Move test_rcparams test files inline into test_rcparams.py. +* :ghpull:`14401`: Assume that mpl-data is in its standard location. +* :ghpull:`14454`: Simplify implementation of svg.image_inline. +* :ghpull:`14470`: Add _check_isinstance helper. +* :ghpull:`14479`: fstringify backend_ps more. +* :ghpull:`14484`: Support unicode minus with ps.useafm. +* :ghpull:`14494`: Style fixes. +* :ghpull:`14465`: Docstrings cleanups. +* :ghpull:`14466`: Let SecondaryAxis inherit get_tightbbox from _AxesBase. +* :ghpull:`13940`: Some more f-strings. +* :ghpull:`14379`: Remove unnecessary uses of unittest.mock. +* :ghpull:`14483`: Improve font weight guessing. +* :ghpull:`14419`: Fix test_imshow_pil on Windows. +* :ghpull:`14460`: canvas.blit() already defaults to blitting the full figure canvas. +* :ghpull:`14462`: Register timeout pytest marker. +* :ghpull:`14414`: FEATURE: Alpha channel in Gouraud triangles in the pdf backend +* :ghpull:`13659`: Clarify behavior of the 'tight' kwarg to autoscale/autoscale_view. +* :ghpull:`13901`: Only test png output for mplot3d. +* :ghpull:`13338`: Replace list.extend by star-expansion or other constructs. +* :ghpull:`14448`: Misc doc style cleanup +* :ghpull:`14310`: Update to Bounding Box for Qt5 FigureCanvasATAgg.paintEvent() +* :ghpull:`14380`: Inline $MPLLOCALFREETYPE/$PYTEST_ADDOPTS/$NPROC in .travis.yml. +* :ghpull:`14413`: MAINT: small improvements to the pdf backend +* :ghpull:`14452`: MAINT: Minor cleanup to make functions more self consisntent +* :ghpull:`14441`: Misc. docstring cleanups. +* :ghpull:`14440`: Interpolations example +* :ghpull:`14402`: Prefer ``mpl.get_data_path()``, and support Paths in FontProperties. +* :ghpull:`14420`: MAINT: Upgrade pytest again +* :ghpull:`14423`: Fix docstring of subplots(). +* :ghpull:`14410`: Use aspect=1, not aspect=True. +* :ghpull:`14412`: MAINT: Don't install pytest 4.6.0 on Travis +* :ghpull:`14377`: Rewrite assert np.* tests to use numpy.testing +* :ghpull:`14399`: Improve warning for case where data kwarg entry is ambiguous. +* :ghpull:`14390`: Cleanup docs of bezier +* :ghpull:`14400`: Fix to_rgba_array() for empty input +* :ghpull:`14308`: Small clean to SymmetricalLogLocator +* :ghpull:`14311`: travis: add c code coverage measurements +* :ghpull:`14393`: Remove remaining unicode-strings markers. +* :ghpull:`14391`: Remove explicit inheritance from object +* :ghpull:`14343`: acquiring and releaseing keypresslock when textbox is being activated +* :ghpull:`14353`: Register flaky pytest marker. +* :ghpull:`14373`: Properly hide __has_include to support C++<17 compilers. +* :ghpull:`14378`: Remove setup_method +* :ghpull:`14368`: Finish removing jquery from the repo. +* :ghpull:`14360`: Deprecate ``boxplot(..., whis="range")``. +* :ghpull:`14376`: Simplify removal of figure patch from bbox calculations. +* :ghpull:`14363`: Make is_natively_supported private. +* :ghpull:`14330`: Remove remaining unittest.TestCase uses +* :ghpull:`13663`: Kill the PkgConfig singleton in setupext. +* :ghpull:`13067`: Simplify generation of error messages for missing libpng/freetype. +* :ghpull:`14358`: DOC boxplot ``whis`` parameter +* :ghpull:`14014`: Disallow figure argument for pyplot.subplot() and Figure.add_subplot() +* :ghpull:`14350`: Use cbook._check_in_list more often. +* :ghpull:`14348`: Cleanup markers.py. +* :ghpull:`14345`: Use importorskip for tests depending on pytz. +* :ghpull:`14170`: In setup.py, inline the packages that need to be installed into setup(). +* :ghpull:`14332`: Use raw docstrings instead of escaping backslashes +* :ghpull:`14336`: Enforce pydocstyle D412 +* :ghpull:`14144`: Deprecate the 'warn' parameter to matplotlib.use(). +* :ghpull:`14328`: Remove explicit inheritance from object +* :ghpull:`14035`: Improve properties formatting in interpolated docstrings. +* :ghpull:`14018`: pep8ing. +* :ghpull:`13542`: Move {setup,install}_requires from setupext.py to setup.py. +* :ghpull:`13670`: Simplify the logic of axis(). +* :ghpull:`14046`: Deprecate checkdep_ps_distiller. +* :ghpull:`14236`: Simplify StixFonts.get_sized_alternatives_for_symbol. +* :ghpull:`14101`: Shorten _ImageBase._make_image. +* :ghpull:`14246`: Deprecate public use of makeMappingArray +* :ghpull:`13740`: Deprecate plotfile. +* :ghpull:`14216`: Walk the artist tree when preparing for saving with tight bbox. +* :ghpull:`14305`: Small grammatical error. +* :ghpull:`14104`: Factor out retrieval of data relative to datapath +* :ghpull:`14016`: pep8ify backends. +* :ghpull:`14299`: Fix #13711 by importing cbook. +* :ghpull:`14244`: Remove APIs deprecated in mpl3.0. +* :ghpull:`14068`: Alternative fix for passing iterator as frames to FuncAnimation +* :ghpull:`13711`: Deprecate NavigationToolbar2Tk.set_active. +* :ghpull:`14280`: Simplify validate_markevery logic. +* :ghpull:`14273`: pep8ify a couple of variable names. +* :ghpull:`14115`: Reorganize scatter arguments parsing. +* :ghpull:`14271`: Replace some uses of np.iterable +* :ghpull:`14257`: Changing cmap(np.nan) to 'bad' value rather than 'under' value +* :ghpull:`14259`: Deprecate string as color sequence +* :ghpull:`13506`: Change colorbar for contour to have the proper axes limits... +* :ghpull:`13494`: Add colorbar annotation example plot to gallery +* :ghpull:`14266`: Make matplotlib.figure.AxesStack private +* :ghpull:`14166`: Shorten usage of ``@image_comparison``. +* :ghpull:`14240`: Merge up 31x +* :ghpull:`14242`: Avoid a buffer copy in PillowWriter. +* :ghpull:`9672`: Only set the wait cursor if the last draw was >1s ago. +* :ghpull:`14224`: Update plt.show() doc +* :ghpull:`14218`: Use stdlib mimetypes instead of hardcoding them. +* :ghpull:`14082`: In tk backend, don't try to update mouse position after resize. +* :ghpull:`14084`: Check number of positional arguments passed to quiver() +* :ghpull:`14214`: Fix some docstring style issues. +* :ghpull:`14201`: Fix E124 flake8 violations (closing bracket indentation). +* :ghpull:`14096`: Consistently use axs to refer to a set of Axes +* :ghpull:`14204`: Fix various flake8 indent problems. +* :ghpull:`14205`: Obey flake8 "don't assign a lambda, use a def". +* :ghpull:`14198`: Remove unused imports +* :ghpull:`14173`: Prepare to change the default pad for AxesDivider.append_axes. +* :ghpull:`13738`: Fix TypeError when plotting stacked bar chart with decimal +* :ghpull:`14151`: Clarify error with usetex when cm-super is not installed. +* :ghpull:`14107`: Feature: draw percentiles in violinplot +* :ghpull:`14172`: Remove check_requirements from setupext. +* :ghpull:`14158`: Fix test_lazy_imports in presence of $MPLBACKEND or matplotlibrc. +* :ghpull:`14157`: Isolate nbagg test from user ipython profile. +* :ghpull:`14147`: Dedent overindented list in example docstring. +* :ghpull:`14134`: Deprecate the dryrun parameter to print_foo(). +* :ghpull:`14145`: Remove warnings handling for fixed bugs. +* :ghpull:`13977`: Always import pyplot when calling matplotlib.use(). +* :ghpull:`14131`: Make test suite fail on warnings. +* :ghpull:`13593`: Only autoscale_view() when needed, not after every plotting call. +* :ghpull:`13902`: Add support for metadata= and pil_kwargs= in imsave(). +* :ghpull:`14140`: Avoid backslash-quote by changing surrounding quotes. +* :ghpull:`14132`: Move some toplevel strings into the only functions that use them. +* :ghpull:`13708`: Annotation.contains shouldn't consider the text+arrow's joint bbox. +* :ghpull:`13980`: Don't let margins expand polar plots to negative radii by default. +* :ghpull:`14075`: Remove uninformative entries from glossary. +* :ghpull:`14002`: Allow pandas DataFrames through norms +* :ghpull:`14114`: Allow SVG Text-as-Text to Use Data Coordinates +* :ghpull:`14120`: Remove mention of $QT_API in matplotlibrc example. +* :ghpull:`13878`: Style fixes for floating_axes. +* :ghpull:`14108`: Deprecate FigureCanvasMac.invalidate in favor of draw_idle. +* :ghpull:`13879`: Clarify handling of "extreme" values in FloatingAxisArtistHelper. +* :ghpull:`5602`: Automatic downsampling of images. +* :ghpull:`14112`: Remove old code path in layout.html +* :ghpull:`13959`: Scatter: make "c" and "s" argument handling more consistent. +* :ghpull:`14110`: Simplify scatter_piecharts example. +* :ghpull:`14111`: Trivial cleanups. +* :ghpull:`14085`: Simplify get_current_fig_manager(). +* :ghpull:`14083`: Deprecate FigureCanvasBase.draw_cursor. +* :ghpull:`14089`: Cleanup bar_stacked, bar_unit_demo examples. +* :ghpull:`14063`: Add pydocstyle checks to flake8 +* :ghpull:`14077`: Fix tick label wobbling in animated Qt example +* :ghpull:`14070`: Cleanup some pyplot docstrings. +* :ghpull:`6280`: Added ability to offset errorbars when using errorevery. +* :ghpull:`13679`: Fix passing iterator as frames to FuncAnimation +* :ghpull:`14023`: Improve Unicode minus example +* :ghpull:`14041`: Pretty-format subprocess logs. +* :ghpull:`14038`: Cleanup path.py docstrings. +* :ghpull:`13701`: Small cleanups. +* :ghpull:`14020`: Better error message when trying to use Gtk3Agg backend without cairo +* :ghpull:`14021`: Fix ax.legend Returns markup +* :ghpull:`13986`: Support RGBA for quadmesh mode of pcolorfast. +* :ghpull:`14009`: Deprecate compare_versions. +* :ghpull:`14010`: Deprecate get_home() +* :ghpull:`13932`: Remove many unused variables. +* :ghpull:`13854`: Cleanup contour.py. +* :ghpull:`13866`: Switch PyArg_ParseTupleAndKeywords from "es" to "s". +* :ghpull:`13945`: Make unicode_minus example more focused. +* :ghpull:`13876`: Deprecate factor=None in axisartist. +* :ghpull:`13929`: Better handle deprecated rcParams. +* :ghpull:`13851`: Deprecate setting Axis.major.locator to non-Locator; idem for Formatters +* :ghpull:`13938`: numpydocify quiverkey. +* :ghpull:`13936`: Pathlibify animation. +* :ghpull:`13984`: Allow setting tick colour on 3D axes +* :ghpull:`13987`: Deprecate mlab.{apply_window,stride_repeat}. +* :ghpull:`13983`: Fix locator/formatter setting when removing shared Axes +* :ghpull:`13957`: Remove many unused variables in tests. +* :ghpull:`13981`: Test cleanups. +* :ghpull:`13970`: Check vmin/vmax are valid when doing inverse in LogNorm +* :ghpull:`13978`: Make normalize_kwargs more convenient for third-party use. +* :ghpull:`13972`: Remove _process_plot_var_args.set{line,patch}_props. +* :ghpull:`13795`: Make _warn_external correctly report warnings arising from tests. +* :ghpull:`13885`: Deprecate axisartist.grid_finder.GridFinderBase. +* :ghpull:`13913`: Fix string numbers in to_rgba() and is_color_like() +* :ghpull:`13935`: Deprecate the useless switch_backend_warn parameter to matplotlib.test. +* :ghpull:`13952`: Cleanup animation tests. +* :ghpull:`13942`: Make Cursors an (Int)Enum. +* :ghpull:`13953`: Unxfail a now fixed test in test_category. +* :ghpull:`13925`: Fix passing Path to ps backend when text.usetex rc is True. +* :ghpull:`13943`: Don't crash on str(figimage(...)). +* :ghpull:`13944`: Document how to support unicode minus in pgf backend. +* :ghpull:`13802`: New rcparam to set default axes title location +* :ghpull:`13855`: ``a and b or c`` -> ``b if a else c`` +* :ghpull:`13923`: Correctly handle invalid PNG metadata. +* :ghpull:`13926`: Suppress warnings in tests. +* :ghpull:`13920`: Style fixes for category.py. +* :ghpull:`13889`: Shorten docstrings by removing unneeded :class:/:func: + rewordings. +* :ghpull:`13911`: Fix joinstyles example +* :ghpull:`13917`: Faster categorical tick formatter. +* :ghpull:`13918`: Make matplotlib.testing assume pytest by default, not nose. +* :ghpull:`13894`: Check for positive number of rows and cols +* :ghpull:`13895`: Remove unused setupext.is_min_version. +* :ghpull:`13886`: Shorten Figure.set_size_inches. +* :ghpull:`13859`: Ensure figsize is positive finite +* :ghpull:`13877`: ``zeros_like(x) + y`` -> ``full_like(x, y)`` +* :ghpull:`13875`: Style fixes for grid_helper_curvelinear. +* :ghpull:`13873`: Style fixes to grid_finder. +* :ghpull:`13782`: Don't access internet during tests. +* :ghpull:`13833`: Some more usage of _check_in_list. +* :ghpull:`13834`: Cleanup FancyArrowPatch docstring +* :ghpull:`13811`: Generate Figure method wrappers via boilerplate.py +* :ghpull:`13797`: Move sphinxext test to matplotlib.tests like everyone else. +* :ghpull:`13770`: broken_barh docstring +* :ghpull:`13757`: Remove mention of "enabling fontconfig support". +* :ghpull:`13454`: Add "c" as alias for "color" for Collections +* :ghpull:`13756`: Reorder the logic of _update_title_position. +* :ghpull:`13744`: Restructure boilerplate.py +* :ghpull:`13369`: Use default colours for examples +* :ghpull:`13697`: Delete pyplot_scales example. +* :ghpull:`13726`: Clarify a bit the implementation of blend_hsv. +* :ghpull:`13731`: Check for already running QApplication in Qt embedding example. +* :ghpull:`13736`: Deduplicate docstrings and validation for set_alpha. +* :ghpull:`13737`: Remove duplicated methods in FixedAxisArtistHelper. +* :ghpull:`13721`: Kill pyplot docstrings that get overwritten by @docstring.copy. +* :ghpull:`13690`: Cleanup hexbin. +* :ghpull:`13683`: Remove axes border for examples that list styles +* :ghpull:`13280`: Add SubplotSpec.add_subplot. +* :ghpull:`11387`: Deprecate Axes3D.w_{x,y,z}axis in favor of .{x,y,z}axis. +* :ghpull:`13671`: Suppress some warnings in tests. +* :ghpull:`13657`: DOC: fail the doc build on errors, but keep going to end +* :ghpull:`13647`: Fix FancyArrowPatch joinstyle +* :ghpull:`13637`: BLD: parameterize python_requires +* :ghpull:`13633`: plot_directive: Avoid warning if plot_formats doesn't contain 'png' +* :ghpull:`13629`: Small example simplification. +* :ghpull:`13620`: Improve watermark example +* :ghpull:`13589`: Kill Axes._connected. +* :ghpull:`13428`: free cart pendulum animation example +* :ghpull:`10487`: fixed transparency bug +* :ghpull:`13551`: Fix IndexError for pyplot.legend() when plotting empty bar chart with label +* :ghpull:`13524`: Cleanup docs for GraphicsContextBase.{get,set}_dashes. +* :ghpull:`13556`: Cleanup warnings handling in tests. +* :ghpull:`8100`: Deprecate MAXTICKS, Locator.raise_if_exceeds. +* :ghpull:`13534`: More followup to autoregistering 3d axes. +* :ghpull:`13327`: pcolorfast simplifications. +* :ghpull:`13532`: More use of cbook._check_in_list. +* :ghpull:`13520`: Register 3d projection by default. +* :ghpull:`13394`: Deduplicate some code between floating_axes and grid_helper_curvelinear. +* :ghpull:`13527`: Make SubplotSpec.num2 never None. +* :ghpull:`12249`: Replaced noqa-comments by using Axes3D.name instead of '3d' for proje… + +Issues (97): + +* :ghissue:`15399`: OSError: [Errno 86] Bad CPU type in executable: 'convert' on import matplotlib.animation +* :ghissue:`15109`: matplotlib.collections inheritance diagram small/blurry +* :ghissue:`15331`: Log Scale: FloatingPointError: underflow encountered in power +* :ghissue:`15251`: Large memory growth with log scaling and linear ticking +* :ghissue:`15247`: Colorbar tick placement issues with ImageGrid and LogNorm +* :ghissue:`15306`: Footer off centre +* :ghissue:`13485`: Matplotlib NavigationToolbar2Tk disappears when reducing window size +* :ghissue:`15232`: DOC: Automatic default rcParam expansion creates misleading sentences +* :ghissue:`14141`: setting spine position on a log plot fails +* :ghissue:`15138`: Make plt.style.use accept path-like objects in addition to string +* :ghissue:`14207`: Check if point is in path or not by contains_point +* :ghissue:`13591`: Style issues when building the docs with (future) Sphinx 2.0 +* :ghissue:`8089`: Using Minute Locator to set x-axis ticks exceeds Locator.MAXTICKS +* :ghissue:`15075`: sphinxext.missing_references does not specify if it supports parallel file read. +* :ghissue:`10963`: Replace \pgfimage by \includegraphics in PGF backend +* :ghissue:`15156`: ax.text fails with positional argument error +* :ghissue:`14439`: hist() fails when all data points are np.nan +* :ghissue:`15042`: How to handle sphinx nitpicky mode +* :ghissue:`14060`: quiver(C=...) argument is not reasonably validated +* :ghissue:`11335`: TST: testing not catching bad escape sequences in doc strings +* :ghissue:`15040`: Wrong figure window size after calling fig.set_size_inches() repeatedly +* :ghissue:`15100`: Issue with creating QApplication in QT backend +* :ghissue:`14887`: kerning seems generally wrong +* :ghissue:`14800`: default tick formatter could switch to scientific notation earlier +* :ghissue:`14503`: Add a test for #14451 +* :ghissue:`14907`: ConnectionPatch across axes needs to be excluded from layout management +* :ghissue:`14911`: Removing a shared axes via ``ax.remove()`` leads to an error. +* :ghissue:`12462`: cbar.add_lines should allow manually adding lines, not just contour sets +* :ghissue:`14796`: Show user how to use Agg buffer in example +* :ghissue:`14883`: MinSize not respected using wx backend causes wxAssertionError. Bug fix included. +* :ghissue:`15014`: Wrapping of text adds leading newline character if first word is long +* :ghissue:`14918`: constrained_layout fails with hidden axis... +* :ghissue:`14981`: Barplot call crashes when called with yscale="log" and bins with h=0 +* :ghissue:`4621`: Default bottom of Stepfilled histograms should be set according to ymin +* :ghissue:`15030`: Doc build broken +* :ghissue:`8093`: set_ylim not working with plt.axis('equal') +* :ghissue:`6055`: Serious problems on the axes documentation +* :ghissue:`9979`: Axis limits are set badly with small values in scatter(). +* :ghissue:`10842`: Text bbox empty dict should be ignored +* :ghissue:`13698`: The default logit minor locator should not display tick labels +* :ghissue:`14878`: plt.yscale doesn't throw warning with invalid kwarg +* :ghissue:`5619`: Symlog linear region +* :ghissue:`14564`: Broken string interpolation +* :ghissue:`13668`: Add better error message to plt.axis() +* :ghissue:`14563`: colorbar label prints "None" when label=None +* :ghissue:`13660`: Closing a matplotlib figure with event handling occasionally causes “TypeError: isinstance()” +* :ghissue:`13033`: 'NoneType' has no attribute '_alive' when using plt in a context manager +* :ghissue:`13891`: Blurry app icon on macOS +* :ghissue:`14656`: Axes title default color +* :ghissue:`6324`: artist.contains should check that the event occured in the same figure +* :ghissue:`14831`: DOC: Webpage not formated correctly on gallery docs +* :ghissue:`13819`: Aspect ratio for not so common scales +* :ghissue:`8878`: Setting aspect ratio for semi-log plots +* :ghissue:`4900`: UnboundLocalError: local variable 'aspect_scale_mode' referenced before assignment +* :ghissue:`14608`: Issue with using plt.axis('equal') with plt.polar(theta,r) plot +* :ghissue:`12893`: [PyQt] NavigationToolbar2QT : Error when removing tools +* :ghissue:`14670`: indicate_inset rectangles is sensitive to axis-flipping +* :ghissue:`14362`: Add link to style examples in matplotlib.style documentation +* :ghissue:`6295`: restore_region is not documented as a method of FigureCanvas +* :ghissue:`14754`: Better pointer to dev docs on website +* :ghissue:`14744`: Savefig svg fails with "Cannot cast array data from dtype(' Date: Sat, 1 Feb 2020 20:23:27 -0500 Subject: [PATCH 035/113] DOC: update DOIs for citing --- doc/citing.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/citing.rst b/doc/citing.rst index 1c198bf73e96..1a25d9bfefe2 100644 --- a/doc/citing.rst +++ b/doc/citing.rst @@ -27,6 +27,9 @@ pp. 90-95, 2007 `_. DOIs ---- +v3.1.3 + .. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.3633844.svg + :target: https://doi.org/10.5281/zenodo.3633844 v3.1.2 .. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.3563226.svg :target: https://doi.org/10.5281/zenodo.3563226 @@ -45,6 +48,9 @@ v3.0.2 v3.0.1 .. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.1482098.svg :target: https://doi.org/10.5281/zenodo.1482098 +v2.2.5 + .. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.3633833.svg + :target: https://doi.org/10.5281/zenodo.3633833 v3.0.0 .. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.1420605.svg :target: https://doi.org/10.5281/zenodo.1420605 From 5c310e91f829c87262f1b92d068b5f55e695b9fe Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sat, 1 Feb 2020 22:44:49 -0500 Subject: [PATCH 036/113] DOC: fix githubstats --- doc/users/github_stats.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/users/github_stats.rst b/doc/users/github_stats.rst index 0c67fc8f008e..9c9a66c8fa29 100644 --- a/doc/users/github_stats.rst +++ b/doc/users/github_stats.rst @@ -512,7 +512,7 @@ Pull Requests (795): * :ghpull:`15067`: Fix cross-references in API changes < 1.0 * :ghpull:`15061`: Fix cross-references in tutorials and FAQ * :ghpull:`15060`: Fix cross-references in examples. -* :ghpull:`14957`: Documentation for using ConnectionPatch across Axes with constrained_… +* :ghpull:`14957`: Documentation for using ConnectionPatch across Axes with constrained * :ghpull:`15053`: Make citation bit of README less wordy * :ghpull:`15044`: numpydoc set_size_inches docstring * :ghpull:`15050`: Clarify unnecessary special handling for colons in paths. From 28bc85f615de1a7fa575143c712c699c7b7a3001 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sat, 1 Feb 2020 23:12:38 -0500 Subject: [PATCH 037/113] REL: v3.2.0rc3 This is the third rc for Matplotlib 3.2 From 4882df5096805571aee9538ccc68b31a9116da02 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sat, 1 Feb 2020 23:17:26 -0500 Subject: [PATCH 038/113] BLD: bump branch away from tag From 4fe1e3baa96dcf2efdea10c17249d57b0649a97b Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 3 Feb 2020 11:40:33 -0500 Subject: [PATCH 039/113] Backport PR #16394: Mark inkscape 1.0 as unsupported (at least for now). --- doc/devel/testing.rst | 2 +- lib/matplotlib/__init__.py | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/doc/devel/testing.rst b/doc/devel/testing.rst index 68b91eb5b503..44a0bb937c86 100644 --- a/doc/devel/testing.rst +++ b/doc/devel/testing.rst @@ -28,7 +28,7 @@ The following software is required to run the tests: - pytest_ (>=3.6) - Ghostscript_ (>= 9.0, to render PDF files) -- Inkscape_ (to render SVG files) +- Inkscape_ (<1.0, to render SVG files) Optionally you can install: diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 9bdc53b2ef54..9d570f42a317 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -345,7 +345,7 @@ def impl(args, regex, min_ver=None, ignore_exit_code=False): if min_ver is not None and version < min_ver: raise ExecutableNotFoundError( f"You have {args[0]} version {version} but the minimum " - f"version supported by Matplotlib is {min_ver}.") + f"version supported by Matplotlib is {min_ver}") return _ExecInfo(args[0], version) else: raise ExecutableNotFoundError( @@ -366,7 +366,12 @@ def impl(args, regex, min_ver=None, ignore_exit_code=False): message = "Failed to find a Ghostscript installation" raise ExecutableNotFoundError(message) elif name == "inkscape": - return impl(["inkscape", "-V"], "^Inkscape ([^ ]*)") + info = impl(["inkscape", "-V"], "^Inkscape ([^ ]*)") + if info and info.version >= "1.0": + raise ExecutableNotFoundError( + f"You have Inkscape version {info.version} but Matplotlib " + f"only supports Inkscape<1.0") + return info elif name == "magick": path = None if sys.platform == "win32": @@ -403,7 +408,7 @@ def impl(args, regex, min_ver=None, ignore_exit_code=False): or "0.9" <= info.version <= "1.0"): raise ExecutableNotFoundError( f"You have pdftops version {info.version} but the minimum " - f"version supported by Matplotlib is 3.0.") + f"version supported by Matplotlib is 3.0") return info else: raise ValueError("Unknown executable: {!r}".format(name)) From dfc8a0c00afa8fe151297ea755266b223af90cd2 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 3 Feb 2020 14:46:10 -0500 Subject: [PATCH 040/113] Backport PR #16396: font_manager docs cleanup. --- lib/matplotlib/font_manager.py | 44 +++++++++++++++++----------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/lib/matplotlib/font_manager.py b/lib/matplotlib/font_manager.py index fee4691d1116..db4a78b94c55 100644 --- a/lib/matplotlib/font_manager.py +++ b/lib/matplotlib/font_manager.py @@ -1,11 +1,11 @@ """ A module for finding, managing, and using fonts across platforms. -This module provides a single :class:`FontManager` instance that can -be shared across backends and platforms. The :func:`findfont` +This module provides a single `FontManager` instance that can +be shared across backends and platforms. The `findfont` function returns the best TrueType (TTF) font file in the local or -system font path that matches the specified :class:`FontProperties` -instance. The :class:`FontManager` also handles Adobe Font Metrics +system font path that matches the specified `FontProperties` +instance. The `FontManager` also handles Adobe Font Metrics (AFM) font files for use by the PostScript backend. The design is based on the `W3C Cascading Style Sheet, Level 1 (CSS1) @@ -569,29 +569,29 @@ class FontProperties: `_ font specification. The six properties are: - - family: A list of font names in decreasing order of priority. - The items may include a generic font family name, either - 'serif', 'sans-serif', 'cursive', 'fantasy', or 'monospace'. - In that case, the actual font to be used will be looked up - from the associated rcParam. + - family: A list of font names in decreasing order of priority. + The items may include a generic font family name, either + 'serif', 'sans-serif', 'cursive', 'fantasy', or 'monospace'. + In that case, the actual font to be used will be looked up + from the associated rcParam. - - style: Either 'normal', 'italic' or 'oblique'. + - style: Either 'normal', 'italic' or 'oblique'. - - variant: Either 'normal' or 'small-caps'. + - variant: Either 'normal' or 'small-caps'. - - stretch: A numeric value in the range 0-1000 or one of - 'ultra-condensed', 'extra-condensed', 'condensed', - 'semi-condensed', 'normal', 'semi-expanded', 'expanded', - 'extra-expanded' or 'ultra-expanded' + - stretch: A numeric value in the range 0-1000 or one of + 'ultra-condensed', 'extra-condensed', 'condensed', + 'semi-condensed', 'normal', 'semi-expanded', 'expanded', + 'extra-expanded' or 'ultra-expanded'. - - weight: A numeric value in the range 0-1000 or one of - 'ultralight', 'light', 'normal', 'regular', 'book', 'medium', - 'roman', 'semibold', 'demibold', 'demi', 'bold', 'heavy', - 'extra bold', 'black' + - weight: A numeric value in the range 0-1000 or one of + 'ultralight', 'light', 'normal', 'regular', 'book', 'medium', + 'roman', 'semibold', 'demibold', 'demi', 'bold', 'heavy', + 'extra bold', 'black'. - - size: Either an relative value of 'xx-small', 'x-small', - 'small', 'medium', 'large', 'x-large', 'xx-large' or an - absolute font size, e.g., 12 + - size: Either an relative value of 'xx-small', 'x-small', + 'small', 'medium', 'large', 'x-large', 'xx-large' or an + absolute font size, e.g., 12. The default font property for TrueType fonts (as specified in the default rcParams) is :: From cb34119b667b8abced7373b14c42055a730e0c2b Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Fri, 7 Feb 2020 10:49:12 -0500 Subject: [PATCH 041/113] Backport PR #16435: Reword intro to colors api docs. --- doc/api/colors_api.rst | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/doc/api/colors_api.rst b/doc/api/colors_api.rst index 9a8717541b99..af0379cb3911 100644 --- a/doc/api/colors_api.rst +++ b/doc/api/colors_api.rst @@ -2,13 +2,8 @@ ``matplotlib.colors`` ********************* -For a visual representation of the Matplotlib colormaps, see: - -* The :ref:`color_examples` examples for examples of controlling color with - Matplotlib. -* The :ref:`tutorials-colors` tutorial for an in-depth guide on controlling - color. - +The Color :ref:`tutorials ` and :ref:`examples +` demonstrate how to set colors and colormaps. .. currentmodule:: matplotlib.colors From 45b5d6fb2196dbcfeec934c67b8320ad5a1d9dcb Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Sun, 9 Feb 2020 09:14:13 -0800 Subject: [PATCH 042/113] Backport PR #16452: Don't make InvertedLogTransform inherit from deprecated base class. --- lib/matplotlib/scale.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/scale.py b/lib/matplotlib/scale.py index cb611212dba7..90e8090fa82f 100644 --- a/lib/matplotlib/scale.py +++ b/lib/matplotlib/scale.py @@ -313,7 +313,7 @@ def inverted(self): return InvertedLogTransform(self.base) -class InvertedLogTransform(InvertedLogTransformBase): +class InvertedLogTransform(Transform): input_dims = output_dims = 1 def __init__(self, base): From 7aa4a1b447976ae51b1dbf5e08ecaba6bd95458e Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Mon, 10 Feb 2020 12:33:45 -0800 Subject: [PATCH 043/113] Backport PR #16450: Fix interaction between sticky_edges and shared axes. --- lib/matplotlib/axes/_base.py | 27 +++++++++++++++++++-------- lib/matplotlib/tests/test_axes.py | 15 +++++++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index cf12447df73f..694945d57389 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -2371,14 +2371,25 @@ def autoscale_view(self, tight=None, scalex=True, scaley=True): if tight is not None: self._tight = bool(tight) - if self.use_sticky_edges and ( - (self._xmargin and scalex and self._autoscaleXon) or - (self._ymargin and scaley and self._autoscaleYon)): - stickies = [artist.sticky_edges for artist in self.get_children()] - else: # Small optimization. - stickies = [] - x_stickies = np.sort([x for sticky in stickies for x in sticky.x]) - y_stickies = np.sort([y for sticky in stickies for y in sticky.y]) + x_stickies = y_stickies = np.array([]) + if self.use_sticky_edges: + # Only iterate over axes and artists if needed. The check for + # ``hasattr(ax, "lines")`` is necessary because this can be called + # very early in the axes init process (e.g., for twin axes) when + # these attributes don't even exist yet, in which case + # `get_children` would raise an AttributeError. + if self._xmargin and scalex and self._autoscaleXon: + x_stickies = np.sort(np.concatenate([ + artist.sticky_edges.x + for ax in self._shared_x_axes.get_siblings(self) + if hasattr(ax, "lines") + for artist in ax.get_children()])) + if self._ymargin and scaley and self._autoscaleYon: + y_stickies = np.sort(np.concatenate([ + artist.sticky_edges.y + for ax in self._shared_y_axes.get_siblings(self) + if hasattr(ax, "lines") + for artist in ax.get_children()])) if self.get_xscale().lower() == 'log': x_stickies = x_stickies[x_stickies > 0] if self.get_yscale().lower() == 'log': diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 4bf3e8724745..5edb4f24b44f 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -334,6 +334,21 @@ def test_use_sticky_edges(): assert_allclose(ax.get_ylim(), (-0.5, 1.5)) +@check_figures_equal(extensions=["png"]) +def test_sticky_shared_axes(fig_test, fig_ref): + # Check that sticky edges work whether they are set in an axes that is a + # "master" in a share, or an axes that is a "follower". + Z = np.arange(15).reshape(3, 5) + + ax0 = fig_test.add_subplot(211) + ax1 = fig_test.add_subplot(212, sharex=ax0) + ax1.pcolormesh(Z) + + ax0 = fig_ref.add_subplot(212) + ax1 = fig_ref.add_subplot(211, sharex=ax0) + ax0.pcolormesh(Z) + + @image_comparison(['offset_points'], remove_text=True) def test_basic_annotate(): # Setup some data From c4867bd6770203fc09492b4fe3bf23891b412291 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Mon, 10 Feb 2020 10:35:01 -1000 Subject: [PATCH 044/113] Backport PR #16392: FIX colorbars for Norms that do not have a scale. --- lib/matplotlib/colorbar.py | 22 +++++++++++++--------- lib/matplotlib/tests/test_colorbar.py | 1 - 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index 301461af8c25..92926ee6a870 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -485,6 +485,7 @@ def __init__(self, ax, cmap=None, self.locator = None self.formatter = None self._manual_tick_data_values = None + self.__scale = None # linear, log10 for now. Hopefully more? if ticklocation == 'auto': ticklocation = 'bottom' if orientation == 'horizontal' else 'right' @@ -611,11 +612,9 @@ def _use_auto_colorbar_locator(self): Return if we should use an adjustable tick locator or a fixed one. (check is used twice so factored out here...) """ - contouring = ((self.boundaries is not None) and - (self.spacing == 'uniform')) - return (((type(self.norm) == colors.Normalize) - or (type(self.norm) == colors.LogNorm)) - and not contouring) + contouring = self.boundaries is not None and self.spacing == 'uniform' + return (type(self.norm) in [colors.Normalize, colors.LogNorm] and + not contouring) def _reset_locator_formatter_scale(self): """ @@ -631,9 +630,14 @@ def _reset_locator_formatter_scale(self): self.ax.set_xscale('log') self.ax.set_yscale('log') self.minorticks_on() + self.__scale = 'log' else: self.ax.set_xscale('linear') self.ax.set_yscale('linear') + if type(self.norm) is colors.Normalize: + self.__scale = 'linear' + else: + self.__scale = 'manual' def update_ticks(self): """ @@ -1123,13 +1127,13 @@ def _mesh(self): else: y = self._proportional_y() xmid = np.array([0.5]) - try: + if self.__scale != 'manual': y = norm.inverse(y) x = norm.inverse(x) xmid = norm.inverse(xmid) - except ValueError: - # occurs for norms that don't have an inverse, in - # which case manually scale: + else: + # if a norm doesn't have a named scale, or + # we are not using a norm dv = self.vmax - self.vmin x = x * dv + self.vmin y = y * dv + self.vmin diff --git a/lib/matplotlib/tests/test_colorbar.py b/lib/matplotlib/tests/test_colorbar.py index 27eaeb159a76..6d1f39149e09 100644 --- a/lib/matplotlib/tests/test_colorbar.py +++ b/lib/matplotlib/tests/test_colorbar.py @@ -375,7 +375,6 @@ def test_colorbar_get_ticks(): data = np.arange(1200).reshape(30, 40) levels = [0, 200, 400, 600, 800, 1000, 1200] - plt.subplot() plt.contourf(data, levels=levels) # testing getter for user set ticks From f7832e89f1a61917e0cbece6c7f32a2f78a63adf Mon Sep 17 00:00:00 2001 From: David Stansby Date: Tue, 21 Jan 2020 10:43:43 +0000 Subject: [PATCH 045/113] Backport PR #16272: Move mplot3d autoregistration api changes to 3.2. --- doc/api/prev_api_changes/api_changes_3.1.0.rst | 8 -------- 1 file changed, 8 deletions(-) diff --git a/doc/api/prev_api_changes/api_changes_3.1.0.rst b/doc/api/prev_api_changes/api_changes_3.1.0.rst index e8da17922626..f0de6061cfa3 100644 --- a/doc/api/prev_api_changes/api_changes_3.1.0.rst +++ b/doc/api/prev_api_changes/api_changes_3.1.0.rst @@ -17,14 +17,6 @@ regardless of whether `matplotlib.pyplot` has been imported. If the user tries to switch from an already-started interactive backend to a different interactive backend, an `ImportError` will be raised. -mplot3d auto-registration -~~~~~~~~~~~~~~~~~~~~~~~~~ - -`mpl_toolkits.mplot3d` is always registered by default now. It is no -longer necessary to import mplot3d to create 3d axes with :: - - ax = fig.add_subplot(111, projection="3d") - Invalid points in PathCollections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PathCollections created with `~.Axes.scatter` now keep track of invalid points. From a9ce19cfe8c3d4299d334d768bf516f2aaf9c046 Mon Sep 17 00:00:00 2001 From: David Stansby Date: Tue, 21 Jan 2020 10:43:43 +0000 Subject: [PATCH 046/113] Backport PR #16272: Move mplot3d autoregistration api changes to 3.2. --- doc/api/prev_api_changes/api_changes_3.1.0.rst | 8 -------- doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst | 8 ++++++++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/api/prev_api_changes/api_changes_3.1.0.rst b/doc/api/prev_api_changes/api_changes_3.1.0.rst index b21c2c6a9d75..d622085e657f 100644 --- a/doc/api/prev_api_changes/api_changes_3.1.0.rst +++ b/doc/api/prev_api_changes/api_changes_3.1.0.rst @@ -17,14 +17,6 @@ regardless of whether `matplotlib.pyplot` has been imported. If the user tries to switch from an already-started interactive backend to a different interactive backend, an `ImportError` will be raised. -mplot3d auto-registration -~~~~~~~~~~~~~~~~~~~~~~~~~ - -`mpl_toolkits.mplot3d` is always registered by default now. It is no -longer necessary to import mplot3d to create 3d axes with :: - - ax = fig.add_subplot(111, projection="3d") - Invalid points in PathCollections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PathCollections created with `~.Axes.scatter` now keep track of invalid points. diff --git a/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst b/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst index f50fbe4ac15e..cd7dee07f459 100644 --- a/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst +++ b/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst @@ -299,3 +299,11 @@ package, and Axes methods that take a ``norm`` parameter. If extra kwargs are passed to `.LogScale`, `TypeError` will now be raised instead of `ValueError`. + +mplot3d auto-registration +~~~~~~~~~~~~~~~~~~~~~~~~~ + +`mpl_toolkits.mplot3d` is always registered by default now. It is no +longer necessary to import mplot3d to create 3d axes with :: + + ax = fig.add_subplot(111, projection="3d") From 8e8958d2118180c9878af7c42e181df345eb0e52 Mon Sep 17 00:00:00 2001 From: David Stansby Date: Thu, 13 Feb 2020 10:45:11 +0000 Subject: [PATCH 047/113] Backport PR #16490: Fix some typos on the front page --- doc/index.rst | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/doc/index.rst b/doc/index.rst index cf12b81bda80..317d541adbfe 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -40,7 +40,7 @@ Matplotlib makes easy things easy and hard things possible. Create - - Develop `publication quality plots`_ with just with just a few lines of code + - Develop `publication quality plots`_ with just a few lines of code - Use `interactive figures`_ that can zoom, pan, update... .. _publication quality plots: https://matplotlib.org/gallery/index.html @@ -62,7 +62,7 @@ Matplotlib makes easy things easy and hard things possible. - Explore tailored functionality provided by :doc:`third party packages ` - - Learn more about matplotlib through the many + - Learn more about Matplotlib through the many :doc:`external learning resources ` Documentation @@ -80,7 +80,7 @@ Join our community! Matplotlib is a welcoming, inclusive project, and we follow the `Python Software Foundation Code of Conduct `_ in everything we do. -.. _coc: http://www.python.org/psf/codeofconduct/ +.. _coc: https://www.python.org/psf/conduct/ .. raw:: html @@ -100,7 +100,7 @@ Software Foundation Code of Conduct `_ in everything we do.
Stackoverflow -

Check out the Matplotlib tag on stackoverflow.

+

Check out the Matplotlib tag on stackoverflow.

Gitter @@ -152,7 +152,7 @@ Toolkits ======== Matplotlib ships with several add-on :doc:`toolkits `, -including 3d plotting with `mplot3d`, axes helpers in `axes_grid1` and axis +including 3D plotting with `mplot3d`, axes helpers in `axes_grid1` and axis helpers in `axisartist`. Third party packages @@ -160,14 +160,14 @@ Third party packages A large number of :doc:`third party packages ` extend and build on Matplotlib functionality, including several higher-level -plotting interfaces (seaborn_, holoviews_, ggplot_, ...), and two projection -and mapping toolkits (basemap_ and cartopy_). +plotting interfaces (seaborn_, HoloViews_, ggplot_, ...), and two projection +and mapping toolkits (Basemap_ and Cartopy_). .. _seaborn: https://seaborn.pydata.org -.. _holoviews: http://holoviews.org +.. _HoloViews: https://holoviews.org .. _ggplot: http://ggplot.yhathq.com -.. _basemap: https://matplotlib.org/basemap -.. _cartopy: https://scitools.org.uk/cartopy/docs/latest +.. _Basemap: https://matplotlib.org/basemap +.. _Cartopy: https://scitools.org.uk/cartopy/docs/latest Citing Matplotlib ================= @@ -204,7 +204,7 @@ law. As with any donation, you should consult with your tax adviser about your particular tax situation. Please consider `donating to the Matplotlib project `_ through -the Numfocus organization or to the `John Hunter Technology Fellowship +the NumFOCUS organization or to the `John Hunter Technology Fellowship `_. .. _donating: https://numfocus.org/donate-to-matplotlib @@ -214,7 +214,7 @@ the Numfocus organization or to the `John Hunter Technology Fellowship The :doc:`Matplotlib license ` is based on the `Python Software Foundation (PSF) license `_. -.. _psf-license: http://www.python.org/psf/license +.. _psf-license: https://www.python.org/psf/license There is an active developer community and a long list of people who have made significant :doc:`contributions `. From 5a879ebc36c57926bd965558073b58b7784ea8f2 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Fri, 14 Feb 2020 08:30:21 +0100 Subject: [PATCH 048/113] Backport PR #16505: Add link to blog to front page --- doc/index.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/index.rst b/doc/index.rst index 317d541adbfe..19a3c9e1ca9c 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -120,8 +120,11 @@ Software Foundation Code of Conduct `_ in everything we do.
Social media -

Tweet us at Twitter! - or see cool plots on Instagram!

+

From 7f85b70acc8a26715099a112073a219bef0c24b8 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Sat, 15 Feb 2020 15:14:40 +0100 Subject: [PATCH 049/113] Backport PR #16502: Document theta getters/setters --- lib/matplotlib/projections/polar.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/matplotlib/projections/polar.py b/lib/matplotlib/projections/polar.py index 00692801d85d..0f11abdbe119 100644 --- a/lib/matplotlib/projections/polar.py +++ b/lib/matplotlib/projections/polar.py @@ -1016,15 +1016,19 @@ def _gen_axes_spines(self): return spines def set_thetamax(self, thetamax): + """Set the maximum theta limit in degrees.""" self.viewLim.x1 = np.deg2rad(thetamax) def get_thetamax(self): + """Return the maximum theta limit in degrees.""" return np.rad2deg(self.viewLim.xmax) def set_thetamin(self, thetamin): + """Set the minimum theta limit in degrees.""" self.viewLim.x0 = np.deg2rad(thetamin) def get_thetamin(self): + """Get the minimum theta limit in degrees.""" return np.rad2deg(self.viewLim.xmin) def set_thetalim(self, *args, **kwargs): From 8a53107c527496565d6a8e01f09dc32f773eaeae Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sat, 15 Feb 2020 18:13:46 +0100 Subject: [PATCH 050/113] Backport PR #16513: Add more FreeType tarball hashes. --- setupext.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/setupext.py b/setupext.py index 74e0ffb96461..09cd6bbd70ba 100644 --- a/setupext.py +++ b/setupext.py @@ -139,6 +139,14 @@ def write_cache(local_fn, data): '33a28fabac471891d0523033e99c0005b95e5618dc8ffa7fa47f9dadcacb1c9b', '2.8.1': '876711d064a6a1bd74beb18dd37f219af26100f72daaebd2d86cb493d7cd7ec6', + '2.9': + 'bf380e4d7c4f3b5b1c1a7b2bf3abb967bda5e9ab480d0df656e0e08c5019c5e6', + '2.9.1': + 'ec391504e55498adceb30baceebd147a6e963f636eb617424bcfc47a169898ce', + '2.10.0': + '955e17244e9b38adb0c98df66abb50467312e6bb70eac07e49ce6bd1a20e809a', + '2.10.1': + '3a60d391fd579440561bf0e7f31af2222bc610ad6ce4d9d7bd2165bca8669110', } # This is the version of FreeType to use when building a local # version. It must match the value in From c43aea6d513c90ad02d3f685b78b5e71c1e0742e Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Thu, 13 Feb 2020 08:55:08 -0800 Subject: [PATCH 051/113] Backport PR #16480: Re-phrase doc for bottom kwarg to hist --- lib/matplotlib/axes/_axes.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 9e86fe7b8cfa..955302d67edd 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -6446,15 +6446,12 @@ def hist(self, x, bins=None, range=None, density=False, weights=None, ``True``, then the histogram is normalized such that the first bin equals 1. - Default is ``False`` - - bottom : array-like, scalar, or None - Location of the bottom baseline of each bin. If a scalar, - the base line for each bin is shifted by the same amount. - If an array, each bin is shifted independently and the length - of bottom must match the number of bins. If None, defaults to 0. - - Default is ``None`` + bottom : array-like, scalar, or None, default: None + Location of the bottom of each bin, ie. bins are drawn from + ``bottom`` to ``bottom + hist(x, bins)`` If a scalar, the bottom + of each bin is shifted by the same amount. If an array, each bin + is shifted independently and the length of bottom must match the + number of bins. If None, defaults to 0. histtype : {'bar', 'barstacked', 'step', 'stepfilled'}, optional The type of histogram to draw. From 215786377ad30ac6592b9359940ec3863edc1a8e Mon Sep 17 00:00:00 2001 From: Nikita Kniazev Date: Sun, 16 Feb 2020 15:11:15 +0300 Subject: [PATCH 052/113] Merge pull request #16404 from jklymak/fix-add-base-symlognorm FIX: add base kwarg to symlognor Conflicts: doc/api/next_api_changes/behaviour.rst - moved to doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst and re-worded. lib/matplotlib/colors.py - implicitly backported converting the docstring to numpy doc style. Re-worded new docstring --- .../api_changes_3.2.0/behavior.rst | 12 ++++ examples/userdemo/colormap_normalizations.py | 2 +- .../colormap_normalizations_symlognorm.py | 2 +- lib/matplotlib/colors.py | 55 +++++++++++++------ lib/matplotlib/tests/test_colors.py | 27 +++++++-- tutorials/colors/colormapnorms.py | 2 +- 6 files changed, 74 insertions(+), 26 deletions(-) diff --git a/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst b/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst index cd7dee07f459..560d9a31cbf4 100644 --- a/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst +++ b/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst @@ -307,3 +307,15 @@ mplot3d auto-registration longer necessary to import mplot3d to create 3d axes with :: ax = fig.add_subplot(111, projection="3d") + +`.SymLogNorm` now has a *base* parameter +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Previously, `.SymLogNorm` had no *base* kwarg and the base was +hard-coded to ``base=np.e``. This was inconsistent with the default +behavior of `.SymLogScale` (which defaults to ``base=10``) and the use +of the word "decade" in the documentation. + +In preparation for changing the default base to 10, calling +`.SymLogNorm` without the new *base* kwarg emits a deprecation +warning. diff --git a/examples/userdemo/colormap_normalizations.py b/examples/userdemo/colormap_normalizations.py index b13d7f213cf5..c3614efb943a 100644 --- a/examples/userdemo/colormap_normalizations.py +++ b/examples/userdemo/colormap_normalizations.py @@ -69,7 +69,7 @@ pcm = ax[0].pcolormesh(X, Y, Z1, norm=colors.SymLogNorm(linthresh=0.03, linscale=0.03, - vmin=-1.0, vmax=1.0), + vmin=-1.0, vmax=1.0, base=10), cmap='RdBu_r') fig.colorbar(pcm, ax=ax[0], extend='both') diff --git a/examples/userdemo/colormap_normalizations_symlognorm.py b/examples/userdemo/colormap_normalizations_symlognorm.py index 780381e43da8..b0fbf0dc30ea 100644 --- a/examples/userdemo/colormap_normalizations_symlognorm.py +++ b/examples/userdemo/colormap_normalizations_symlognorm.py @@ -29,7 +29,7 @@ pcm = ax[0].pcolormesh(X, Y, Z, norm=colors.SymLogNorm(linthresh=0.03, linscale=0.03, - vmin=-1.0, vmax=1.0), + vmin=-1.0, vmax=1.0, base=10), cmap='RdBu_r') fig.colorbar(pcm, ax=ax[0], extend='both') diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index b58bfc57a944..a024afbe86b7 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -1209,25 +1209,44 @@ class SymLogNorm(Normalize): *linthresh* allows the user to specify the size of this range (-*linthresh*, *linthresh*). """ - def __init__(self, linthresh, linscale=1.0, - vmin=None, vmax=None, clip=False): + def __init__(self, linthresh, linscale=1.0, vmin=None, vmax=None, + clip=False, *, base=None): """ - *linthresh*: - The range within which the plot is linear (to - avoid having the plot go to infinity around zero). - - *linscale*: - This allows the linear range (-*linthresh* to *linthresh*) - to be stretched relative to the logarithmic range. Its - value is the number of decades to use for each half of the - linear range. For example, when *linscale* == 1.0 (the - default), the space used for the positive and negative - halves of the linear range will be equal to one decade in - the logarithmic range. Defaults to 1. + Parameters + ---------- + linthresh : float + The range within which the plot is linear (to avoid having the plot + go to infinity around zero). + linscale : float, default: 1 + This allows the linear range (-*linthresh* to *linthresh*) to be + stretched relative to the logarithmic range. Its value is the + number of powers of *base* (decades for base 10) to use for each + half of the linear range. For example, when *linscale* == 1.0 + (the default), the space used for the positive and negative halves + of the linear range will be equal to a decade in the logarithmic + range if ``base=10``. + base : float, default: None + If not given, defaults to ``np.e``, consistent with prior + behavior and warns. + + In v3.3 the default value will change to 10 to be consistent with + `.SymLogNorm`. + + To suppress the warning pass base as a kwarg. + """ Normalize.__init__(self, vmin, vmax, clip) + if base is None: + self._base = np.e + cbook.warn_deprecated("3.3", message="default base may change " + "from np.e to 10. To suppress this warning specify the base " + "kwarg.") + else: + self._base = base + self._log_base = np.log(self._base) + self.linthresh = float(linthresh) - self._linscale_adj = (linscale / (1.0 - np.e ** -1)) + self._linscale_adj = (linscale / (1.0 - self._base ** -1)) if vmin is not None and vmax is not None: self._transform_vmin_vmax() @@ -1262,7 +1281,8 @@ def _transform(self, a): with np.errstate(invalid="ignore"): masked = np.abs(a) > self.linthresh sign = np.sign(a[masked]) - log = (self._linscale_adj + np.log(np.abs(a[masked]) / self.linthresh)) + log = (self._linscale_adj + + np.log(np.abs(a[masked]) / self.linthresh) / self._log_base) log *= sign * self.linthresh a[masked] = log a[~masked] *= self._linscale_adj @@ -1272,7 +1292,8 @@ def _inv_transform(self, a): """Inverse inplace Transformation.""" masked = np.abs(a) > (self.linthresh * self._linscale_adj) sign = np.sign(a[masked]) - exp = np.exp(sign * a[masked] / self.linthresh - self._linscale_adj) + exp = np.power(self._base, + sign * a[masked] / self.linthresh - self._linscale_adj) exp *= sign * self.linthresh a[masked] = exp a[~masked] /= self._linscale_adj diff --git a/lib/matplotlib/tests/test_colors.py b/lib/matplotlib/tests/test_colors.py index c0c9b6d06620..c181918519d6 100644 --- a/lib/matplotlib/tests/test_colors.py +++ b/lib/matplotlib/tests/test_colors.py @@ -388,7 +388,7 @@ def test_SymLogNorm(): """ Test SymLogNorm behavior """ - norm = mcolors.SymLogNorm(3, vmax=5, linscale=1.2) + norm = mcolors.SymLogNorm(3, vmax=5, linscale=1.2, base=np.e) vals = np.array([-30, -1, 2, 6], dtype=float) normed_vals = norm(vals) expected = [0., 0.53980074, 0.826991, 1.02758204] @@ -398,16 +398,30 @@ def test_SymLogNorm(): _mask_tester(norm, vals) # Ensure that specifying vmin returns the same result as above - norm = mcolors.SymLogNorm(3, vmin=-30, vmax=5, linscale=1.2) + norm = mcolors.SymLogNorm(3, vmin=-30, vmax=5, linscale=1.2, base=np.e) normed_vals = norm(vals) assert_array_almost_equal(normed_vals, expected) + # test something more easily checked. + norm = mcolors.SymLogNorm(1, vmin=-np.e**3, vmax=np.e**3, base=np.e) + nn = norm([-np.e**3, -np.e**2, -np.e**1, -1, + 0, 1, np.e**1, np.e**2, np.e**3]) + xx = np.array([0., 0.109123, 0.218246, 0.32737, 0.5, 0.67263, + 0.781754, 0.890877, 1.]) + assert_array_almost_equal(nn, xx) + norm = mcolors.SymLogNorm(1, vmin=-10**3, vmax=10**3, base=10) + nn = norm([-10**3, -10**2, -10**1, -1, + 0, 1, 10**1, 10**2, 10**3]) + xx = np.array([0., 0.121622, 0.243243, 0.364865, 0.5, 0.635135, + 0.756757, 0.878378, 1.]) + assert_array_almost_equal(nn, xx) + def test_SymLogNorm_colorbar(): """ Test un-called SymLogNorm in a colorbar. """ - norm = mcolors.SymLogNorm(0.1, vmin=-1, vmax=1, linscale=1) + norm = mcolors.SymLogNorm(0.1, vmin=-1, vmax=1, linscale=1, base=np.e) fig = plt.figure() mcolorbar.ColorbarBase(fig.add_subplot(111), norm=norm) plt.close(fig) @@ -418,7 +432,7 @@ def test_SymLogNorm_single_zero(): Test SymLogNorm to ensure it is not adding sub-ticks to zero label """ fig = plt.figure() - norm = mcolors.SymLogNorm(1e-5, vmin=-1, vmax=1) + norm = mcolors.SymLogNorm(1e-5, vmin=-1, vmax=1, base=np.e) cbar = mcolorbar.ColorbarBase(fig.add_subplot(111), norm=norm) ticks = cbar.get_ticks() assert sum(ticks == 0) == 1 @@ -895,9 +909,10 @@ def __add__(self, other): mydata = data.view(MyArray) for norm in [mcolors.Normalize(), mcolors.LogNorm(), - mcolors.SymLogNorm(3, vmax=5, linscale=1), + mcolors.SymLogNorm(3, vmax=5, linscale=1, base=np.e), mcolors.Normalize(vmin=mydata.min(), vmax=mydata.max()), - mcolors.SymLogNorm(3, vmin=mydata.min(), vmax=mydata.max()), + mcolors.SymLogNorm(3, vmin=mydata.min(), vmax=mydata.max(), + base=np.e), mcolors.PowerNorm(1)]: assert_array_equal(norm(mydata), norm(data)) fig, ax = plt.subplots() diff --git a/tutorials/colors/colormapnorms.py b/tutorials/colors/colormapnorms.py index 84244b15e6b6..833988456988 100644 --- a/tutorials/colors/colormapnorms.py +++ b/tutorials/colors/colormapnorms.py @@ -98,7 +98,7 @@ pcm = ax[0].pcolormesh(X, Y, Z, norm=colors.SymLogNorm(linthresh=0.03, linscale=0.03, - vmin=-1.0, vmax=1.0), + vmin=-1.0, vmax=1.0, base=10), cmap='RdBu_r') fig.colorbar(pcm, ax=ax[0], extend='both') From 80d0ac8361b44d6da5fb7d75e17eec03bfffde6a Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Thu, 2 Jan 2020 15:55:27 +0100 Subject: [PATCH 053/113] Backport PR #16006: Ignore pos in StrCategoryFormatter.__call__ to display correct label in the preview window MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ignore pos in StrCategoryFormatter.__call__ to display correct… (#16006) Ignore pos in StrCategoryFormatter.__call__ to display correct label in the preview window Conflicts: lib/matplotlib/tests/test_category.py - collision with py2 removal work (_to_str) --- lib/matplotlib/category.py | 7 ++++++- lib/matplotlib/tests/test_category.py | 8 ++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/category.py b/lib/matplotlib/category.py index 55af459fd575..9013460311cc 100644 --- a/lib/matplotlib/category.py +++ b/lib/matplotlib/category.py @@ -138,7 +138,12 @@ def __init__(self, units_mapping): self._units = units_mapping def __call__(self, x, pos=None): - return '' if pos is None else self.format_ticks([x])[0] + """ + Return the category label string for tick val *x*. + + The position *pos* is ignored. + """ + return self.format_ticks([x])[0] def format_ticks(self, values): r_mapping = {v: self._text(k) for k, v in self._units.items()} diff --git a/lib/matplotlib/tests/test_category.py b/lib/matplotlib/tests/test_category.py index 1fa38923d437..ee60482656f8 100644 --- a/lib/matplotlib/tests/test_category.py +++ b/lib/matplotlib/tests/test_category.py @@ -156,16 +156,16 @@ def test_StrCategoryFormatter(self, ax, ydata): unit = cat.UnitData(ydata) labels = cat.StrCategoryFormatter(unit._mapping) for i, d in enumerate(ydata): - assert labels(i, i) == _to_str(d) + assert labels(i, i) == d + assert labels(i, None) == d @pytest.mark.parametrize("ydata", cases, ids=ids) @pytest.mark.parametrize("plotter", PLOT_LIST, ids=PLOT_IDS) def test_StrCategoryFormatterPlot(self, ax, ydata, plotter): plotter(ax, range(len(ydata)), ydata) for i, d in enumerate(ydata): - assert ax.yaxis.major.formatter(i, i) == _to_str(d) - assert ax.yaxis.major.formatter(i+1, i+1) == "" - assert ax.yaxis.major.formatter(0, None) == "" + assert ax.yaxis.major.formatter(i) == d + assert ax.yaxis.major.formatter(i+1) == "" def axis_test(axis, labels): From 02f32f0267a026e8d87f94eb4cfbe02ce8a44745 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sun, 16 Feb 2020 19:07:34 -0500 Subject: [PATCH 054/113] Backport PR #16532: Document default value of save_count parameter in FuncAnimation Merge pull request #16532 from timhoffm/doc-save_count DOC: Document default value of save_count parameter in FuncAnimation Conflicts: lib/matplotlib/animation.py - collision with removing "optional" from docstrings --- lib/matplotlib/animation.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/animation.py b/lib/matplotlib/animation.py index d4057a19f574..2cd5f438037e 100644 --- a/lib/matplotlib/animation.py +++ b/lib/matplotlib/animation.py @@ -1615,8 +1615,10 @@ def init_func() -> iterable_of_artists fargs : tuple or None, optional Additional arguments to pass to each call to *func*. - save_count : int, optional - The number of values from *frames* to cache. + save_count : int, default: 100 + Fallback for the number of values from *frames* to cache. This is + only used if the number of frames cannot be inferred from *frames*, + i.e. when it's an iterator without length or a generator. interval : number, optional Delay between frames in milliseconds. Defaults to 200. From 0bb107409def020ae43b5fa91cb34df66b2113b0 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 18 Feb 2020 20:32:34 -0500 Subject: [PATCH 055/113] Apply suggestions from code review Co-Authored-By: Elliott Sales de Andrade --- doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst b/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst index 560d9a31cbf4..b98efee8e6b6 100644 --- a/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst +++ b/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst @@ -311,7 +311,7 @@ longer necessary to import mplot3d to create 3d axes with :: `.SymLogNorm` now has a *base* parameter ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Previously, `.SymLogNorm` had no *base* kwarg and the base was +Previously, `.SymLogNorm` had no *base* keyword argument and the base was hard-coded to ``base=np.e``. This was inconsistent with the default behavior of `.SymLogScale` (which defaults to ``base=10``) and the use of the word "decade" in the documentation. From 353379d9ed2195885bd031da843cd2267a00acdc Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 18 Feb 2020 20:33:05 -0500 Subject: [PATCH 056/113] Apply suggestions from code review Co-Authored-By: Elliott Sales de Andrade --- lib/matplotlib/colors.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index a024afbe86b7..4fe16bc121c6 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -1232,7 +1232,7 @@ def __init__(self, linthresh, linscale=1.0, vmin=None, vmax=None, In v3.3 the default value will change to 10 to be consistent with `.SymLogNorm`. - To suppress the warning pass base as a kwarg. + To suppress the warning pass *base* as a keyword argument. """ Normalize.__init__(self, vmin, vmax, clip) @@ -1240,7 +1240,7 @@ def __init__(self, linthresh, linscale=1.0, vmin=None, vmax=None, self._base = np.e cbook.warn_deprecated("3.3", message="default base may change " "from np.e to 10. To suppress this warning specify the base " - "kwarg.") + "keyword argument.") else: self._base = base self._log_base = np.log(self._base) From 86c7e6c02a08fa22fe2309a6573e56ac5e93c162 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Fri, 21 Feb 2020 09:32:49 -0500 Subject: [PATCH 057/113] DOC: more copy-editing of the SymLogNorm docstring --- lib/matplotlib/colors.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 4fe16bc121c6..9614b0360f75 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -1218,16 +1218,19 @@ def __init__(self, linthresh, linscale=1.0, vmin=None, vmax=None, The range within which the plot is linear (to avoid having the plot go to infinity around zero). linscale : float, default: 1 - This allows the linear range (-*linthresh* to *linthresh*) to be - stretched relative to the logarithmic range. Its value is the - number of powers of *base* (decades for base 10) to use for each - half of the linear range. For example, when *linscale* == 1.0 - (the default), the space used for the positive and negative halves - of the linear range will be equal to a decade in the logarithmic - range if ``base=10``. + This allows the linear range (-*linthresh* to *linthresh*) + to be stretched relative to the logarithmic range. Its + value is the number of powers of *base* to use for each + half of the linear range. + + For example, when *linscale* == 1.0 (the default) and + ``base=10``, then space used for the positive and negative + halves of the linear range will be equal to a decade in + the logarithmic. + base : float, default: None - If not given, defaults to ``np.e``, consistent with prior - behavior and warns. + If not given, defaults to ``np.e`` (consistent with prior + behavior) and warns. In v3.3 the default value will change to 10 to be consistent with `.SymLogNorm`. From eb79f6bede31124a62d877a1bb11de8127018215 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sun, 1 Mar 2020 04:51:32 -0500 Subject: [PATCH 058/113] Backport PR #16585: Fix _preprocess_data for Py3.9. --- lib/matplotlib/__init__.py | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 9d570f42a317..81fa4e59d47c 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -1561,24 +1561,17 @@ def inner(ax, *args, data=None, **kwargs): if replace_names is None or k in replace_names: bound.arguments[k] = _replacer(data, v) - bound.apply_defaults() - del bound.arguments["data"] + new_args = bound.args + new_kwargs = bound.kwargs if needs_label: all_kwargs = {**bound.arguments, **bound.kwargs} # label_namer will be in all_kwargs as we asserted above that # `label_namer is None or label_namer in arg_names`. - label = _label_from_arg(all_kwargs[label_namer], auto_label) - if "label" in arg_names: - bound.arguments["label"] = label - try: - bound.arguments.move_to_end(varkwargs_name) - except KeyError: - pass - else: - bound.arguments.setdefault(varkwargs_name, {})["label"] = label + new_kwargs["label"] = _label_from_arg( + all_kwargs[label_namer], auto_label) - return func(*bound.args, **bound.kwargs) + return func(*new_args, **new_kwargs) inner.__doc__ = _add_data_doc(inner.__doc__, replace_names) inner.__signature__ = new_sig From a6defbccea7049e22b8381558456e55c8f553afa Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sun, 1 Mar 2020 04:53:58 -0500 Subject: [PATCH 059/113] Backport PR #16605: CI: tweak the vm images we use on azure --- azure-pipelines.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 8b32707ed13d..6aa16966c9ef 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -12,17 +12,23 @@ strategy: vmImage: 'ubuntu-16.04' python.version: '3.7' macOS_py36: - vmImage: 'xcode9-macOS10.13' + vmImage: 'macOS-10.14' python.version: '3.6' macOS_py37: - vmImage: 'xcode9-macOS10.13' + vmImage: 'macOS-10.15' python.version: '3.7' + macOS_py38: + vmImage: 'macOS-latest' + python.version: '3.8' Windows_py36: vmImage: 'vs2017-win2016' python.version: '3.6' Windows_py37: vmImage: 'vs2017-win2016' python.version: '3.7' + Windows_py38: + vmImage: 'windows-latest' + python.version: '3.8' Windows_pyPre: vmImage: 'vs2017-win2016' python.version: 'Pre' From bc497f04b59f0e665f71d2f2567cd7926d10f065 Mon Sep 17 00:00:00 2001 From: Marat K Date: Sun, 1 Mar 2020 21:04:27 +0100 Subject: [PATCH 060/113] Backport PR #16564: Fix documentation to change cycler instead of lines.color. --- tutorials/introductory/customizing.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tutorials/introductory/customizing.py b/tutorials/introductory/customizing.py index 39cb457e9c66..d44c77df1eb5 100644 --- a/tutorials/introductory/customizing.py +++ b/tutorials/introductory/customizing.py @@ -21,6 +21,7 @@ import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl +from cycler import cycler plt.style.use('ggplot') data = np.random.randn(50) @@ -107,15 +108,22 @@ # the matplotlib package. rcParams can be modified directly, for example: mpl.rcParams['lines.linewidth'] = 2 -mpl.rcParams['lines.color'] = 'r' +mpl.rcParams['lines.linestyle'] = '--' plt.plot(data) +############################################################################### +# Note, that in order to change the usual `plot` color you have to change the +# *prop_cycle* property of *axes*: + +mpl.rcParams['axes.prop_cycle'] = cycler(color=['r', 'g', 'b', 'y']) +plt.plot(data) # first color is red + ############################################################################### # Matplotlib also provides a couple of convenience functions for modifying rc # settings. The :func:`matplotlib.rc` command can be used to modify multiple # settings in a single group at once, using keyword arguments: -mpl.rc('lines', linewidth=4, color='g') +mpl.rc('lines', linewidth=4, linestyle='-.') plt.plot(data) ############################################################################### From daab0fc803418b501c7e2f07b4741319f373f080 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Sun, 1 Mar 2020 22:08:41 +0100 Subject: [PATCH 061/113] Backport PR #16613: Fix edge-case in preprocess_data, if label_namer is optional and unset. --- lib/matplotlib/__init__.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 81fa4e59d47c..c4dba5f29613 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -1543,9 +1543,6 @@ def inner(ax, *args, data=None, **kwargs): return func(ax, *map(sanitize_sequence, args), **kwargs) bound = new_sig.bind(ax, *args, **kwargs) - needs_label = (label_namer - and "label" not in bound.arguments - and "label" not in bound.kwargs) auto_label = (bound.arguments.get(label_namer) or bound.kwargs.get(label_namer)) @@ -1564,12 +1561,10 @@ def inner(ax, *args, data=None, **kwargs): new_args = bound.args new_kwargs = bound.kwargs - if needs_label: - all_kwargs = {**bound.arguments, **bound.kwargs} - # label_namer will be in all_kwargs as we asserted above that - # `label_namer is None or label_namer in arg_names`. + args_and_kwargs = {**bound.arguments, **bound.kwargs} + if label_namer and "label" not in args_and_kwargs: new_kwargs["label"] = _label_from_arg( - all_kwargs[label_namer], auto_label) + args_and_kwargs.get(label_namer), auto_label) return func(*new_args, **new_kwargs) From fb901abcd2dfbcc9ae83b07bddbd610d501d8d80 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sun, 1 Mar 2020 20:31:51 -0500 Subject: [PATCH 062/113] v3.2.x: Make Azure use local FreeType. --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 6aa16966c9ef..3d80d682b196 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -95,7 +95,7 @@ steps: displayName: 'Install dependencies with pip' - bash: | - python -m pip install -ve . || + MPLLOCALFREETYPE=1 python -m pip install -ve . || [[ "$PYTHON_VERSION" = 'Pre' ]] displayName: "Install self" From 6dc53495b38c4886307e7ee35ae1e185ed44f3bc Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Mon, 2 Mar 2020 06:29:36 -0500 Subject: [PATCH 063/113] ci: Restore nuget install step on Azure for v3.2.x. This was removed in a cleanup on `master`, and backported to `v3.2.x`. While the cleanup was good, the `v3.2.x` branch still requires the use of libpng, so that step must be restored. --- azure-pipelines.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 3d80d682b196..a0dfea9c1ee0 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -81,6 +81,12 @@ steps: brew install pkg-config ffmpeg imagemagick mplayer ccache ;; win32) + nuget install libpng-msvc14-x64 -ExcludeVersion -OutputDirectory "$(build.BinariesDirectory)" + nuget install zlib-msvc14-x64 -ExcludeVersion -OutputDirectory "$(build.BinariesDirectory)" + echo ##vso[task.prependpath]$(build.BinariesDirectory)\libpng-msvc14-x64\build\native\bin_release + echo ##vso[task.prependpath]$(build.BinariesDirectory)\zlib-msvc14-x64\build\native\bin_release + echo ##vso[task.setvariable variable=CL]/I$(build.BinariesDirectory)\libpng-msvc14-x64\build\native\include /I$(build.BinariesDirectory)\zlib-msvc14-x64\build\native\include + echo ##vso[task.setvariable variable=LINK]/LIBPATH:$(build.BinariesDirectory)\libpng-msvc14-x64\build\native\lib_release /LIBPATH:$(build.BinariesDirectory)\zlib-msvc14-x64\build\native\lib_release ;; *) exit 1 From 29f2c5ef9354d7d2de7998c4b32298c069a01b8a Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Mon, 2 Mar 2020 20:30:20 -0500 Subject: [PATCH 064/113] ci: Exit early if 'Install dependencies' task fails. --- azure-pipelines.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a0dfea9c1ee0..a4ed83b5a752 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -53,6 +53,7 @@ steps: condition: and(succeeded(), eq(variables['python.version'], 'Pre')) - bash: | + set -e case "$(python -c 'import sys; print(sys.platform)')" in linux) sudo apt-get update From 1f8dbb9fa231a0c0df9da1a7a0b355e23d13702f Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Mon, 2 Mar 2020 20:42:41 -0500 Subject: [PATCH 065/113] ci: Install nuget on Azure for v3.2.x. --- azure-pipelines.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a4ed83b5a752..cc26f3b85831 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -52,6 +52,10 @@ steps: prerelease: true condition: and(succeeded(), eq(variables['python.version'], 'Pre')) +- task: NuGetToolInstaller@0 + displayName: 'Use latest available Nuget' + condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT')) + - bash: | set -e case "$(python -c 'import sys; print(sys.platform)')" in From 9bf0fef5d0654dd404cbfb88740b834fcbbe283f Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Mon, 2 Mar 2020 22:07:30 -0500 Subject: [PATCH 066/113] ci: Fix setting nuget search paths. Of course, in bash, the hash is a comment, so it needs to be quoted. --- azure-pipelines.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index cc26f3b85831..b5ccf41a788e 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -88,10 +88,10 @@ steps: win32) nuget install libpng-msvc14-x64 -ExcludeVersion -OutputDirectory "$(build.BinariesDirectory)" nuget install zlib-msvc14-x64 -ExcludeVersion -OutputDirectory "$(build.BinariesDirectory)" - echo ##vso[task.prependpath]$(build.BinariesDirectory)\libpng-msvc14-x64\build\native\bin_release - echo ##vso[task.prependpath]$(build.BinariesDirectory)\zlib-msvc14-x64\build\native\bin_release - echo ##vso[task.setvariable variable=CL]/I$(build.BinariesDirectory)\libpng-msvc14-x64\build\native\include /I$(build.BinariesDirectory)\zlib-msvc14-x64\build\native\include - echo ##vso[task.setvariable variable=LINK]/LIBPATH:$(build.BinariesDirectory)\libpng-msvc14-x64\build\native\lib_release /LIBPATH:$(build.BinariesDirectory)\zlib-msvc14-x64\build\native\lib_release + echo "##vso[task.prependpath]$(build.BinariesDirectory)\libpng-msvc14-x64\build\native\bin_release" + echo "##vso[task.prependpath]$(build.BinariesDirectory)\zlib-msvc14-x64\build\native\bin_release" + echo "##vso[task.setvariable variable=CL]/I$(build.BinariesDirectory)\libpng-msvc14-x64\build\native\include /I$(build.BinariesDirectory)\zlib-msvc14-x64\build\native\include" + echo "##vso[task.setvariable variable=LINK]/LIBPATH:$(build.BinariesDirectory)\libpng-msvc14-x64\build\native\lib_release /LIBPATH:$(build.BinariesDirectory)\zlib-msvc14-x64\build\native\lib_release" ;; *) exit 1 From 65a35efab1e7a00d64aa32654df866364492c062 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 3 Mar 2020 08:24:03 -0500 Subject: [PATCH 067/113] Backport PR #16626: Updated Readme + Setup.py for PyPa Merge pull request #16626 from story645/readme DOC/BLD: Updated Readme + Setup.py for PyPa Conflicts: README.rst - implicitly backported several other changes to readme --- .github/CONTRIBUTING.md | 3 +- README.rst | 68 +++++++++++++++------------------ doc/_static/readme_preview.png | Bin 0 -> 68051 bytes setup.py | 19 +++++---- 4 files changed, 42 insertions(+), 48 deletions(-) create mode 100644 doc/_static/readme_preview.png diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index f5c602c0d7b8..c4198cdcdf14 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,2 +1 @@ -Please refer to the [Coding -Guidelines](http://matplotlib.org/devel/coding_guide.html). +Please refer to the [developers guide](https://matplotlib.org/devel/index.html). diff --git a/README.rst b/README.rst index 100bff13b02b..a4ff0e3e1914 100644 --- a/README.rst +++ b/README.rst @@ -25,76 +25,68 @@ .. |NUMFocus| image:: https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A .. _NUMFocus: http://www.numfocus.org + .. |GitTutorial| image:: https://img.shields.io/badge/PR-Welcome-%23FF8300.svg? .. _GitTutorial: https://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project -########## -Matplotlib -########## +.. image:: doc/_static/logo2.png -Matplotlib is a Python 2D plotting library which produces publication-quality -figures in a variety of hardcopy formats and interactive environments across -platforms. Matplotlib can be used in Python scripts, the Python and IPython -shell (à la MATLAB or Mathematica), web application servers, and various -graphical user interface toolkits. -NOTE: The current master branch is now Python 3 only. Python 2 support is -being dropped. +Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python. + +Check out our `home page `_ for more information. + +.. image:: doc/_static/readme_preview.png + +Matplotlib produces publication-quality figures in a variety of hardcopy formats +and interactive environments across platforms. Matplotlib can be used in Python scripts, +the Python and IPython shell, web application servers, and various +graphical user interface toolkits. -`Home page `_ Install ======= -For installation instructions and requirements, see the INSTALL.rst file or the -`install `_ documentation. If you -think you may want to contribute to matplotlib, check out the `guide to -working with the source code -`_. +For installation instructions and requirements, see `INSTALL.rst `_ or the +`install `_ documentation. Test ==== -After installation, you can launch the test suite:: +After installation, launch the test suite:: + + python -m pytest - pytest +Read the `testing guide `_ for more information and alternatives. -Or from the Python interpreter:: +Contribute +========== +You've discovered a bug or something else you want to change - excellent! - import matplotlib - matplotlib.test() +You've worked out a way to fix it – even better! -Consider reading http://matplotlib.org/devel/coding_guide.html#testing for more -information. Note that the test suite requires pytest. Please install with pip -or your package manager of choice. +You want to tell us about it – best of all! + +Start at the `contributing guide `_! Contact ======= -matplotlib's communication channels include active mailing lists: + +`Discourse `_ is the discussion forum for general questions and discussions and our recommended starting point. + +Our active mailing lists (which are mirrored on Discourse) are: * `Users `_ mailing list: matplotlib-users@python.org * `Announcement `_ mailing list: matplotlib-announce@python.org * `Development `_ mailing list: matplotlib-devel@python.org -The first is a good starting point for general questions and discussions. - Gitter_ is for coordinating development and asking questions directly related to contributing to matplotlib. -Contribute -========== -You've discovered a bug or something else you want to change - excellent! - -You've worked out a way to fix it – even better! - -You want to tell us about it – best of all! - -Start at the `contributing guide `_! - -Developer notes are now at `Developer Discussions `_ (Note: For technical reasons, this is currently only accessible for matplotlib developers.) Citing Matplotlib ================= If Matplotlib contributes to a project that leads to publication, please acknowledge this by citing Matplotlib. + `A ready-made citation entry `_ is available. diff --git a/doc/_static/readme_preview.png b/doc/_static/readme_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e6b78335083b61bc01b616d687a8de3dd4342c GIT binary patch literal 68051 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μ0-;9Lr(u@^K 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 Date: Sat, 29 Feb 2020 20:39:52 -0500 Subject: [PATCH 068/113] DOC: update github stats --- doc/users/github_stats.rst | 74 +++++++++++++++++++++++++++++++++----- 1 file changed, 65 insertions(+), 9 deletions(-) diff --git a/doc/users/github_stats.rst b/doc/users/github_stats.rst index c46190c7432f..d538ba605eb8 100644 --- a/doc/users/github_stats.rst +++ b/doc/users/github_stats.rst @@ -3,14 +3,14 @@ GitHub Stats ============ -GitHub stats for 2019/05/18 - 2020/02/01 (tag: v3.1.0) +GitHub stats for 2019/05/18 - 2020/03/03 (tag: v3.1.0) These lists are automatically generated, and may be incomplete or contain duplicates. -We closed 116 issues and merged 795 pull requests. +We closed 125 issues and merged 839 pull requests. The full list can be seen `on GitHub `__ -The following 161 authors contributed 3352 commits. +The following 164 authors contributed 3455 commits. * Abhinav Sagar * Abhinuv Nitin Pitale @@ -48,6 +48,7 @@ The following 161 authors contributed 3352 commits. * Deng Tian * depano.carlos@gmail.com * djdt +* donchanee * Dora Fraeman Caswell * Elan Ernest * Elliott Sales de Andrade @@ -95,6 +96,7 @@ The following 161 authors contributed 3352 commits. * luftek * Maciej Dems * Maik Riechert +* Marat K * Mark Wolf * Mark Wolfman * Matte @@ -102,6 +104,7 @@ The following 161 authors contributed 3352 commits. * Matthias Geier * MatthieuDartiailh * Max Chen +* Max Humber * Max Shinn * MeeseeksMachine * Michael Droettboom @@ -176,14 +179,55 @@ The following 161 authors contributed 3352 commits. GitHub issues and pull requests: -Pull Requests (795): +Pull Requests (839): +* :ghpull:`16626`: Updated Readme + Setup.py for PyPa +* :ghpull:`16627`: ci: Restore nuget install step on Azure for v3.2.x. +* :ghpull:`16625`: v3.2.x: Make Azure use local FreeType. +* :ghpull:`16622`: Backport PR #16613 on branch v3.2.x (Fix edge-case in preprocess_data, if label_namer is optional and unset.) +* :ghpull:`16613`: Fix edge-case in preprocess_data, if label_namer is optional and unset. +* :ghpull:`16612`: Backport PR #16605: CI: tweak the vm images we use on azure +* :ghpull:`16611`: Backport PR #16585 on branch v3.2.x (Fix _preprocess_data for Py3.9.) +* :ghpull:`16605`: CI: tweak the vm images we use on azure +* :ghpull:`16585`: Fix _preprocess_data for Py3.9. +* :ghpull:`16541`: Merge pull request #16404 from jklymak/fix-add-base-symlognorm +* :ghpull:`16542`: Backport PR #16006: Ignore pos in StrCategoryFormatter.__call__ to di… +* :ghpull:`16543`: Backport PR #16532: Document default value of save_count parameter in… +* :ghpull:`16532`: Document default value of save_count parameter in FuncAnimation +* :ghpull:`16526`: Backport PR #16480 on v.3.2.x: Re-phrase doc for bottom kwarg to hist +* :ghpull:`16404`: FIX: add base kwarg to symlognor +* :ghpull:`16518`: Backport PR #16502 on branch v3.2.x (Document theta getters/setters) +* :ghpull:`16519`: Backport PR #16513 on branch v3.2.x (Add more FreeType tarball hashes.) +* :ghpull:`16513`: Add more FreeType tarball hashes. +* :ghpull:`16502`: Document theta getters/setters +* :ghpull:`16506`: Backport PR #16505 on branch v3.2.x (Add link to blog to front page) +* :ghpull:`16505`: Add link to blog to front page +* :ghpull:`16480`: Re-phrase doc for bottom kwarg to hist +* :ghpull:`16494`: Backport PR #16490 on branch v3.2.x (Fix some typos on the front page) +* :ghpull:`16489`: Backport PR #16272 on branch v3.2.x (Move mplot3d autoregistration api changes to 3.2.) +* :ghpull:`16490`: Fix some typos on the front page +* :ghpull:`16465`: Backport PR #16450 on branch v3.2.x (Fix interaction between sticky_edges and shared axes.) +* :ghpull:`16466`: Backport PR #16392: FIX colorbars for Norms that do not have a scale. +* :ghpull:`16392`: FIX colorbars for Norms that do not have a scale. +* :ghpull:`16450`: Fix interaction between sticky_edges and shared axes. +* :ghpull:`16453`: Backport PR #16452 on branch v3.2.x (Don't make InvertedLogTransform inherit from deprecated base class.) +* :ghpull:`16452`: Don't make InvertedLogTransform inherit from deprecated base class. +* :ghpull:`16436`: Backport PR #16435 on branch v3.2.x (Reword intro to colors api docs.) +* :ghpull:`16435`: Reword intro to colors api docs. +* :ghpull:`16399`: Backport PR #16396 on branch v3.2.x (font_manager docs cleanup.) +* :ghpull:`16396`: font_manager docs cleanup. +* :ghpull:`16397`: Backport PR #16394 on branch v3.2.x (Mark inkscape 1.0 as unsupported (at least for now).) +* :ghpull:`16394`: Mark inkscape 1.0 as unsupported (at least for now). +* :ghpull:`16286`: Fix cbars for different norms +* :ghpull:`16385`: Backport PR #16226 on branch v3.2.x: Reorganize intro section on main page +* :ghpull:`16383`: Backport PR #16379 on branch v3.2.x (FIX: catch on message content, not module) * :ghpull:`16226`: Reorganize intro section on main page * :ghpull:`16364`: Backport PR #16344 on branch v3.2.x (Cast vmin/vmax to floats before nonsingular-expanding them.) * :ghpull:`16344`: Cast vmin/vmax to floats before nonsingular-expanding them. * :ghpull:`16360`: Backport PR #16347 on branch v3.2.x (FIX: catch warnings from pandas in cbook._check_1d) * :ghpull:`16357`: Backport PR #16330 on branch v3.2.x (Clearer signal handling) * :ghpull:`16349`: Backport PR #16255 on branch v3.2.x (Move version info to sidebar) +* :ghpull:`16346`: Backport PR #16298 on branch v3.2.x (Don't recursively call draw_idle when updating artists at draw time.) * :ghpull:`16331`: Backport PR #16308 on branch v3.2.x (CI: Use Ubuntu Bionic compatible package names) * :ghpull:`16332`: Backport PR #16308 on v3.2.x: CI: Use Ubuntu Bionic compatible package names * :ghpull:`16324`: Backport PR #16323 on branch v3.2.x (Add sphinx doc for Axis.axis_name.) @@ -195,9 +239,9 @@ Pull Requests (795): * :ghpull:`16305`: Backport PR #16250 on branch v3.2.x (Fix zerolen intersect) * :ghpull:`16300`: Don't default to negative radii in polar plot. * :ghpull:`16278`: Backport PR #16273 on branch v3.2.x (DOC: Changing the spelling of co-ordinates.) -* :ghpull:`16277`: Prefer using MouseButton to numeric values in docs and defaults. -* :ghpull:`16248`: Update matplotlib.__doc__. * :ghpull:`16260`: Backport PR #16259 on branch v3.2.x (TST: something changed in pytest 5.3.3 that breaks our qt fixtures) +* :ghpull:`16259`: TST: something changed in pytest 5.3.3 that breaks our qt fixtures +* :ghpull:`16238`: Backport PR #16235 on branch v3.2.x (FIX: AttributeError in TimerBase.start) * :ghpull:`16211`: DOC: ValidateInterval was deprecated in 3.2, not 3.1 * :ghpull:`16224`: Backport PR #16223 on branch v3.2.x (Added DNA Features Viewer description + screenshot in docs/thirdparty/) * :ghpull:`16223`: Added DNA Features Viewer description + screenshot in docs/thirdparty/ @@ -205,6 +249,8 @@ Pull Requests (795): * :ghpull:`16212`: Fix deprecation from #13544 * :ghpull:`16207`: Backport PR #16189 on branch v3.2.x (MNT: set default canvas when un-pickling) * :ghpull:`16189`: MNT: set default canvas when un-pickling +* :ghpull:`16179`: Backport PR #16175: FIX: ignore axes that aren't visible +* :ghpull:`16175`: FIX: ignore axes that aren't visible * :ghpull:`16168`: Backport PR #16166 on branch v3.2.x (Add badge for citing 3.1.2) * :ghpull:`16148`: Backport PR #16128 on branch v3.2.x (CI: Do not use nbformat 5.0.0/5.0.1 for testing) * :ghpull:`16145`: Backport PR #16053 on branch v3.2.x (Fix v_interval setter) @@ -283,7 +329,7 @@ Pull Requests (795): * :ghpull:`15513`: Separate plots using #### in make_room_for_ylabel_using_axesgrid.py * :ghpull:`15807`: Backport PR #15791 on branch v3.2.x (Cleanup backend_bases docstrings.) * :ghpull:`15791`: Cleanup backend_bases docstrings. -* :ghpull:`15803`: Backport PR #15795 on branch v3.2.x (Remove incorrect statement re: colorbars in image tutorial.) +* :ghpull:`15803`: Backport PR #15795 on branch v3.2.x (Remove incorrect statement re2: colorbars in image tutorial.) * :ghpull:`15795`: Remove incorrect statement re: colorbars in image tutorial. * :ghpull:`15794`: Backport PR #15793 on branch v3.2.x (fix a couple typos in tutorials) * :ghpull:`15793`: fix a couple typos in tutorials @@ -438,6 +484,7 @@ Pull Requests (795): * :ghpull:`13544`: Improve handling of subplots spanning multiple gridspec cells. * :ghpull:`15194`: Trivial style fixes. * :ghpull:`15202`: Deprecate the renderer parameter to Figure.tight_layout. +* :ghpull:`15195`: Fix integers being passed as length to quiver3d. * :ghpull:`15180`: Add some more internal links to 3.2.0 what's new * :ghpull:`13510`: Change Locator MAXTICKS checking to emitting a log at WARNING level. * :ghpull:`15184`: Mark missing_references extension as parallel read safe @@ -512,7 +559,7 @@ Pull Requests (795): * :ghpull:`15067`: Fix cross-references in API changes < 1.0 * :ghpull:`15061`: Fix cross-references in tutorials and FAQ * :ghpull:`15060`: Fix cross-references in examples. -* :ghpull:`14957`: Documentation for using ConnectionPatch across Axes with constrained +* :ghpull:`14957`: Documentation for using ConnectionPatch across Axes with constrained… * :ghpull:`15053`: Make citation bit of README less wordy * :ghpull:`15044`: numpydoc set_size_inches docstring * :ghpull:`15050`: Clarify unnecessary special handling for colons in paths. @@ -974,9 +1021,17 @@ Pull Requests (795): * :ghpull:`13527`: Make SubplotSpec.num2 never None. * :ghpull:`12249`: Replaced noqa-comments by using Axes3D.name instead of '3d' for proje… -Issues (116): +Issues (125): +* :ghissue:`16487`: Add link to blog to front page +* :ghissue:`16478`: The bottom parameter of plt.hist() shifts the data as well, not just the baseline +* :ghissue:`16280`: SymLogNorm colorbar incorrect on master +* :ghissue:`16448`: Bad interaction between shared axes and pcolormesh sticky edges +* :ghissue:`16451`: InvertedLogTransform inherits from deprecated base +* :ghissue:`16420`: Error when adding colorbar to pcolormesh of a boolean array +* :ghissue:`16114`: Prose error on website (first paragraph) * :ghissue:`8291`: Unable to pickle.load(fig) with mpl in jupyter notebook +* :ghissue:`16173`: Constrained_layout creates extra axes when used with subgridspec * :ghissue:`16127`: nbformat 5.0.0 missing schema files * :ghissue:`15849`: Using pandas.Timestamp in blended coordinate system of ax.annotate. * :ghissue:`6015`: scatterplot axis autoscale fails for small data values @@ -984,6 +1039,7 @@ Issues (116): * :ghissue:`15852`: Lasso selector does not show in Jupyter notebook * :ghissue:`15820`: Show incomplete tick labels when using mixed chinese and english characters * :ghissue:`15770`: DOCS 2D Line label option ``_nolegend_`` is not documented +* :ghissue:`15332`: Type promotion error with datetime bins in hist * :ghissue:`15611`: BUG: Qt5Agg window size regression * :ghissue:`7130`: Incorrect autoscaling of polar plot limits after scatter * :ghissue:`15576`: Multi-line ticks cause cut-offs From c0db129993cb65c1c2b2f4a9b74bd5f1d833fabd Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 3 Mar 2020 08:40:03 -0500 Subject: [PATCH 069/113] BLD: update trove classifier for py38 --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index a5539b72fd26..0a043672a3cd 100644 --- a/setup.py +++ b/setup.py @@ -83,6 +83,7 @@ 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', 'Topic :: Scientific/Engineering :: Visualization', ] From 622c17f0b1b8bcffbcb0b242e9666bc051f85b99 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 3 Mar 2020 09:15:12 -0500 Subject: [PATCH 070/113] DOC: fix spelling of rcparam in API changes --- doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst b/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst index b98efee8e6b6..82ad95a07eb1 100644 --- a/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst +++ b/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst @@ -218,11 +218,11 @@ resampling the data in A for display (or saving to file) *if* the upsample rate is less than a factor of three, and not an integer; downsampled data is always smoothed at resampling. -To get the old behavior, set :rc:`interpolation` to the old default "nearest" +To get the old behavior, set :rc:`image.interpolation` to the old default "nearest" (or specify the ``interpolation`` kwarg of `.Axes.imshow`) To always get the anti-aliasing behavior, no matter what the up/down sample -rate, set :rc:`interpolation` to "hanning" (or one of the other filters +rate, set :rc:`image.interpolation` to "hanning" (or one of the other filters available). Note that the "hanning" filter was chosen because it has only a modest From eff204d7b12fd30c7c373ec28ccddafd34fdeff1 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 3 Mar 2020 09:21:50 -0500 Subject: [PATCH 071/113] REL: v3.2.0 Highlights of this release include: - default image interpolation is now `'antialiased'` to better handle down-sampling and reduce artifacts when up-sampling by small ratios. - change when ticks switch to using an offset to improve readability - improvements to auto-scaling and auto-limits - `DivergingNorm` has been renamed to `TwoSlopeNorm` - support for 3 and 4 digit hex colors (`#123` maps to `#112233`) - improvements to Logit scale ticker and formatter - control of where errorbars start getting placed with `errorevery` - correct kerning when laying out text - improvements to MovieRegistry For the full details please see the whats new [1] and API changes [2] in the documentation [1] https://matplotlib.org/3.2.0/users/whats_new.html [2] https://matplotlib.org/3.2.0/api/api_changes.html From 11892dd9df6b78260f8c5a047ad69a1510973659 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 3 Mar 2020 09:28:27 -0500 Subject: [PATCH 072/113] BLD: bump branch away from tag So the tarballs from github are stable From 2e95f54a1c9a46c0fc1bc35e27bd0150540ed262 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Tue, 3 Mar 2020 18:48:06 +0100 Subject: [PATCH 073/113] Backport PR #16649: Fix typo in docs --- lib/matplotlib/patches.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 8223d15f4c8c..42affae91949 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -4317,7 +4317,7 @@ def __init__(self, xyA, xyB, coordsA, coordsB=None, 'figure fraction' 0, 0 is lower left of figure and 1, 1 is upper right 'axes points' points from lower left corner of axes 'axes pixels' pixels from lower left corner of axes - 'axes fraction' 0, 1 is lower left of axes and 1, 1 is upper right + 'axes fraction' 0, 0 is lower left of axes and 1, 1 is upper right 'data' use the coordinate system of the object being annotated (default) 'offset points' offset (in points) from the *xy* value From ac8344b3eb7c8276050825b41e735158a3d3af25 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Tue, 3 Mar 2020 16:22:33 -0500 Subject: [PATCH 074/113] Backport PR #16651: Docs: Change Python 2 note to past tense --- doc/_templates/sidebar_announcement.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/_templates/sidebar_announcement.html b/doc/_templates/sidebar_announcement.html index 57a0f225a3b6..f8fa4d8a5efb 100644 --- a/doc/_templates/sidebar_announcement.html +++ b/doc/_templates/sidebar_announcement.html @@ -1,5 +1,5 @@ From a171751ba5c0e9ca789a593834d807d0eda10a25 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Wed, 4 Mar 2020 13:47:34 -0800 Subject: [PATCH 075/113] Backport PR #16661: added Framework :: Matplotlib to setup --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 0a043672a3cd..e508cc42238d 100644 --- a/setup.py +++ b/setup.py @@ -76,6 +76,7 @@ classifiers = [ 'Development Status :: 5 - Production/Stable', + 'Framework :: Matplotlib', 'Intended Audience :: Science/Research', 'Intended Audience :: Education', 'License :: OSI Approved :: Python Software Foundation License', From 7b65f39008e9a894e7dad957aebe15f826290297 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Fri, 6 Mar 2020 00:13:02 +0100 Subject: [PATCH 076/113] Backport PR #16682: Avoid floating point rounding causing bezier.get_parallels to fail --- lib/matplotlib/bezier.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/matplotlib/bezier.py b/lib/matplotlib/bezier.py index 44c74c458982..d3e74afb4881 100644 --- a/lib/matplotlib/bezier.py +++ b/lib/matplotlib/bezier.py @@ -429,23 +429,23 @@ def get_parallels(bezier2, width): # find cm_left which is the intersecting point of a line through # c1_left with angle t1 and a line through c2_left with angle # t2. Same with cm_right. - if parallel_test != 0: - # a special case for a straight line, i.e., angle between two - # lines are smaller than some (arbitrary) value. - cmx_left, cmy_left = ( - 0.5 * (c1x_left + c2x_left), 0.5 * (c1y_left + c2y_left) - ) - cmx_right, cmy_right = ( - 0.5 * (c1x_right + c2x_right), 0.5 * (c1y_right + c2y_right) - ) - else: + try: cmx_left, cmy_left = get_intersection(c1x_left, c1y_left, cos_t1, sin_t1, c2x_left, c2y_left, cos_t2, sin_t2) - cmx_right, cmy_right = get_intersection(c1x_right, c1y_right, cos_t1, sin_t1, c2x_right, c2y_right, cos_t2, sin_t2) + except ValueError: + # Special case straight lines, i.e., angle between two lines is + # less than the threshold used by get_intersection (we don't use + # check_if_parallel as the threshold is not the same). + cmx_left, cmy_left = ( + 0.5 * (c1x_left + c2x_left), 0.5 * (c1y_left + c2y_left) + ) + cmx_right, cmy_right = ( + 0.5 * (c1x_right + c2x_right), 0.5 * (c1y_right + c2y_right) + ) # the parallel Bezier lines are created with control points of # [c1_left, cm_left, c2_left] and [c1_right, cm_right, c2_right] From 45472039bfb90b10a24287defe568e4e0494262f Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 7 Mar 2020 01:02:39 -0500 Subject: [PATCH 077/113] Backport PR #16656: Make test_imagegrid_cbar_mode_edge less flaky. --- lib/mpl_toolkits/tests/test_axes_grid.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/mpl_toolkits/tests/test_axes_grid.py b/lib/mpl_toolkits/tests/test_axes_grid.py index 58358b686651..0ff4f2b013b6 100644 --- a/lib/mpl_toolkits/tests/test_axes_grid.py +++ b/lib/mpl_toolkits/tests/test_axes_grid.py @@ -12,10 +12,16 @@ # The original version of this test relied on mpl_toolkits's slightly different # colorbar implementation; moving to matplotlib's own colorbar implementation # caused the small image comparison error. -@pytest.mark.parametrize("legacy_colorbar", [False, True]) -@image_comparison(['imagegrid_cbar_mode.png'], +@image_comparison(['imagegrid_cbar_mode.png', 'imagegrid_cbar_mode.png'], remove_text=True, style='mpl20', tol=0.3) -def test_imagegrid_cbar_mode_edge(legacy_colorbar): +def test_imagegrid_cbar_mode_edge(): + # Note, we don't use @pytest.mark.parametrize, because in parallel this + # might cause one process result to overwrite another's. + for legacy_colorbar in [False, True]: + _test_imagegrid_cbar_mode_edge(legacy_colorbar) + + +def _test_imagegrid_cbar_mode_edge(legacy_colorbar): mpl.rcParams["mpl_toolkits.legacy_colorbar"] = legacy_colorbar X, Y = np.meshgrid(np.linspace(0, 6, 30), np.linspace(0, 6, 30)) From 70b32cd7932df63b9c598be4ee52802d571135c4 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Wed, 18 Dec 2019 00:20:19 +0100 Subject: [PATCH 078/113] Restart pgf's latex instance after bad latex inputs. ... and also move the warning about pgf-to-stream not supporting raster images to when actually outputting a raster image (otherwise the warning is spurious, and affects e.g. test_tex_restart_after_error). --- lib/matplotlib/backends/backend_pgf.py | 19 ++++++++++++------- lib/matplotlib/tests/test_backend_pgf.py | 13 +++++++++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index 178465d48ad7..6c8e7e06c8b3 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -252,6 +252,8 @@ def _cleanup_remaining_instances(): latex_manager._cleanup() def _stdin_writeln(self, s): + if self.latex is None: + self._setup_latex_process() self.latex_stdin_utf8.write(s) self.latex_stdin_utf8.write("\n") self.latex_stdin_utf8.flush() @@ -265,6 +267,8 @@ def _expect(self, s): if buf[-len(exp):] == exp: break if not len(b): + self.latex.kill() + self.latex = None raise LatexError("LaTeX process halted", buf.decode("utf8")) return buf.decode("utf8") @@ -301,6 +305,10 @@ def __init__(self): raise LatexError("LaTeX returned an error, probably missing font " "or error in preamble:\n%s" % stdout) + self.latex = None # Will be set up on first use. + self.str_cache = {} # cache for strings already processed + + def _setup_latex_process(self): # open LaTeX process for real work latex = subprocess.Popen([self.texcommand, "-halt-on-error"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, @@ -313,9 +321,6 @@ def __init__(self): self._expect("*pgf_backend_query_start") self._expect_prompt() - # cache for strings already processed - self.str_cache = {} - def _cleanup(self): if not self._os_path.isdir(self.tmpdir): return @@ -427,10 +432,10 @@ def __init__(self, figure, fh, dummy=False): else: # if fh does not belong to a filename, deactivate draw_image if not hasattr(fh, 'name') or not os.path.exists(fh.name): - cbook._warn_external("streamed pgf-code does not support " - "raster graphics, consider using the " - "pgf-to-pdf option", UserWarning) - self.__dict__["draw_image"] = lambda *args, **kwargs: None + self.__dict__["draw_image"] = \ + lambda *args, **kwargs: cbook._warn_external( + "streamed pgf-code does not support raster graphics, " + "consider using the pgf-to-pdf option") @cbook.deprecated("3.2") @property diff --git a/lib/matplotlib/tests/test_backend_pgf.py b/lib/matplotlib/tests/test_backend_pgf.py index 2b5b2060dc9a..269606c7feca 100644 --- a/lib/matplotlib/tests/test_backend_pgf.py +++ b/lib/matplotlib/tests/test_backend_pgf.py @@ -1,3 +1,4 @@ +from io import BytesIO import os from pathlib import Path import shutil @@ -269,3 +270,15 @@ def test_pdf_pages_lualatex(): pdf.savefig(fig) assert pdf.get_pagecount() == 2 + + +@needs_xelatex +def test_tex_restart_after_error(): + fig = plt.figure() + fig.suptitle(r"\oops") + with pytest.raises(ValueError): + fig.savefig(BytesIO(), format="pgf") + + fig = plt.figure() # start from scratch + fig.suptitle(r"this is ok") + fig.savefig(BytesIO(), format="pgf") From 566a7af54b1c6f29f4e2540f8a7cb23340b95902 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sun, 8 Mar 2020 00:51:45 -0500 Subject: [PATCH 079/113] Fix saving PNGs to file objects in some places. --- lib/matplotlib/image.py | 2 +- lib/matplotlib/mathtext.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 4fa365a696dd..734573595bc9 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -666,7 +666,7 @@ def write_png(self, fname): from matplotlib import _png im = self.to_rgba(self._A[::-1] if self.origin == 'lower' else self._A, bytes=True, norm=True) - with open(fname, "wb") as file: + with cbook.open_file_cm(fname, "wb") as file: _png.write_png(im, file) def set_data(self, A): diff --git a/lib/matplotlib/mathtext.py b/lib/matplotlib/mathtext.py index 3c1ba5750cf4..b875516cf440 100644 --- a/lib/matplotlib/mathtext.py +++ b/lib/matplotlib/mathtext.py @@ -3433,7 +3433,7 @@ def to_png(self, filename, texstr, color='black', dpi=120, fontsize=14): from matplotlib import _png rgba, depth = self.to_rgba( texstr, color=color, dpi=dpi, fontsize=fontsize) - with open(filename, "wb") as file: + with cbook.open_file_cm(filename, "wb") as file: _png.write_png(rgba, file) return depth From 5484892c495c63ff41e23ae33c5e772c9e9691b9 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sun, 8 Mar 2020 01:06:07 -0500 Subject: [PATCH 080/113] Add smoke test that saving MathText to PNG works. --- lib/matplotlib/tests/test_mathtext.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/matplotlib/tests/test_mathtext.py b/lib/matplotlib/tests/test_mathtext.py index fdf930184070..508e29fa0880 100644 --- a/lib/matplotlib/tests/test_mathtext.py +++ b/lib/matplotlib/tests/test_mathtext.py @@ -280,3 +280,14 @@ def test_single_minus_sign(): def test_spaces(fig_test, fig_ref): fig_test.subplots().set_title(r"$1\,2\>3\ 4$") fig_ref.subplots().set_title(r"$1\/2\:3~4$") + + +def test_math_to_image(tmpdir): + mathtext.math_to_image('$x^2$', str(tmpdir.join('example.png'))) + mathtext.math_to_image('$x^2$', io.BytesIO()) + + +def test_mathtext_to_png(tmpdir): + mt = mathtext.MathTextParser('bitmap') + mt.to_png(str(tmpdir.join('example.png')), '$x^2$') + mt.to_png(io.BytesIO(), '$x^2$') From 9b2293484f5897aef294030bc7887887b512f9d0 Mon Sep 17 00:00:00 2001 From: hannah Date: Mon, 9 Mar 2020 17:02:08 -0400 Subject: [PATCH 081/113] Backport PR #16671: Fix some readme bits --- README.rst | 13 ++++++------- setup.py | 6 +++--- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/README.rst b/README.rst index a4ff0e3e1914..186951c0baf0 100644 --- a/README.rst +++ b/README.rst @@ -23,20 +23,19 @@ .. _Gitter: https://gitter.im/matplotlib/matplotlib .. |NUMFocus| image:: https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A -.. _NUMFocus: http://www.numfocus.org - +.. _NUMFocus: https://www.numfocus.org .. |GitTutorial| image:: https://img.shields.io/badge/PR-Welcome-%23FF8300.svg? .. _GitTutorial: https://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project -.. image:: doc/_static/logo2.png +.. image:: https://matplotlib.org/_static/logo2.svg Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python. -Check out our `home page `_ for more information. +Check out our `home page `_ for more information. -.. image:: doc/_static/readme_preview.png +.. image:: https://matplotlib.org/_static/readme_preview.png Matplotlib produces publication-quality figures in a variety of hardcopy formats and interactive environments across platforms. Matplotlib can be used in Python scripts, @@ -48,7 +47,7 @@ Install ======= For installation instructions and requirements, see `INSTALL.rst `_ or the -`install `_ documentation. +`install `_ documentation. Test ==== @@ -67,7 +66,7 @@ You've worked out a way to fix it – even better! You want to tell us about it – best of all! -Start at the `contributing guide `_! +Start at the `contributing guide `_! Contact ======= diff --git a/setup.py b/setup.py index e508cc42238d..87b93a970b3a 100644 --- a/setup.py +++ b/setup.py @@ -225,9 +225,9 @@ def run(self): with open('lib/matplotlib/mpl-data/matplotlibrc', 'w') as fd: fd.write(''.join(template_lines)) - # Use Readme as long description - with open('README.rst') as fd: - long_description = fd.read() + # Use Readme as long description + with open('README.rst', encoding='utf-8') as fd: + long_description = fd.read() # Finally, pass this all along to distutils to do the heavy lifting. setup( From 26ab43ed3a807e97708cddeb350930f7092a05e0 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Sun, 8 Dec 2019 16:46:40 +0100 Subject: [PATCH 082/113] Deprecate rcParams["datapath"] in favor of mpl.get_data_path(). The rcParam cannot be meaningfully set by the end user from their matplotlibrc or Python code. (This is a manual backport to 3.2.x.) --- doc/api/matplotlib_configuration_api.rst | 2 ++ .../api_changes_3.2.0/deprecations.rst | 5 +++++ lib/matplotlib/__init__.py | 20 +++++++++---------- lib/matplotlib/cbook/__init__.py | 2 +- matplotlibrc.template | 4 ---- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/doc/api/matplotlib_configuration_api.rst b/doc/api/matplotlib_configuration_api.rst index e497d80b7c12..f786824b4c3c 100644 --- a/doc/api/matplotlib_configuration_api.rst +++ b/doc/api/matplotlib_configuration_api.rst @@ -43,6 +43,8 @@ Default values and styling .. autofunction:: matplotlib_fname +.. autofunction:: get_data_path + Logging ======= diff --git a/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst b/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst index c61c9cca3b03..0af02a5265e6 100644 --- a/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst +++ b/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst @@ -290,3 +290,8 @@ from the public API in future versions. ``style.core.is_style_file`` and ``style.core.iter_style_files`` are deprecated. + +The ``datapath`` rcParam +~~~~~~~~~~~~~~~~~~~~~~~~ +Use `.get_data_path` instead. (The rcParam is deprecated because it cannot be +meaningfully set by an end user.) This was deprecated only in 3.2.1. diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index c4dba5f29613..021331370981 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -619,8 +619,9 @@ def get_cachedir(): return _get_config_or_cache_dir(_get_xdg_cache_dir()) -def _get_data_path(): - """Return the path to matplotlib data.""" +@_logged_cached('matplotlib data path: %s') +def get_data_path(): + """Return the path to Matplotlib data.""" if 'MATPLOTLIBDATA' in os.environ: path = os.environ['MATPLOTLIBDATA'] @@ -633,6 +634,7 @@ def _get_data_path(): path = Path(__file__).with_name("mpl-data") if path.is_dir(): + defaultParams['datapath'][0] = str(path) return str(path) cbook.warn_deprecated( @@ -655,18 +657,12 @@ def get_candidate_paths(): for path in get_candidate_paths(): if path.is_dir(): + defaultParams['datapath'][0] = str(path) return str(path) raise RuntimeError('Could not find the matplotlib data files') -@_logged_cached('matplotlib data path: %s') -def get_data_path(): - if defaultParams['datapath'][0] is None: - defaultParams['datapath'][0] = _get_data_path() - return defaultParams['datapath'][0] - - @cbook.deprecated("3.1") def get_py2exe_datafiles(): data_path = Path(get_data_path()) @@ -736,6 +732,7 @@ def gen_candidates(): 'savefig.frameon': ('3.1',), 'verbose.fileo': ('3.1',), 'verbose.level': ('3.1',), + 'datapath': ('3.2.1',), } @@ -973,8 +970,9 @@ def rc_params_from_file(fname, fail_on_error=False, use_default_template=True): if key not in _all_deprecated]) config.update(config_from_file) - if config['datapath'] is None: - config['datapath'] = get_data_path() + with cbook._suppress_matplotlib_deprecation_warning(): + if config['datapath'] is None: + config['datapath'] = get_data_path() if "".join(config['text.latex.preamble']): _log.info(""" diff --git a/lib/matplotlib/cbook/__init__.py b/lib/matplotlib/cbook/__init__.py index 1b222f971878..8338982df401 100644 --- a/lib/matplotlib/cbook/__init__.py +++ b/lib/matplotlib/cbook/__init__.py @@ -439,7 +439,7 @@ def get_sample_data(fname, asfileobj=True): If the filename ends in .gz, the file is implicitly ungzipped. """ - path = Path(matplotlib._get_data_path(), 'sample_data', fname) + path = Path(matplotlib.get_data_path(), 'sample_data', fname) if asfileobj: suffix = path.suffix.lower() if suffix == '.gz': diff --git a/matplotlibrc.template b/matplotlibrc.template index 17f12a673ebc..16d9becaae93 100644 --- a/matplotlibrc.template +++ b/matplotlibrc.template @@ -103,10 +103,6 @@ #toolbar : toolbar2 ## {None, toolbar2} #timezone : UTC ## a pytz timezone string, e.g., US/Central or Europe/Paris -## Where your matplotlib data lives if you installed to a non-default -## location. This is where the matplotlib fonts, bitmaps, etc reside -#datapath : /home/jdhunter/mpldata - ## *************************************************************************** ## * LINES * From f13974d514b7751509867614853d0a498a1bd494 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Thu, 12 Mar 2020 09:25:37 -0700 Subject: [PATCH 083/113] Backport PR #16742: nbagg: Don't send events if manager is disconnected. --- lib/matplotlib/backends/backend_webagg_core.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/backends/backend_webagg_core.py b/lib/matplotlib/backends/backend_webagg_core.py index c000e537e136..d71766aea6cb 100644 --- a/lib/matplotlib/backends/backend_webagg_core.py +++ b/lib/matplotlib/backends/backend_webagg_core.py @@ -343,7 +343,8 @@ def handle_set_dpi_ratio(self, event): self.draw_idle() def send_event(self, event_type, **kwargs): - self.manager._send_event(event_type, **kwargs) + if self.manager: + self.manager._send_event(event_type, **kwargs) _JQUERY_ICON_CLASSES = { From 16c12fba90290161f163b05efaf2fe90518c6d23 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Thu, 12 Mar 2020 17:41:23 -0400 Subject: [PATCH 084/113] ci: Disallow pytest 5.4.0, which is crashing. --- requirements/testing/travis_all.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/testing/travis_all.txt b/requirements/testing/travis_all.txt index 7bf8db0dccf8..060c19517c7b 100644 --- a/requirements/testing/travis_all.txt +++ b/requirements/testing/travis_all.txt @@ -5,7 +5,7 @@ cycler numpy pillow pyparsing -pytest!=4.6.0,!=5.3.3 +pytest!=4.6.0,!=5.3.3,!=5.4.0 pytest-cov pytest-rerunfailures pytest-timeout From f456138850a9e4c092cad46df7c0fb5586cf48d1 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Fri, 13 Mar 2020 15:44:39 -0400 Subject: [PATCH 085/113] Backport PR #16735: Make test_stem less flaky. --- lib/matplotlib/tests/test_axes.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 5edb4f24b44f..93548b2791ca 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -3227,10 +3227,15 @@ def test_hist_stacked_weighted(): ax.hist((d1, d2), weights=(w1, w2), histtype="stepfilled", stacked=True) -@pytest.mark.parametrize("use_line_collection", [True, False], - ids=['w/ line collection', 'w/o line collection']) -@image_comparison(['stem.png'], style='mpl20', remove_text=True) -def test_stem(use_line_collection): +@image_comparison(['stem.png', 'stem.png'], style='mpl20', remove_text=True) +def test_stem(): + # Note, we don't use @pytest.mark.parametrize, because in parallel this + # might cause one process result to overwrite another's. + for use_line_collection in [True, False]: + _test_stem(use_line_collection) + + +def _test_stem(use_line_collection): x = np.linspace(0.1, 2 * np.pi, 100) args = (x, np.cos(x)) # Label is a single space to force a legend to be drawn, but to avoid any From 7c13faebff06bc5e206c1d4bc30e21204aad93a8 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Fri, 13 Mar 2020 13:02:07 -0700 Subject: [PATCH 086/113] Backport PR #16745: Allow numbers to set uvc for all arrows in quiver.set_UVC, fixes #16743 --- lib/matplotlib/quiver.py | 2 +- lib/matplotlib/tests/test_quiver.py | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/quiver.py b/lib/matplotlib/quiver.py index 1d24072fc3ef..29dad2ad91fb 100644 --- a/lib/matplotlib/quiver.py +++ b/lib/matplotlib/quiver.py @@ -600,7 +600,7 @@ def set_UVC(self, U, V, C=None): if C is not None: C = ma.masked_invalid(C, copy=True).ravel() for name, var in zip(('U', 'V', 'C'), (U, V, C)): - if var is not None and var.size != self.N: + if not (var is None or var.size == self.N or var.size == 1): raise ValueError(f'Argument {name} has a size {var.size}' f' which does not match {self.N},' ' the number of arrow positions') diff --git a/lib/matplotlib/tests/test_quiver.py b/lib/matplotlib/tests/test_quiver.py index 68031bff2754..719c8fbc15b8 100644 --- a/lib/matplotlib/tests/test_quiver.py +++ b/lib/matplotlib/tests/test_quiver.py @@ -252,3 +252,15 @@ def test_quiverkey_angles(): # The arrows are only created when the key is drawn fig.canvas.draw() assert len(qk.verts) == 1 + + +def test_quiver_setuvc_numbers(): + """Check that it is possible to set all arrow UVC to the same numbers""" + + fig, ax = plt.subplots() + + X, Y = np.meshgrid(np.arange(2), np.arange(2)) + U = V = np.ones_like(X) + + q = ax.quiver(X, Y, U, V) + q.set_UVC(0, 1) From 6882b72b8a77f9825a89d107b32ad6e422cd61b2 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Fri, 13 Mar 2020 17:59:51 -0400 Subject: [PATCH 087/113] Backport PR #16648: Document filling of Poly3DCollection --- lib/mpl_toolkits/mplot3d/art3d.py | 34 +++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/art3d.py b/lib/mpl_toolkits/mplot3d/art3d.py index 8538b7d6f5da..42a8336b5b6b 100644 --- a/lib/mpl_toolkits/mplot3d/art3d.py +++ b/lib/mpl_toolkits/mplot3d/art3d.py @@ -580,17 +580,39 @@ def patch_collection_2d_to_3d(col, zs=0, zdir='z', depthshade=True): class Poly3DCollection(PolyCollection): """ A collection of 3D polygons. + + .. note:: + **Filling of 3D polygons** + + There is no simple definition of the enclosed surface of a 3D polygon + unless the polygon is planar. + + In practice, Matplotlib performs the filling on the 2D projection of + the polygon. This gives a correct filling appearance only for planar + polygons. For all other polygons, you'll find orientations in which + the edges of the polygon intersect in the projection. This will lead + to an incorrect visualization of the 3D area. + + If you need filled areas, it is recommended to create them via + `~mpl_toolkits.mplot3d.axes3d.Axes3D.plot_trisurf`, which creates a + triangulation and thus generates consistent surfaces. """ def __init__(self, verts, *args, zsort='average', **kwargs): """ - Create a Poly3DCollection. - - *verts* should contain 3D coordinates. - - Keyword arguments: - zsort, see set_zsort for options. + Parameters + ---------- + verts : list of array-like Nx3 + Each element describes a polygon as a sequnce of ``N_i`` points + ``(x, y, z)``. + zsort : {'average', 'min', 'max'}, default: 'average' + The calculation method for the z-order. + See `~.Poly3DCollection.set_zsort` for details. + *args, **kwargs + All other parameters are forwarded to `.PolyCollection`. + Notes + ----- Note that this class does a bit of magic with the _facecolors and _edgecolors properties. """ From 8ce2dc272989c08f8fb4e2ddf9fa806c49ec0743 Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Fri, 6 Mar 2020 10:29:54 +0100 Subject: [PATCH 088/113] Backport PR #16672: Update CircleCI and add direct artifact link --- .circleci/config.yml | 9 +-------- .github/workflows/circleci.yml | 12 ++++++++++++ 2 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/circleci.yml diff --git a/.circleci/config.yml b/.circleci/config.yml index 5b2fc3cdd761..888978675fff 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,7 +1,7 @@ # Circle CI configuration file # https://circleci.com/docs/ -version: 2 +version: 2.1 ########################################### @@ -115,10 +115,6 @@ jobs: - store_artifacts: path: doc/build/html - - run: - name: "Built documentation is available at:" - command: echo "${CIRCLE_BUILD_URL}/artifacts/${CIRCLE_NODE_INDEX}/${CIRCLE_WORKING_DIRECTORY/#\~/$HOME}/doc/build/html/index.html" - docs-python37: docker: - image: circleci/python:3.7 @@ -141,9 +137,6 @@ jobs: - store_artifacts: path: doc/build/html - - run: - name: "Built documentation is available at:" - command: echo "${CIRCLE_BUILD_URL}/artifacts/${CIRCLE_NODE_INDEX}/${CIRCLE_WORKING_DIRECTORY/#\~/$HOME}/doc/build/html/index.html" - add_ssh_keys: fingerprints: diff --git a/.github/workflows/circleci.yml b/.github/workflows/circleci.yml new file mode 100644 index 000000000000..4bee5580800f --- /dev/null +++ b/.github/workflows/circleci.yml @@ -0,0 +1,12 @@ +on: [status] +jobs: + circleci_artifacts_redirector_job: + runs-on: ubuntu-latest + name: Run CircleCI artifacts redirector + steps: + - name: GitHub Action step + uses: larsoner/circleci-artifacts-redirector-action@master + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + artifact-path: 0/doc/build/html/index.html + circleci-jobs: docs-python36,docs-python37 From 3e0fc53521af493fad03c6365e99bad3adff425a Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Fri, 13 Mar 2020 20:35:30 -0400 Subject: [PATCH 089/113] Backport PR #16736: xpdf: Set AutoRotatePages to None, not false. --- lib/matplotlib/backends/backend_ps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index 0eee04f07cf6..bcc015be516d 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -1321,7 +1321,7 @@ def xpdf_distill(tmpfile, eps=False, ptype='letter', bbox=None, rotated=False): ["ps2pdf", "-dAutoFilterColorImages#false", "-dAutoFilterGrayImages#false", - "-dAutoRotatePages#false", + "-sAutoRotatePages#None", "-sGrayImageFilter#FlateEncode", "-sColorImageFilter#FlateEncode", "-dEPSCrop" if eps else "-sPAPERSIZE#%s" % ptype, From a9b8b6e21d6ef1513bb977330892c847a7adc74c Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Fri, 13 Mar 2020 20:40:21 -0400 Subject: [PATCH 090/113] Backport PR #16734: Disable draw_foo methods on renderer used to estimate tight extents. --- lib/matplotlib/backend_bases.py | 20 ++++++++++++++++---- lib/matplotlib/tests/test_backend_pgf.py | 8 ++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 0c85673b2b10..09dc3d6e8c42 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -1516,10 +1516,15 @@ def __init__(self, name, canvas, key, x=0, y=0, guiEvent=None): self.key = key -def _get_renderer(figure, print_method): +def _get_renderer(figure, print_method, *, draw_disabled=False): """ Get the renderer that would be used to save a `~.Figure`, and cache it on the figure. + + If *draw_disabled* is True, additionally replace draw_foo methods on + *renderer* by no-ops. This is used by the tight-bbox-saving renderer, + which needs to walk through the artist tree to compute the tight-bbox, but + for which the output file may be closed early. """ # This is implemented by triggering a draw, then immediately jumping out of # Figure.draw() by raising an exception. @@ -1533,8 +1538,14 @@ def _draw(renderer): raise Done(renderer) try: print_method(io.BytesIO()) except Done as exc: - figure._cachedRenderer, = exc.args - return figure._cachedRenderer + renderer, = figure._cachedRenderer, = exc.args + + if draw_disabled: + for meth_name in dir(RendererBase): + if meth_name.startswith("draw_"): + setattr(renderer, meth_name, lambda *args, **kwargs: None) + + return renderer def _is_non_interactive_terminal_ipython(ip): @@ -2063,7 +2074,8 @@ def print_figure(self, filename, dpi=None, facecolor=None, edgecolor=None, renderer = _get_renderer( self.figure, functools.partial( - print_method, dpi=dpi, orientation=orientation)) + print_method, dpi=dpi, orientation=orientation), + draw_disabled=True) self.figure.draw(renderer) bbox_artists = kwargs.pop("bbox_extra_artists", None) bbox_inches = self.figure.get_tightbbox(renderer, diff --git a/lib/matplotlib/tests/test_backend_pgf.py b/lib/matplotlib/tests/test_backend_pgf.py index 269606c7feca..7843b4101041 100644 --- a/lib/matplotlib/tests/test_backend_pgf.py +++ b/lib/matplotlib/tests/test_backend_pgf.py @@ -282,3 +282,11 @@ def test_tex_restart_after_error(): fig = plt.figure() # start from scratch fig.suptitle(r"this is ok") fig.savefig(BytesIO(), format="pgf") + + +@needs_xelatex +def test_bbox_inches_tight(tmpdir): + fig, ax = plt.subplots() + ax.imshow([[0, 1], [2, 3]]) + fig.savefig(os.path.join(tmpdir, "test.pdf"), backend="pgf", + bbox_inches="tight") From 6975ba8186e8e27ee4e70a55889b89b50ff6d2d0 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Fri, 13 Mar 2020 20:58:02 -0400 Subject: [PATCH 091/113] Backport PR #15685: Avoid a RuntimeError at animation shutdown with PySide2. --- lib/matplotlib/backends/backend_qt5.py | 9 ++++++++- lib/matplotlib/backends/qt_compat.py | 14 ++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/backends/backend_qt5.py b/lib/matplotlib/backends/backend_qt5.py index b2bd2d564a39..f3dcf1c513a8 100644 --- a/lib/matplotlib/backends/backend_qt5.py +++ b/lib/matplotlib/backends/backend_qt5.py @@ -17,7 +17,8 @@ from matplotlib.backend_managers import ToolManager from .qt_compat import ( - QtCore, QtGui, QtWidgets, _getSaveFileName, is_pyqt5, __version__, QT_API) + QtCore, QtGui, QtWidgets, _isdeleted, _getSaveFileName, + is_pyqt5, __version__, QT_API) backend_version = __version__ @@ -200,6 +201,12 @@ def __init__(self, *args, **kwargs): self._timer.timeout.connect(self._on_timer) self._timer_set_interval() + def __del__(self): + # The check for deletedness is needed to avoid an error at animation + # shutdown with PySide2. + if not _isdeleted(self._timer): + self._timer_stop() + def _timer_set_single_shot(self): self._timer.setSingleShot(self._single) diff --git a/lib/matplotlib/backends/qt_compat.py b/lib/matplotlib/backends/qt_compat.py index 6b52284fe7f4..b3367ea91010 100644 --- a/lib/matplotlib/backends/qt_compat.py +++ b/lib/matplotlib/backends/qt_compat.py @@ -63,16 +63,21 @@ def _setup_pyqt5(): - global QtCore, QtGui, QtWidgets, __version__, is_pyqt5, _getSaveFileName + global QtCore, QtGui, QtWidgets, __version__, is_pyqt5, \ + _isdeleted, _getSaveFileName if QT_API == QT_API_PYQT5: from PyQt5 import QtCore, QtGui, QtWidgets + import sip __version__ = QtCore.PYQT_VERSION_STR QtCore.Signal = QtCore.pyqtSignal QtCore.Slot = QtCore.pyqtSlot QtCore.Property = QtCore.pyqtProperty + _isdeleted = sip.isdeleted elif QT_API == QT_API_PYSIDE2: from PySide2 import QtCore, QtGui, QtWidgets, __version__ + import shiboken2 + def _isdeleted(obj): return not shiboken2.isValid(obj) else: raise ValueError("Unexpected value for the 'backend.qt5' rcparam") _getSaveFileName = QtWidgets.QFileDialog.getSaveFileName @@ -82,7 +87,8 @@ def is_pyqt5(): def _setup_pyqt4(): - global QtCore, QtGui, QtWidgets, __version__, is_pyqt5, _getSaveFileName + global QtCore, QtGui, QtWidgets, __version__, is_pyqt5, \ + _isdeleted, _getSaveFileName def _setup_pyqt4_internal(api): global QtCore, QtGui, QtWidgets, \ @@ -102,6 +108,7 @@ def _setup_pyqt4_internal(api): except ValueError: pass from PyQt4 import QtCore, QtGui + import sip # Always succeeds *after* importing PyQt4. __version__ = QtCore.PYQT_VERSION_STR # PyQt 4.6 introduced getSaveFileNameAndFilter: # https://riverbankcomputing.com/news/pyqt-46 @@ -110,16 +117,19 @@ def _setup_pyqt4_internal(api): QtCore.Signal = QtCore.pyqtSignal QtCore.Slot = QtCore.pyqtSlot QtCore.Property = QtCore.pyqtProperty + _isdeleted = sip.isdeleted _getSaveFileName = QtGui.QFileDialog.getSaveFileNameAndFilter if QT_API == QT_API_PYQTv2: _setup_pyqt4_internal(api=2) elif QT_API == QT_API_PYSIDE: from PySide import QtCore, QtGui, __version__, __version_info__ + import shiboken # PySide 1.0.3 fixed the following: # https://srinikom.github.io/pyside-bz-archive/809.html if __version_info__ < (1, 0, 3): raise ImportError("PySide<1.0.3 is not supported") + def _isdeleted(obj): return not shiboken.isValid(obj) _getSaveFileName = QtGui.QFileDialog.getSaveFileName elif QT_API == QT_API_PYQT: _setup_pyqt4_internal(api=1) From 1aeacba068a1276a822a71db3cec743fe16d345e Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Fri, 13 Mar 2020 21:50:16 -0400 Subject: [PATCH 092/113] Backport PR #16725: TST/CI: also try to run test_user_fonts_win32 on azure --- lib/matplotlib/tests/test_font_manager.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/tests/test_font_manager.py b/lib/matplotlib/tests/test_font_manager.py index f94fabd3764f..a2ff9893d78b 100644 --- a/lib/matplotlib/tests/test_font_manager.py +++ b/lib/matplotlib/tests/test_font_manager.py @@ -160,10 +160,11 @@ def test_user_fonts_linux(tmpdir, monkeypatch): @pytest.mark.skipif(sys.platform != 'win32', reason='Windows only') def test_user_fonts_win32(): - if not os.environ.get('APPVEYOR', False): - pytest.xfail("This test does only work on appveyor since user fonts " - "are Windows specific and the developer's font directory " - "should remain unchanged.") + if not (os.environ.get('APPVEYOR', False) or + os.environ.get('TF_BUILD', False)): + pytest.xfail("This test should only run on CI (appveyor or azure) " + "as the developer's font directory should remain " + "unchanged.") font_test_file = 'mpltest.ttf' From 46d3f65f2405b6ad593fd09e7cb52aac200c17ee Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Mon, 16 Mar 2020 16:57:48 +0100 Subject: [PATCH 093/113] Backport PR #16784: Update CircleCI URL for downloading humor-sans.ttf. --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5b2fc3cdd761..ae82464f7bbf 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -39,9 +39,9 @@ fonts-run: &fonts-install mkdir -p ~/.local/share/fonts wget -nc https://github.com/google/fonts/blob/master/ofl/felipa/Felipa-Regular.ttf?raw=true -O ~/.local/share/fonts/Felipa-Regular.ttf || true if [ ! -f ~/.local/share/fonts/Humor-Sans.ttf ]; then - wget https://mirrors.kernel.org/ubuntu/pool/universe/f/fonts-humor-sans/fonts-humor-sans_1.0-1_all.deb + wget http://http.us.debian.org/debian/pool/main/f/fonts-humor-sans/fonts-humor-sans_1.0-3_all.deb mkdir tmp - dpkg -x fonts-humor-sans_1.0-1_all.deb tmp + dpkg -x fonts-humor-sans_1.0-3_all.deb tmp cp tmp/usr/share/fonts/truetype/humor-sans/Humor-Sans.ttf ~/.local/share/fonts rm -rf tmp else From dc81103dec1cf80610011706753ba577092b99c9 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 16 Mar 2020 13:33:20 -0400 Subject: [PATCH 094/113] Backport PR #16770: Fix tuple markers --- lib/matplotlib/markers.py | 1 + lib/matplotlib/tests/test_marker.py | 107 ++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) diff --git a/lib/matplotlib/markers.py b/lib/matplotlib/markers.py index 3a8d0bc7a9ea..0695fdfe2e04 100644 --- a/lib/matplotlib/markers.py +++ b/lib/matplotlib/markers.py @@ -347,6 +347,7 @@ def _set_tuple_marker(self): self._joinstyle = 'bevel' else: raise ValueError(f"Unexpected tuple marker: {marker}") + self._transform = Affine2D().scale(0.5).rotate_deg(rotation) def _set_mathtext_path(self): """ diff --git a/lib/matplotlib/tests/test_marker.py b/lib/matplotlib/tests/test_marker.py index 1ef9c18c47fb..e50746165792 100644 --- a/lib/matplotlib/tests/test_marker.py +++ b/lib/matplotlib/tests/test_marker.py @@ -1,6 +1,8 @@ import numpy as np +import matplotlib.pyplot as plt from matplotlib import markers from matplotlib.path import Path +from matplotlib.testing.decorators import check_figures_equal import pytest @@ -26,3 +28,108 @@ def test_marker_path(): path = Path([[0, 0], [1, 0]], [Path.MOVETO, Path.LINETO]) # Checking this doesn't fail. marker_style.set_marker(path) + + +class UnsnappedMarkerStyle(markers.MarkerStyle): + """ + A MarkerStyle where the snap threshold is force-disabled. + + This is used to compare to polygon/star/asterisk markers which do not have + any snap threshold set. + """ + def _recache(self): + super()._recache() + self._snap_threshold = None + + +@check_figures_equal() +def test_poly_marker(fig_test, fig_ref): + ax_test = fig_test.add_subplot() + ax_ref = fig_ref.add_subplot() + + # Note, some reference sizes must be different because they have unit + # *length*, while polygon markers are inscribed in a circle of unit + # *radius*. This introduces a factor of np.sqrt(2), but since size is + # squared, that becomes 2. + size = 20**2 + + # Squares + ax_test.scatter([0], [0], marker=(4, 0, 45), s=size) + ax_ref.scatter([0], [0], marker='s', s=size/2) + + # Diamonds, with and without rotation argument + ax_test.scatter([1], [1], marker=(4, 0), s=size) + ax_ref.scatter([1], [1], marker=UnsnappedMarkerStyle('D'), s=size/2) + ax_test.scatter([1], [1.5], marker=(4, 0, 0), s=size) + ax_ref.scatter([1], [1.5], marker=UnsnappedMarkerStyle('D'), s=size/2) + + # Pentagon, with and without rotation argument + ax_test.scatter([2], [2], marker=(5, 0), s=size) + ax_ref.scatter([2], [2], marker=UnsnappedMarkerStyle('p'), s=size) + ax_test.scatter([2], [2.5], marker=(5, 0, 0), s=size) + ax_ref.scatter([2], [2.5], marker=UnsnappedMarkerStyle('p'), s=size) + + # Hexagon, with and without rotation argument + ax_test.scatter([3], [3], marker=(6, 0), s=size) + ax_ref.scatter([3], [3], marker='h', s=size) + ax_test.scatter([3], [3.5], marker=(6, 0, 0), s=size) + ax_ref.scatter([3], [3.5], marker='h', s=size) + + # Rotated hexagon + ax_test.scatter([4], [4], marker=(6, 0, 30), s=size) + ax_ref.scatter([4], [4], marker='H', s=size) + + # Octagons + ax_test.scatter([5], [5], marker=(8, 0, 22.5), s=size) + ax_ref.scatter([5], [5], marker=UnsnappedMarkerStyle('8'), s=size) + + ax_test.set(xlim=(-0.5, 5.5), ylim=(-0.5, 5.5)) + ax_ref.set(xlim=(-0.5, 5.5), ylim=(-0.5, 5.5)) + + +def test_star_marker(): + # We don't really have a strict equivalent to this marker, so we'll just do + # a smoke test. + size = 20**2 + + fig, ax = plt.subplots() + ax.scatter([0], [0], marker=(5, 1), s=size) + ax.scatter([1], [1], marker=(5, 1, 0), s=size) + ax.set(xlim=(-0.5, 0.5), ylim=(-0.5, 1.5)) + + +# The asterisk marker is really a star with 0-size inner circle, so the ends +# are corners and get a slight bevel. The reference markers are just singular +# lines without corners, so they have no bevel, and we need to add a slight +# tolerance. +@check_figures_equal(tol=1.45) +def test_asterisk_marker(fig_test, fig_ref, request): + ax_test = fig_test.add_subplot() + ax_ref = fig_ref.add_subplot() + + # Note, some reference sizes must be different because they have unit + # *length*, while asterisk markers are inscribed in a circle of unit + # *radius*. This introduces a factor of np.sqrt(2), but since size is + # squared, that becomes 2. + size = 20**2 + + def draw_ref_marker(y, style, size): + # As noted above, every line is doubled. Due to antialiasing, these + # doubled lines make a slight difference in the .png results. + ax_ref.scatter([y], [y], marker=UnsnappedMarkerStyle(style), s=size) + if request.getfixturevalue('ext') == 'png': + ax_ref.scatter([y], [y], marker=UnsnappedMarkerStyle(style), + s=size) + + # Plus + ax_test.scatter([0], [0], marker=(4, 2), s=size) + draw_ref_marker(0, '+', size) + ax_test.scatter([0.5], [0.5], marker=(4, 2, 0), s=size) + draw_ref_marker(0.5, '+', size) + + # Cross + ax_test.scatter([1], [1], marker=(4, 2, 45), s=size) + draw_ref_marker(1, 'x', size/2) + + ax_test.set(xlim=(-0.5, 1.5), ylim=(-0.5, 1.5)) + ax_ref.set(xlim=(-0.5, 1.5), ylim=(-0.5, 1.5)) From b3ae232c84300c53add5d29f4dd080d88e803df8 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Fri, 4 Oct 2019 11:48:01 +0200 Subject: [PATCH 095/113] Backport PR #15199: MNT/TST: generalize check_figures_equal to work with pytest.marks --- lib/matplotlib/testing/decorators.py | 59 ++++++++++++++-------------- lib/matplotlib/tests/test_testing.py | 14 ++++++- 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 7965d45e4f16..7e9621cb3b1d 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -381,41 +381,40 @@ def test_plot(fig_test, fig_ref): fig_test.subplots().plot([1, 3, 5]) fig_ref.subplots().plot([0, 1, 2], [1, 3, 5]) """ - + POSITIONAL_OR_KEYWORD = inspect.Parameter.POSITIONAL_OR_KEYWORD def decorator(func): import pytest _, result_dir = _image_directories(func) - if len(inspect.signature(func).parameters) == 2: - # Free-standing function. - @pytest.mark.parametrize("ext", extensions) - def wrapper(ext): - fig_test = plt.figure("test") - fig_ref = plt.figure("reference") - func(fig_test, fig_ref) - test_image_path = result_dir / (func.__name__ + "." + ext) - ref_image_path = ( - result_dir / (func.__name__ + "-expected." + ext)) - fig_test.savefig(test_image_path) - fig_ref.savefig(ref_image_path) - _raise_on_image_difference( - ref_image_path, test_image_path, tol=tol) - - elif len(inspect.signature(func).parameters) == 3: - # Method. - @pytest.mark.parametrize("ext", extensions) - def wrapper(self, ext): - fig_test = plt.figure("test") - fig_ref = plt.figure("reference") - func(self, fig_test, fig_ref) - test_image_path = result_dir / (func.__name__ + "." + ext) - ref_image_path = ( - result_dir / (func.__name__ + "-expected." + ext)) - fig_test.savefig(test_image_path) - fig_ref.savefig(ref_image_path) - _raise_on_image_difference( - ref_image_path, test_image_path, tol=tol) + @pytest.mark.parametrize("ext", extensions) + def wrapper(*args, ext, **kwargs): + fig_test = plt.figure("test") + fig_ref = plt.figure("reference") + func(*args, fig_test=fig_test, fig_ref=fig_ref, **kwargs) + test_image_path = result_dir / (func.__name__ + "." + ext) + ref_image_path = result_dir / ( + func.__name__ + "-expected." + ext + ) + fig_test.savefig(test_image_path) + fig_ref.savefig(ref_image_path) + _raise_on_image_difference( + ref_image_path, test_image_path, tol=tol + ) + + sig = inspect.signature(func) + new_sig = sig.replace( + parameters=([param + for param in sig.parameters.values() + if param.name not in {"fig_test", "fig_ref"}] + + [inspect.Parameter("ext", POSITIONAL_OR_KEYWORD)]) + ) + wrapper.__signature__ = new_sig + + # reach a bit into pytest internals to hoist the marks from + # our wrapped function + new_marks = getattr(func, "pytestmark", []) + wrapper.pytestmark + wrapper.pytestmark = new_marks return wrapper diff --git a/lib/matplotlib/tests/test_testing.py b/lib/matplotlib/tests/test_testing.py index 55415abb6a04..d1273ec1ba46 100644 --- a/lib/matplotlib/tests/test_testing.py +++ b/lib/matplotlib/tests/test_testing.py @@ -1,7 +1,17 @@ import warnings import pytest +from matplotlib.testing.decorators import check_figures_equal -@pytest.mark.xfail(strict=True, - reason="testing that warnings fail tests") + +@pytest.mark.xfail( + strict=True, reason="testing that warnings fail tests" +) def test_warn_to_fail(): warnings.warn("This should fail the test") + + +@pytest.mark.parametrize("a", [1]) +@check_figures_equal(extensions=["png"]) +@pytest.mark.parametrize("b", [1]) +def test_parametrize_with_check_figure_equal(a, fig_ref, b, fig_test): + assert a == b From ecd95c49a38b3735d1cc193824670c755e2cff3e Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Fri, 13 Mar 2020 17:52:06 -0400 Subject: [PATCH 096/113] MNT: re-instate respecting datapath in matplotlibrc file Closes #16678 This does a bit of jiggery-pokery to respect the datapath set in the users matplotlibrc. This is going to have an expedited deprecation cycle as we don't think end-users should be setting this rcparam. --- lib/matplotlib/__init__.py | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 021331370981..fa1caecda148 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -132,6 +132,7 @@ import shutil import subprocess import tempfile +import warnings # cbook must import matplotlib only within function # definitions, so it is safe to import from it here. @@ -269,10 +270,10 @@ def func(): ... ret = None @functools.wraps(func) - def wrapper(): + def wrapper(**kwargs): nonlocal called, ret if not called: - ret = func() + ret = func(**kwargs) called = True _log.debug(fmt, ret) return ret @@ -620,9 +621,30 @@ def get_cachedir(): @_logged_cached('matplotlib data path: %s') -def get_data_path(): +def get_data_path(*, _from_rc=None): """Return the path to Matplotlib data.""" + if _from_rc is not None: + cbook.warn_deprecated( + "3.2", + message=("Setting the datapath via matplotlibrc is " + "deprecated %(since)s and will be removed in %(removal)s. " + ""), + removal='3.3') + path = Path(_from_rc) + if path.is_dir(): + defaultParams['datapath'][0] = str(path) + return str(path) + else: + warnings.warn(f"You passed datapath: {_from_rc!r} in your " + f"matplotribrc file ({matplotlib_fname()}). " + "However this path does not exist, falling back " + "to standard paths.") + + return _get_data_path() + +@_logged_cached('(private) matplotlib data path: %s') +def _get_data_path(): if 'MATPLOTLIBDATA' in os.environ: path = os.environ['MATPLOTLIBDATA'] if not os.path.isdir(path): @@ -704,7 +726,7 @@ def gen_candidates(): yield matplotlibrc yield os.path.join(matplotlibrc, 'matplotlibrc') yield os.path.join(get_configdir(), 'matplotlibrc') - yield os.path.join(get_data_path(), 'matplotlibrc') + yield os.path.join(_get_data_path(), 'matplotlibrc') for fname in gen_candidates(): if os.path.exists(fname) and not os.path.isdir(fname): @@ -972,7 +994,9 @@ def rc_params_from_file(fname, fail_on_error=False, use_default_template=True): with cbook._suppress_matplotlib_deprecation_warning(): if config['datapath'] is None: - config['datapath'] = get_data_path() + config['datapath'] = _get_data_path() + else: + config['datapath'] = get_data_path(_from_rc=config['datapath']) if "".join(config['text.latex.preamble']): _log.info(""" From c4ac8d11dee49501750aa73b8bbd6fa0b8743585 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 16 Mar 2020 18:31:19 -0400 Subject: [PATCH 097/113] DOC: extend deprecation docs a bit --- doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst b/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst index 0af02a5265e6..d1b98eb9c782 100644 --- a/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst +++ b/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst @@ -294,4 +294,6 @@ are deprecated. The ``datapath`` rcParam ~~~~~~~~~~~~~~~~~~~~~~~~ Use `.get_data_path` instead. (The rcParam is deprecated because it cannot be -meaningfully set by an end user.) This was deprecated only in 3.2.1. +meaningfully set by an end user.) The rcParam had no effect from 3.2.0, but +was deprecated only in 3.2.1. In 3.2.1+ if ``'datapath'`` is set in a +``matplotlibrc`` file it will be respected, but this behavior well be removed in 3.3. From 9211537b2f8ea0bcf66ab30e872a59e3a39c738e Mon Sep 17 00:00:00 2001 From: MarcoGorelli Date: Sat, 2 Nov 2019 11:09:58 +0000 Subject: [PATCH 098/113] Make sure that figures are closed when check_figures_equal finishes --- lib/matplotlib/testing/decorators.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 7e9621cb3b1d..c258574dca11 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -389,18 +389,22 @@ def decorator(func): @pytest.mark.parametrize("ext", extensions) def wrapper(*args, ext, **kwargs): - fig_test = plt.figure("test") - fig_ref = plt.figure("reference") - func(*args, fig_test=fig_test, fig_ref=fig_ref, **kwargs) - test_image_path = result_dir / (func.__name__ + "." + ext) - ref_image_path = result_dir / ( - func.__name__ + "-expected." + ext - ) - fig_test.savefig(test_image_path) - fig_ref.savefig(ref_image_path) - _raise_on_image_difference( - ref_image_path, test_image_path, tol=tol - ) + try: + fig_test = plt.figure("test") + fig_ref = plt.figure("reference") + func(*args, fig_test=fig_test, fig_ref=fig_ref, **kwargs) + test_image_path = result_dir / (func.__name__ + "." + ext) + ref_image_path = result_dir / ( + func.__name__ + "-expected." + ext + ) + fig_test.savefig(test_image_path) + fig_ref.savefig(ref_image_path) + _raise_on_image_difference( + ref_image_path, test_image_path, tol=tol + ) + finally: + plt.close(fig_test) + plt.close(fig_ref) sig = inspect.signature(func) new_sig = sig.replace( From 3d9b7dc0d529a440b6dc93455d55c4a92a95ce33 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Mon, 16 Mar 2020 18:43:19 -0400 Subject: [PATCH 099/113] Merge pull request #16693 from tacaswell/tst_better_compare_names TST: use pytest name in naming files for check_figures_equal --- lib/matplotlib/testing/decorators.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index c258574dca11..0a9e21bebcd9 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -5,6 +5,7 @@ import os from pathlib import Path import shutil +import string import sys import unittest import warnings @@ -17,7 +18,7 @@ from matplotlib import ft2font from matplotlib import pyplot as plt from matplotlib import ticker -from . import is_called_from_pytest + from .compare import comparable_formats, compare_images, make_test_filename from .exceptions import ImageComparisonFailure @@ -381,22 +382,23 @@ def test_plot(fig_test, fig_ref): fig_test.subplots().plot([1, 3, 5]) fig_ref.subplots().plot([0, 1, 2], [1, 3, 5]) """ - POSITIONAL_OR_KEYWORD = inspect.Parameter.POSITIONAL_OR_KEYWORD + ALLOWED_CHARS = set(string.digits + string.ascii_letters + '_-[]()') + KEYWORD_ONLY = inspect.Parameter.KEYWORD_ONLY def decorator(func): import pytest _, result_dir = _image_directories(func) @pytest.mark.parametrize("ext", extensions) - def wrapper(*args, ext, **kwargs): + def wrapper(*args, ext, request, **kwargs): + file_name = "".join(c for c in request.node.name + if c in ALLOWED_CHARS) try: fig_test = plt.figure("test") fig_ref = plt.figure("reference") func(*args, fig_test=fig_test, fig_ref=fig_ref, **kwargs) - test_image_path = result_dir / (func.__name__ + "." + ext) - ref_image_path = result_dir / ( - func.__name__ + "-expected." + ext - ) + test_image_path = result_dir / (file_name + "." + ext) + ref_image_path = result_dir / (file_name + "-expected." + ext) fig_test.savefig(test_image_path) fig_ref.savefig(ref_image_path) _raise_on_image_difference( @@ -411,7 +413,10 @@ def wrapper(*args, ext, **kwargs): parameters=([param for param in sig.parameters.values() if param.name not in {"fig_test", "fig_ref"}] - + [inspect.Parameter("ext", POSITIONAL_OR_KEYWORD)]) + + [ + inspect.Parameter("ext", KEYWORD_ONLY), + inspect.Parameter("request", KEYWORD_ONLY), + ]) ) wrapper.__signature__ = new_sig From 7a8a6f7dc568251f79e0482375993201715d36a5 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 16 Mar 2020 19:45:56 -0400 Subject: [PATCH 100/113] Update doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst Co-Authored-By: Elliott Sales de Andrade --- doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst b/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst index d1b98eb9c782..0003a0643158 100644 --- a/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst +++ b/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst @@ -296,4 +296,4 @@ The ``datapath`` rcParam Use `.get_data_path` instead. (The rcParam is deprecated because it cannot be meaningfully set by an end user.) The rcParam had no effect from 3.2.0, but was deprecated only in 3.2.1. In 3.2.1+ if ``'datapath'`` is set in a -``matplotlibrc`` file it will be respected, but this behavior well be removed in 3.3. +``matplotlibrc`` file it will be respected, but this behavior will be removed in 3.3. From 42a768acce369a724b5812adb467ac1f6becab91 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Mon, 16 Mar 2020 20:19:47 -0400 Subject: [PATCH 101/113] Backport PR #16794: DOC: Don't mention drawstyle in `set_linestyle` docs. --- lib/matplotlib/lines.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 892e1e9cac99..1e6641913731 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -1165,9 +1165,6 @@ def set_linestyle(self, ls): ``'None'`` or ``' '`` or ``''`` draw nothing =============================== ================= - Optionally, the string may be preceded by a drawstyle, e.g. - ``'steps--'``. See :meth:`set_drawstyle` for details. - - Alternatively a dash tuple of the following form can be provided:: From 5d69b1efd3351d40ee387303b995c23b25d5baa7 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Mon, 16 Mar 2020 21:44:02 -0400 Subject: [PATCH 102/113] Fix check_figures_equal for tests that use its fixtures. --- lib/matplotlib/testing/decorators.py | 30 ++++++++++++++++++---------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 0a9e21bebcd9..7d0941233f80 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -388,9 +388,17 @@ def decorator(func): import pytest _, result_dir = _image_directories(func) + old_sig = inspect.signature(func) @pytest.mark.parametrize("ext", extensions) - def wrapper(*args, ext, request, **kwargs): + def wrapper(*args, **kwargs): + ext = kwargs['ext'] + if 'ext' not in old_sig.parameters: + kwargs.pop('ext') + request = kwargs['request'] + if 'request' not in old_sig.parameters: + kwargs.pop('request') + file_name = "".join(c for c in request.node.name if c in ALLOWED_CHARS) try: @@ -408,16 +416,16 @@ def wrapper(*args, ext, request, **kwargs): plt.close(fig_test) plt.close(fig_ref) - sig = inspect.signature(func) - new_sig = sig.replace( - parameters=([param - for param in sig.parameters.values() - if param.name not in {"fig_test", "fig_ref"}] - + [ - inspect.Parameter("ext", KEYWORD_ONLY), - inspect.Parameter("request", KEYWORD_ONLY), - ]) - ) + parameters = [ + param + for param in old_sig.parameters.values() + if param.name not in {"fig_test", "fig_ref"} + ] + if 'ext' not in old_sig.parameters: + parameters += [inspect.Parameter("ext", KEYWORD_ONLY)] + if 'request' not in old_sig.parameters: + parameters += [inspect.Parameter("request", KEYWORD_ONLY)] + new_sig = old_sig.replace(parameters=parameters) wrapper.__signature__ = new_sig # reach a bit into pytest internals to hoist the marks from From 03e6854423521513ca50d2cafffafb12bfe071c7 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 17 Mar 2020 14:47:24 -0400 Subject: [PATCH 103/113] Backport PR #16803: Fix some doc issues --- examples/scales/log_bar.py | 3 ++- examples/text_labels_and_annotations/text_rotation.py | 5 ++--- tutorials/colors/colormaps.py | 5 ++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/examples/scales/log_bar.py b/examples/scales/log_bar.py index 77110b3620b8..bcbdee2a7f98 100644 --- a/examples/scales/log_bar.py +++ b/examples/scales/log_bar.py @@ -20,7 +20,8 @@ y = [d[i] for d in data] b = ax.bar(x + i * dimw, y, dimw, bottom=0.001) -ax.set_xticks(x + dimw / 2, map(str, x)) +ax.set_xticks(x + dimw / 2) +ax.set_xticklabels(map(str, x)) ax.set_yscale('log') ax.set_xlabel('x') diff --git a/examples/text_labels_and_annotations/text_rotation.py b/examples/text_labels_and_annotations/text_rotation.py index cdd678013bf8..a380fc324bed 100644 --- a/examples/text_labels_and_annotations/text_rotation.py +++ b/examples/text_labels_and_annotations/text_rotation.py @@ -30,6 +30,7 @@ def addtext(ax, props): for x in range(0, 5): ax.scatter(x + 0.5, 0.5, color='r', alpha=0.5) ax.set_yticks([0, .5, 1]) + ax.set_xticks(np.arange(0, 5.1, 0.5)) ax.set_xlim(0, 5) ax.grid(True) @@ -37,14 +38,12 @@ def addtext(ax, props): # the text bounding box bbox = {'fc': '0.8', 'pad': 0} -fig, axs = plt.subplots(2, 1) +fig, axs = plt.subplots(2, 1, sharex=True) addtext(axs[0], {'ha': 'center', 'va': 'center', 'bbox': bbox}) -axs[0].set_xticks(np.arange(0, 5.1, 0.5), []) axs[0].set_ylabel('center / center') addtext(axs[1], {'ha': 'left', 'va': 'bottom', 'bbox': bbox}) -axs[1].set_xticks(np.arange(0, 5.1, 0.5)) axs[1].set_ylabel('left / bottom') plt.show() diff --git a/tutorials/colors/colormaps.py b/tutorials/colors/colormaps.py index 3e7cf1141365..d6f763572c6a 100644 --- a/tutorials/colors/colormaps.py +++ b/tutorials/colors/colormaps.py @@ -225,7 +225,7 @@ def plot_color_gradients(cmap_category, cmap_list, nrows): plt.show() ############################################################################### -# Lightness of matplotlib colormaps +# Lightness of Matplotlib colormaps # ================================= # # Here we examine the lightness values of the matplotlib colormaps. @@ -308,10 +308,9 @@ def plot_color_gradients(cmap_category, cmap_list, nrows): formatter = mpl.ticker.FixedFormatter(cmap_list[i*dsub:(i+1)*dsub]) ax.xaxis.set_major_formatter(formatter) ax.xaxis.set_tick_params(rotation=50) + ax.set_ylabel('Lightness $L^*$', fontsize=12) ax.set_xlabel(cmap_category + ' colormaps', fontsize=14) - fig.text(0.0, 0.55, 'Lightness $L^*$', fontsize=12, - transform=fig.transFigure, rotation=90) fig.tight_layout(h_pad=0.0, pad=1.5) plt.show() From 5ef8a1292b12fc0ecd5cd099e16b9396322aaaa6 Mon Sep 17 00:00:00 2001 From: hannah Date: Tue, 17 Mar 2020 16:23:30 -0400 Subject: [PATCH 104/113] Backport PR #16779: Documentation: make instructions for documentation contributions easier to find, add to requirements for building docs --- doc/devel/contributing.rst | 30 +++++++++++++---- doc/devel/documenting_mpl.rst | 62 ++++++++++++++++++++++++----------- 2 files changed, 65 insertions(+), 27 deletions(-) diff --git a/doc/devel/contributing.rst b/doc/devel/contributing.rst index 0f5909d697b9..73d5124c60b9 100644 --- a/doc/devel/contributing.rst +++ b/doc/devel/contributing.rst @@ -174,6 +174,8 @@ environment is set up properly:: Contributing code ================= +.. _how-to-contribute: + How to contribute ----------------- @@ -222,7 +224,7 @@ want to consider sending an email to the mailing list for more visibility. * `Git documentation `_ * `Git-Contributing to a Project `_ * `Introduction to GitHub `_ - * :ref:`development-workflow`. + * :ref:`development-workflow` * :ref:`using-git` Contributing pull requests @@ -316,21 +318,35 @@ This helps the contributor become familiar with the contribution workflow, and for the core devs to become acquainted with the contributor; besides which, we frequently underestimate how easy an issue is to solve! -.. _other_ways_to_contribute: -Other ways to contribute -========================= +.. _contributing_documentation: +Contributing documentation +========================== Code is not the only way to contribute to Matplotlib. For instance, documentation is also a very important part of the project and often doesn't get as much attention as it deserves. If you find a typo in the documentation, or have made improvements, do not hesitate to send an email to the mailing -list or submit a GitHub pull request. Full documentation can be found under -the doc/ directory. +list or submit a GitHub pull request. To make a pull request, refer to the +guidelines outlined in :ref:`how-to-contribute`. + +Full documentation can be found under the :file:`doc/`, :file:`tutorials/`, +and :file:`examples/` directories. + +.. seealso:: + * :ref:`documenting-matplotlib` + + +.. _other_ways_to_contribute: + +Other ways to contribute +========================= It also helps us if you spread the word: reference the project from your blog -and articles or link to it from your website! +and articles or link to it from your website! If Matplotlib contributes to a +project that leads to a scientific publication, please follow the +:doc:`/citing` guidelines. .. _coding_guidelines: diff --git a/doc/devel/documenting_mpl.rst b/doc/devel/documenting_mpl.rst index 2c467b3753b2..57bc871d1d49 100644 --- a/doc/devel/documenting_mpl.rst +++ b/doc/devel/documenting_mpl.rst @@ -18,16 +18,16 @@ Getting started General file structure ---------------------- -All documentation is built from the :file:`doc/` directory. This directory -contains both reStructuredText (ReST_; ``.rst``) files that contain pages in -the documentation and configuration files for Sphinx_. +All documentation is built from the :file:`doc/`, :file:`tutorials/`, and +:file:`examples/` directories. The :file:`doc/` directory contains configuration files for Sphinx +and reStructuredText (ReST_; ``.rst``) files that are rendered to documentation pages. -The ``.rst`` files are kept in :file:`doc/users`, -:file:`doc/devel`, :file:`doc/api` and :file:`doc/faq`. The main entry point is -:file:`doc/index.rst`, which pulls in the :file:`index.rst` file for the users -guide, developers guide, api reference, and FAQs. The documentation suite is -built as a single document in order to make the most effective use of cross -referencing. + +The main entry point is :file:`doc/index.rst`, which pulls in the +:file:`index.rst` file for the users guide (:file:`doc/users`), developers +guide (:file:`doc/devel`), api reference (:file:`doc/api`), and FAQs +(:file:`doc/faq`). The documentation suite is built as a single document in +order to make the most effective use of cross referencing. Sphinx_ also creates ``.rst`` files that are staged in :file:`doc/api` from the docstrings of the classes in the Matplotlib library. Except for @@ -35,28 +35,50 @@ the docstrings of the classes in the Matplotlib library. Except for documentation is built. Similarly, the contents of :file:`doc/gallery` and :file:`doc/tutorials` are -generated by the `Sphinx Gallery`_ from the sources in :file:`examples` and -:file:`tutorials`. These sources consist of python scripts that have ReST_ -documentation built into their comments. Don't directly edit the -``.rst`` files in :file:`doc/gallery` and :file:`doc/tutorials` as they are -regenerated when the documentation are built. +generated by the `Sphinx Gallery`_ from the sources in :file:`examples/` and +:file:`tutorials/`. These sources consist of python scripts that have ReST_ +documentation built into their comments. + +.. note:: + + Don't directly edit the ``.rst`` files in :file:`doc/gallery`, + :file:`doc/tutorials`, and :file:`doc/api` (excepting + :file:`doc/api/api_changes/`). Sphinx_ regenerates files in these + directories when building documentation. Installing dependencies ----------------------- The documentation for Matplotlib is generated from reStructuredText (ReST_) -using the Sphinx_ documentation generation tool. There are several extra -requirements that are needed to build the documentation. They are listed in -:file:`doc-requirements.txt`, which is shown below: +using the Sphinx_ documentation generation tool. To build the documentation +you will need to (1) set up an appropriate Python environment and (2) +separately install LaTeX and Graphviz. + +To (1) set up an appropriate Python environment for building the +documentation, you should: + +* create a clean virtual environment with no existing Matplotlib + installation +* install the Python packages required for Matplotlib +* install the additional Python packages required to build the documentation + +There are several extra python packages that are needed to build the +documentation. They are listed in :file:`doc-requirements.txt`, which is +shown below: .. include:: ../../requirements/doc/doc-requirements.txt :literal: +To (2) set up LaTeX and Graphviz dependencies you should: + +* install a minimal working LaTeX distribution +* install the LaTeX packages cm-super and dvipng +* install `Graphviz `_ + .. note:: - * You'll need a minimal working LaTeX distribution for many examples to run. - * `Graphviz `_ is not a Python package, - and needs to be installed separately. + The documentation will not build without LaTeX and Graphviz. These are not + Python packages and must be installed separately. Building the docs ----------------- From 5b4c190320545f77f549d38832251523c4d704f5 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 17 Mar 2020 17:15:41 -0400 Subject: [PATCH 105/113] DOC: Cleanup trailing whitespace. --- doc/devel/documenting_mpl.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/devel/documenting_mpl.rst b/doc/devel/documenting_mpl.rst index 57bc871d1d49..c1704df1e6de 100644 --- a/doc/devel/documenting_mpl.rst +++ b/doc/devel/documenting_mpl.rst @@ -19,8 +19,9 @@ General file structure ---------------------- All documentation is built from the :file:`doc/`, :file:`tutorials/`, and -:file:`examples/` directories. The :file:`doc/` directory contains configuration files for Sphinx -and reStructuredText (ReST_; ``.rst``) files that are rendered to documentation pages. +:file:`examples/` directories. The :file:`doc/` directory contains +configuration files for Sphinx and reStructuredText (ReST_; ``.rst``) files +that are rendered to documentation pages. The main entry point is :file:`doc/index.rst`, which pulls in the @@ -41,7 +42,7 @@ documentation built into their comments. .. note:: - Don't directly edit the ``.rst`` files in :file:`doc/gallery`, + Don't directly edit the ``.rst`` files in :file:`doc/gallery`, :file:`doc/tutorials`, and :file:`doc/api` (excepting :file:`doc/api/api_changes/`). Sphinx_ regenerates files in these directories when building documentation. From 232e702ce903c8acb8744b54fe6a72d7ff605c7e Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 17 Mar 2020 17:38:42 -0400 Subject: [PATCH 106/113] Update GitHub stats for 3.2.1. --- doc/users/github_stats.rst | 1198 +---------------- .../prev_whats_new/github_stats_3.2.0.rst | 1150 ++++++++++++++++ 2 files changed, 1218 insertions(+), 1130 deletions(-) create mode 100644 doc/users/prev_whats_new/github_stats_3.2.0.rst diff --git a/doc/users/github_stats.rst b/doc/users/github_stats.rst index d538ba605eb8..88a6dc3ce23b 100644 --- a/doc/users/github_stats.rst +++ b/doc/users/github_stats.rst @@ -3,1151 +3,89 @@ GitHub Stats ============ -GitHub stats for 2019/05/18 - 2020/03/03 (tag: v3.1.0) +GitHub stats for 2020/03/03 - 2020/03/17 (tag: v3.2.0) These lists are automatically generated, and may be incomplete or contain duplicates. -We closed 125 issues and merged 839 pull requests. -The full list can be seen `on GitHub `__ +We closed 11 issues and merged 44 pull requests. +The full list can be seen `on GitHub `__ -The following 164 authors contributed 3455 commits. +The following 11 authors contributed 89 commits. -* Abhinav Sagar -* Abhinuv Nitin Pitale -* Adam Gomaa -* Akshay Nair -* Alex Rudy -* Alexander Rudy * Antony Lee -* Ao Liu (frankliuao) -* Ardie Orden -* Ashley Whetter -* Ben Root -* Benjamin Bengfort -* Benjamin Congdon -* Bharat123rox -* Bingyao Liu -* Brigitta Sipocz -* Bruno Pagani -* brut -* Carsten -* Carsten Schelp -* chaoyi1 -* Cho Yin Yong -* Chris Barnes -* Christer Jensen -* Christian Brodbeck -* Christoph Pohl -* chuanzhu xu -* Colin -* Cong Ma -* dabana -* DanielMatu -* David Chudzicki -* David Stansby -* Deng Tian -* depano.carlos@gmail.com -* djdt -* donchanee -* Dora Fraeman Caswell -* Elan Ernest * Elliott Sales de Andrade -* Emlyn Price -* Eric Firing -* Eric Wieser -* Federico Ariza -* Filipe Fernandes -* fourpoints -* fredrik-1 -* Gazing -* Greg Lucas * hannah -* Harshal Prakash Patankar -* Ian Hincks -* Ian Thomas -* ilopata1 -* ImportanceOfBeingErnest -* Jacobson Okoro -* James A. Bednar -* Jarrod Millman -* Javad -* jb-leger -* Jean-Benoist Leger -* jfbu -* joaonsg * Jody Klymak -* Joel Frederico -* Johannes H. Jensen -* Johnny Gill -* Jonas Camillus Jeppesen -* Jorge Moraleda -* Joscha Reimer -* Joseph Albert -* Jouni K. Seppänen -* Joy Bhalla -* Juanjo Bazán -* Julian Mehne -* kolibril13 -* krishna katyal -* ksunden * Kyle Sunden -* Larry Bradley -* lepuchi -* luftek -* Maciej Dems -* Maik Riechert -* Marat K -* Mark Wolf -* Mark Wolfman -* Matte -* Matthias Bussonnier -* Matthias Geier -* MatthieuDartiailh -* Max Chen -* Max Humber -* Max Shinn -* MeeseeksMachine -* Michael Droettboom -* Mingkai Dong -* MinRK -* miquelastein -* Molly Rossow -* Nathan Goldbaum -* nathan78906 -* Nelle Varoquaux -* Nick White -* Nicolas Courtemanche -* Nikita Kniazev -* njwhite -* O. Castany -* Oliver Natt -* Olivier -* Om Sitapara -* omsitapara23 -* Oriol (Prodesk) -* Oriol Abril -* Patrick Feiring -* Patrick Shriwise -* PatrickFeiring -* Paul -* Paul Hobson -* Paul Hoffman -* Paul Ivanov -* Peter Schutt -* pharshalp -* Phil Elson -* Philippe Pinard -* Rebecca W Perry -* ResidentMario -* Richard Ji-Cathriner -* RoryIAngus -* Ryan May -* S. Fukuda -* Samesh -* Samesh Lakhotia -* sasoripathos -* SBCV -* Sebastian Bullinger -* Sergey Royz -* Siddhesh Poyarekar -* Simon Legner -* SojiroFukuda -* Steve Dower -* Taras -* Ted Drain -* teddyrendahl +* MarcoGorelli +* Maximilian Nöthe +* Sandro Tosi +* terrycojones * Thomas A Caswell -* Thomas Hisch -* Thomas Robitaille -* Till Hoffmann -* tillahoffmann * Tim Hoffmann -* Tom Flannaghan -* Travis CI -* V. Armando Solé -* Vincent L.M. Mazoyer -* Viraj Mohile -* Wafa Soofi -* Warren Weckesser -* y1thof -* yeo -* Yong Cho Yin -* Yuya -* Zhili (Jerry) Pan -* zhoubecky -* Zulko GitHub issues and pull requests: -Pull Requests (839): - -* :ghpull:`16626`: Updated Readme + Setup.py for PyPa -* :ghpull:`16627`: ci: Restore nuget install step on Azure for v3.2.x. -* :ghpull:`16625`: v3.2.x: Make Azure use local FreeType. -* :ghpull:`16622`: Backport PR #16613 on branch v3.2.x (Fix edge-case in preprocess_data, if label_namer is optional and unset.) -* :ghpull:`16613`: Fix edge-case in preprocess_data, if label_namer is optional and unset. -* :ghpull:`16612`: Backport PR #16605: CI: tweak the vm images we use on azure -* :ghpull:`16611`: Backport PR #16585 on branch v3.2.x (Fix _preprocess_data for Py3.9.) -* :ghpull:`16605`: CI: tweak the vm images we use on azure -* :ghpull:`16585`: Fix _preprocess_data for Py3.9. -* :ghpull:`16541`: Merge pull request #16404 from jklymak/fix-add-base-symlognorm -* :ghpull:`16542`: Backport PR #16006: Ignore pos in StrCategoryFormatter.__call__ to di… -* :ghpull:`16543`: Backport PR #16532: Document default value of save_count parameter in… -* :ghpull:`16532`: Document default value of save_count parameter in FuncAnimation -* :ghpull:`16526`: Backport PR #16480 on v.3.2.x: Re-phrase doc for bottom kwarg to hist -* :ghpull:`16404`: FIX: add base kwarg to symlognor -* :ghpull:`16518`: Backport PR #16502 on branch v3.2.x (Document theta getters/setters) -* :ghpull:`16519`: Backport PR #16513 on branch v3.2.x (Add more FreeType tarball hashes.) -* :ghpull:`16513`: Add more FreeType tarball hashes. -* :ghpull:`16502`: Document theta getters/setters -* :ghpull:`16506`: Backport PR #16505 on branch v3.2.x (Add link to blog to front page) -* :ghpull:`16505`: Add link to blog to front page -* :ghpull:`16480`: Re-phrase doc for bottom kwarg to hist -* :ghpull:`16494`: Backport PR #16490 on branch v3.2.x (Fix some typos on the front page) -* :ghpull:`16489`: Backport PR #16272 on branch v3.2.x (Move mplot3d autoregistration api changes to 3.2.) -* :ghpull:`16490`: Fix some typos on the front page -* :ghpull:`16465`: Backport PR #16450 on branch v3.2.x (Fix interaction between sticky_edges and shared axes.) -* :ghpull:`16466`: Backport PR #16392: FIX colorbars for Norms that do not have a scale. -* :ghpull:`16392`: FIX colorbars for Norms that do not have a scale. -* :ghpull:`16450`: Fix interaction between sticky_edges and shared axes. -* :ghpull:`16453`: Backport PR #16452 on branch v3.2.x (Don't make InvertedLogTransform inherit from deprecated base class.) -* :ghpull:`16452`: Don't make InvertedLogTransform inherit from deprecated base class. -* :ghpull:`16436`: Backport PR #16435 on branch v3.2.x (Reword intro to colors api docs.) -* :ghpull:`16435`: Reword intro to colors api docs. -* :ghpull:`16399`: Backport PR #16396 on branch v3.2.x (font_manager docs cleanup.) -* :ghpull:`16396`: font_manager docs cleanup. -* :ghpull:`16397`: Backport PR #16394 on branch v3.2.x (Mark inkscape 1.0 as unsupported (at least for now).) -* :ghpull:`16394`: Mark inkscape 1.0 as unsupported (at least for now). -* :ghpull:`16286`: Fix cbars for different norms -* :ghpull:`16385`: Backport PR #16226 on branch v3.2.x: Reorganize intro section on main page -* :ghpull:`16383`: Backport PR #16379 on branch v3.2.x (FIX: catch on message content, not module) -* :ghpull:`16226`: Reorganize intro section on main page -* :ghpull:`16364`: Backport PR #16344 on branch v3.2.x (Cast vmin/vmax to floats before nonsingular-expanding them.) -* :ghpull:`16344`: Cast vmin/vmax to floats before nonsingular-expanding them. -* :ghpull:`16360`: Backport PR #16347 on branch v3.2.x (FIX: catch warnings from pandas in cbook._check_1d) -* :ghpull:`16357`: Backport PR #16330 on branch v3.2.x (Clearer signal handling) -* :ghpull:`16349`: Backport PR #16255 on branch v3.2.x (Move version info to sidebar) -* :ghpull:`16346`: Backport PR #16298 on branch v3.2.x (Don't recursively call draw_idle when updating artists at draw time.) -* :ghpull:`16331`: Backport PR #16308 on branch v3.2.x (CI: Use Ubuntu Bionic compatible package names) -* :ghpull:`16332`: Backport PR #16308 on v3.2.x: CI: Use Ubuntu Bionic compatible package names -* :ghpull:`16324`: Backport PR #16323 on branch v3.2.x (Add sphinx doc for Axis.axis_name.) -* :ghpull:`16325`: Backport PR #15462 on v3.2.x: Simplify azure setup. -* :ghpull:`16323`: Add sphinx doc for Axis.axis_name. -* :ghpull:`16321`: Backport PR #16311 on branch v3.2.x (don't override non-Python signal handlers) -* :ghpull:`16308`: CI: Use Ubuntu Bionic compatible package names -* :ghpull:`16306`: Backport PR #16300 on branch v3.2.x (Don't default to negative radii in polar plot.) -* :ghpull:`16305`: Backport PR #16250 on branch v3.2.x (Fix zerolen intersect) -* :ghpull:`16300`: Don't default to negative radii in polar plot. -* :ghpull:`16278`: Backport PR #16273 on branch v3.2.x (DOC: Changing the spelling of co-ordinates.) -* :ghpull:`16260`: Backport PR #16259 on branch v3.2.x (TST: something changed in pytest 5.3.3 that breaks our qt fixtures) -* :ghpull:`16259`: TST: something changed in pytest 5.3.3 that breaks our qt fixtures -* :ghpull:`16238`: Backport PR #16235 on branch v3.2.x (FIX: AttributeError in TimerBase.start) -* :ghpull:`16211`: DOC: ValidateInterval was deprecated in 3.2, not 3.1 -* :ghpull:`16224`: Backport PR #16223 on branch v3.2.x (Added DNA Features Viewer description + screenshot in docs/thirdparty/) -* :ghpull:`16223`: Added DNA Features Viewer description + screenshot in docs/thirdparty/ -* :ghpull:`16222`: Backport PR #16212 on branch v3.2.x (Fix deprecation from #13544) -* :ghpull:`16212`: Fix deprecation from #13544 -* :ghpull:`16207`: Backport PR #16189 on branch v3.2.x (MNT: set default canvas when un-pickling) -* :ghpull:`16189`: MNT: set default canvas when un-pickling -* :ghpull:`16179`: Backport PR #16175: FIX: ignore axes that aren't visible -* :ghpull:`16175`: FIX: ignore axes that aren't visible -* :ghpull:`16168`: Backport PR #16166 on branch v3.2.x (Add badge for citing 3.1.2) -* :ghpull:`16148`: Backport PR #16128 on branch v3.2.x (CI: Do not use nbformat 5.0.0/5.0.1 for testing) -* :ghpull:`16145`: Backport PR #16053 on branch v3.2.x (Fix v_interval setter) -* :ghpull:`16128`: CI: Do not use nbformat 5.0.0/5.0.1 for testing -* :ghpull:`16135`: Backport PR #16112 on branch v3.2.x (CI: Fail when failed to install dependencies) -* :ghpull:`16132`: Backport PR #16126 on branch v3.2.x (TST: test_fork: Missing join) -* :ghpull:`16124`: Backport PR #16105 on branch v3.2.x (Fix legend dragging.) -* :ghpull:`16122`: Backport PR #16113 on branch v3.2.x (Renderer Graphviz inheritance diagrams as svg) -* :ghpull:`16105`: Fix legend dragging. -* :ghpull:`16113`: Renderer Graphviz inheritance diagrams as svg -* :ghpull:`16112`: CI: Fail when failed to install dependencies -* :ghpull:`16119`: Backport PR #16065 on branch v3.2.x (Nicer formatting of community aspects on front page) -* :ghpull:`16074`: Backport PR #16061 on branch v3.2.x (Fix deprecation message for axes_grid1.colorbar.) -* :ghpull:`16093`: Backport PR #16079 on branch v3.2.x (Fix restuctured text formatting) -* :ghpull:`16094`: Backport PR #16080 on branch v3.2.x (Cleanup docstrings in backend_bases.py) -* :ghpull:`16086`: FIX: use supported attribute to check pillow version -* :ghpull:`16084`: Backport PR #16077 on branch v3.2.x (Fix some typos) -* :ghpull:`16077`: Fix some typos -* :ghpull:`16079`: Fix restuctured text formatting -* :ghpull:`16080`: Cleanup docstrings in backend_bases.py -* :ghpull:`16061`: Fix deprecation message for axes_grid1.colorbar. -* :ghpull:`16006`: Ignore pos in StrCategoryFormatter.__call__ to display correct label in the preview window -* :ghpull:`16056`: Backport PR #15864 on branch v3.2.x ([Add the info of 'sviewgui' in thirdparty package]) -* :ghpull:`15864`: Add 'sviewgui' to list of thirdparty packages -* :ghpull:`16055`: Backport PR #16037 on branch v3.2.x (Doc: use empty ScalarMappable for colorbars with no associated image.) -* :ghpull:`16054`: Backport PR #16048 on branch v3.2.x (Document that colorbar() takes a label kwarg.) -* :ghpull:`16037`: Doc: use empty ScalarMappable for colorbars with no associated image. -* :ghpull:`16048`: Document that colorbar() takes a label kwarg. -* :ghpull:`16042`: Backport PR #16031 on branch v3.2.x (Fix docstring of hillshade().) -* :ghpull:`16033`: Backport PR #16028 on branch v3.2.x (Prevent FigureCanvasQT_draw_idle recursively calling itself.) -* :ghpull:`16021`: Backport PR #16007 on branch v3.2.x (Fix search on nested pages) -* :ghpull:`16019`: Backport PR #15735 on branch v3.2.x (Cleanup some mplot3d docstrings.) -* :ghpull:`15987`: Backport PR #15886 on branch v3.2.x (Fix Annotation using different units and different coords on x/y.) -* :ghpull:`15886`: Fix Annotation using different units and different coords on x/y. -* :ghpull:`15984`: Backport PR #15970 on branch v3.2.x (Process clip paths the same way as regular Paths.) -* :ghpull:`15970`: Process clip paths the same way as regular Paths. -* :ghpull:`15963`: Backport PR #15937 on branch v3.2.x (Don't hide exceptions in FontManager.addfont.) -* :ghpull:`15956`: Backport PR #15901 on branch v3.2.x (Update backend_nbagg for removal of Gcf._activeQue.) -* :ghpull:`15937`: Don't hide exceptions in FontManager.addfont. -* :ghpull:`15959`: Backport PR #15953 on branch v3.2.x (Update donation link) -* :ghpull:`15901`: Update backend_nbagg for removal of Gcf._activeQue. -* :ghpull:`15954`: Backport PR #15914 on branch v3.2.x (Example for sigmoid function with horizontal lines) -* :ghpull:`15914`: Example for sigmoid function with horizontal lines -* :ghpull:`15930`: Backport PR #15925 on branch v3.2.x (Optimize setting units to None when they're already None.) -* :ghpull:`15925`: Optimize setting units to None when they're already None. -* :ghpull:`15915`: Backport PR #15903 on branch v3.2.x (Correctly handle non-affine transData in Collection.get_datalim.) -* :ghpull:`15903`: Correctly handle non-affine transData in Collection.get_datalim. -* :ghpull:`15908`: Backport PR #15857 on branch v3.2.x (LassoSelection shouldn't useblit on canvas not supporting blitting.) -* :ghpull:`15857`: LassoSelection shouldn't useblit on canvas not supporting blitting. -* :ghpull:`15905`: Backport PR #15763 on branch v3.2.x (Skip webagg test if tornado is not available.) -* :ghpull:`15882`: Backport PR #15859 on branch v3.2.x (Doc: Move search field into nav bar) -* :ghpull:`15868`: Backport PR #15848 on branch v3.2.x: Cleanup environment variables FAQ -* :ghpull:`15872`: Backport PR #15869 on branch v3.2.x (Update markers docs.) -* :ghpull:`15869`: Update markers docs. -* :ghpull:`15867`: Backport PR #15789 on branch v3.2.x (Cleanup xticks/yticks docstrings.) -* :ghpull:`15870`: Backport PR #15865 on branch v3.2.x (Fix a typo) -* :ghpull:`15871`: Backport PR #15824 on branch v3.2.x (Document doc style for default values) -* :ghpull:`15824`: Document doc style for default values -* :ghpull:`15865`: Fix a typo -* :ghpull:`15789`: Cleanup xticks/yticks docstrings. -* :ghpull:`15862`: Backport PR #15851 on branch v3.2.x (ffmpeg is available on default ubuntu packages now) -* :ghpull:`15848`: Cleanup environment variables FAQ. -* :ghpull:`15844`: Backport PR #15841 on branch v3.2.x (DOC: specify the expected shape in the Collection.set_offset) -* :ghpull:`15841`: DOC: specify the expected shape in the Collection.set_offset -* :ghpull:`15837`: Backport PR #15799 on branch v3.2.x (Improve display of author names on PDF titlepage of matplotlib own docs) -* :ghpull:`15799`: Improve display of author names on PDF titlepage of matplotlib own docs -* :ghpull:`15831`: Backport PR #15829 on branch v3.2.x (In C extensions, use FutureWarning, not DeprecationWarning.) -* :ghpull:`15829`: In C extensions, use FutureWarning, not DeprecationWarning. -* :ghpull:`15818`: Backport PR #15619 on branch v3.2.x (Improve zorder demo) -* :ghpull:`15819`: Backport PR #15601 on branch v3.2.x (Fix FontProperties conversion to/from strings) -* :ghpull:`15601`: Fix FontProperties conversion to/from strings -* :ghpull:`15619`: Improve zorder demo -* :ghpull:`15810`: Backport PR #15809 on branch v3.2.x (Exclude artists from legend using label attributte) -* :ghpull:`15809`: Exclude artists from legend using label attributte -* :ghpull:`15808`: Backport PR #15513 on branch v3.2.x (Separate plots using #### in make_room_for_ylabel_using_axesgrid.py) -* :ghpull:`15513`: Separate plots using #### in make_room_for_ylabel_using_axesgrid.py -* :ghpull:`15807`: Backport PR #15791 on branch v3.2.x (Cleanup backend_bases docstrings.) -* :ghpull:`15791`: Cleanup backend_bases docstrings. -* :ghpull:`15803`: Backport PR #15795 on branch v3.2.x (Remove incorrect statement re2: colorbars in image tutorial.) -* :ghpull:`15795`: Remove incorrect statement re: colorbars in image tutorial. -* :ghpull:`15794`: Backport PR #15793 on branch v3.2.x (fix a couple typos in tutorials) -* :ghpull:`15793`: fix a couple typos in tutorials -* :ghpull:`15774`: Backport PR #15748 on branch v3.2.x (Fix incorrect macro in FT2Font setup.) -* :ghpull:`15748`: Fix incorrect macro in FT2Font setup. -* :ghpull:`15759`: Backport PR #15751 on branch v3.2.x (Modernize FAQ entry for plt.show().) -* :ghpull:`15762`: Backport PR #15752 on branch v3.2.x (Update boxplot/violinplot faq.) -* :ghpull:`15755`: Backport PR #15661 on branch v3.2.x (Document scope of 3D scatter depthshading.) -* :ghpull:`15742`: Backport PR #15729 on branch v3.2.x (Catch correct parse errror type for dateutil >= 2.8.1) -* :ghpull:`15738`: Backport PR #15737 on branch v3.2.x (Fix env override in WebAgg backend test.) -* :ghpull:`15724`: Backport PR #15718 on branch v3.2.x (Update donation link) -* :ghpull:`15716`: Backport PR #15683 on branch v3.2.x (Cleanup dates.py docstrings.) -* :ghpull:`15683`: Cleanup dates.py docstrings. -* :ghpull:`15688`: Backport PR #15682 on branch v3.2.x (Make histogram_bin_edges private.) -* :ghpull:`15682`: Make histogram_bin_edges private. -* :ghpull:`15666`: Backport PR #15649 on branch v3.2.x (Fix searchindex.js loading when ajax fails (because e.g. CORS in embedded iframes)) -* :ghpull:`15669`: Backport PR #15654 on branch v3.2.x (Fix some broken links.) -* :ghpull:`15660`: Backport PR #15647 on branch v3.2.x (Update some links) -* :ghpull:`15653`: Backport PR #15623 on branch v3.2.x (Docstring for Artist.mouseover) -* :ghpull:`15623`: Docstring for Artist.mouseover -* :ghpull:`15634`: Backport PR #15626 on branch v3.2.x (Note minimum supported version for fontconfig.) -* :ghpull:`15633`: Backport PR #15620 on branch v3.2.x (TST: Increase tolerance of some tests for aarch64) -* :ghpull:`15626`: Note minimum supported version for fontconfig. -* :ghpull:`15632`: Backport PR #15627 on branch v3.2.x (Make it easier to test various animation writers in examples.) -* :ghpull:`15620`: TST: Increase tolerance of some tests for aarch64 -* :ghpull:`15627`: Make it easier to test various animation writers in examples. -* :ghpull:`15618`: Backport PR #15613 on branch v3.2.x (Revert "Don't bother with manually resizing the Qt main window.") -* :ghpull:`15613`: Revert "Don't bother with manually resizing the Qt main window." -* :ghpull:`15593`: Backport PR #15590 on branch v3.2.x (Rename numpy to NumPy in docs.) -* :ghpull:`15590`: Rename numpy to NumPy in docs. -* :ghpull:`15588`: Backport PR #15478 on branch v3.2.x (Make ConciseDateFormatter obey timezone) -* :ghpull:`15478`: Make ConciseDateFormatter obey timezone -* :ghpull:`15583`: Backport PR #15512 on branch v3.2.x -* :ghpull:`15584`: Backport PR #15579 on branch v3.2.x (Remove matplotlib.sphinxext.tests from __init__.py) -* :ghpull:`15579`: Remove matplotlib.sphinxext.tests from __init__.py -* :ghpull:`15577`: Backport PR #14705 on branch v3.2.x (Correctly size non-ASCII characters in agg backend.) -* :ghpull:`14705`: Correctly size non-ASCII characters in agg backend. -* :ghpull:`15572`: Backport PR #15452 on branch v3.2.x (Improve example for tick formatters) -* :ghpull:`15570`: Backport PR #15561 on branch v3.2.x (Update thirdparty scalebar) -* :ghpull:`15452`: Improve example for tick formatters -* :ghpull:`15545`: Backport PR #15429 on branch v3.2.x (Fix OSX build on azure) -* :ghpull:`15544`: Backport PR #15537 on branch v3.2.x (Add a third party package in the doc: matplotlib-scalebar) -* :ghpull:`15561`: Update thirdparty scalebar -* :ghpull:`15567`: Backport PR #15562 on branch v3.2.x (Improve docsting of AxesImage) -* :ghpull:`15562`: Improve docsting of AxesImage -* :ghpull:`15565`: Backport PR #15556 on branch v3.2.x (Fix test suite compat with ghostscript 9.50.) -* :ghpull:`15556`: Fix test suite compat with ghostscript 9.50. -* :ghpull:`15560`: Backport PR #15553 on branch v3.2.x (DOC: add cache-buster query string to css path) -* :ghpull:`15552`: Backport PR #15528 on branch v3.2.x (Declutter home page) -* :ghpull:`15554`: Backport PR #15523 on branch v3.2.x (numpydoc AxesImage) -* :ghpull:`15523`: numpydoc AxesImage -* :ghpull:`15549`: Backport PR #15516 on branch v3.2.x (Add logo like font) -* :ghpull:`15543`: Backport PR #15539 on branch v3.2.x (Small cleanups to backend docs.) -* :ghpull:`15542`: Backport PR #15540 on branch v3.2.x (axisartist tutorial fixes.) -* :ghpull:`15537`: Add a third party package in the doc: matplotlib-scalebar -* :ghpull:`15541`: Backport PR #15533 on branch v3.2.x (Use svg instead of png for website logo) -* :ghpull:`15539`: Small cleanups to backend docs. -* :ghpull:`15540`: axisartist tutorial fixes. -* :ghpull:`15538`: Backport PR #15535 on branch v3.2.x (Avoid really long lines in event handling docs.) -* :ghpull:`15535`: Avoid really long lines in event handling docs. -* :ghpull:`15531`: Backport PR #15527 on branch v3.2.x (Clarify imshow() docs concerning scaling and grayscale images) -* :ghpull:`15527`: Clarify imshow() docs concerning scaling and grayscale images -* :ghpull:`15522`: Backport PR #15500 on branch v3.2.x (Improve antialiasing example) -* :ghpull:`15524`: Backport PR #15499 on branch v3.2.x (Do not show path in font table example) -* :ghpull:`15525`: Backport PR #15498 on branch v3.2.x (Simplify matshow example) -* :ghpull:`15498`: Simplify matshow example -* :ghpull:`15499`: Do not show path in font table example -* :ghpull:`15521`: Backport PR #15519 on branch v3.2.x (FIX: fix anti-aliasing zoom bug) -* :ghpull:`15500`: Improve antialiasing example -* :ghpull:`15519`: FIX: fix anti-aliasing zoom bug -* :ghpull:`15510`: Backport PR #15489 on branch v3.2.x (DOC: adding main nav to site) -* :ghpull:`15495`: Backport PR #15486 on branch v3.2.x (Fixes an error in the documentation of Ellipse) -* :ghpull:`15488`: Backport PR #15372 on branch v3.2.x (Add example for drawstyle) -* :ghpull:`15490`: Backport PR #15487 on branch v3.2.x (Fix window not always raised in Qt example) -* :ghpull:`15487`: Fix window not always raised in Qt example -* :ghpull:`15372`: Add example for drawstyle -* :ghpull:`15485`: Backport PR #15454 on branch v3.2.x (Rewrite Anscombe's quartet example) -* :ghpull:`15483`: Backport PR #15480 on branch v3.2.x (Fix wording in [packages] section of setup.cfg) -* :ghpull:`15454`: Rewrite Anscombe's quartet example -* :ghpull:`15480`: Fix wording in [packages] section of setup.cfg -* :ghpull:`15477`: Backport PR #15464 on branch v3.2.x (Remove unused code (remainder from #15453)) -* :ghpull:`15471`: Backport PR #15460 on branch v3.2.x (Fix incorrect value check in axes_grid.) -* :ghpull:`15456`: Backport PR #15453 on branch v3.2.x (Improve example for tick locators) -* :ghpull:`15457`: Backport PR #15450 on branch v3.2.x (API: rename DivergingNorm to TwoSlopeNorm) -* :ghpull:`15450`: API: rename DivergingNorm to TwoSlopeNorm -* :ghpull:`15434`: In imsave, let pnginfo have precedence over metadata. -* :ghpull:`15445`: Backport PR #15439 on branch v3.2.x (DOC: mention discourse main page) -* :ghpull:`15425`: Backport PR #15422 on branch v3.2.x (FIX: typo in attribute lookup) -* :ghpull:`15449`: DOC: fix build -* :ghpull:`15429`: Fix OSX build on azure -* :ghpull:`15420`: Backport PR #15380 on branch v3.2.x (Update docs of BoxStyle) -* :ghpull:`15380`: Update docs of BoxStyle -* :ghpull:`15300`: CI: use python -m to make sure we are using the pip/pytest we want -* :ghpull:`15414`: Backport PR #15413 on branch v3.2.x (catch OSError instead of FileNotFoundError in _get_executable_info to resolve #15399) -* :ghpull:`15413`: catch OSError instead of FileNotFoundError in _get_executable_info to resolve #15399 -* :ghpull:`15406`: Backport PR #15347 on branch v3.2.x (Fix axes.hist bins units) -* :ghpull:`15405`: Backport PR #15391 on branch v3.2.x (Increase fontsize in inheritance graphs) -* :ghpull:`15347`: Fix axes.hist bins units -* :ghpull:`15391`: Increase fontsize in inheritance graphs -* :ghpull:`15389`: Backport PR #15379 on branch v3.2.x (Document formatting strings in the docs) -* :ghpull:`15379`: Document formatting strings in the docs -* :ghpull:`15386`: Backport PR #15385 on branch v3.2.x (Reword hist() doc.) -* :ghpull:`15385`: Reword hist() doc. -* :ghpull:`15377`: Backport PR #15357 on branch v3.2.x (Add 'step' and 'barstacked' to histogram_histtypes demo) -* :ghpull:`15357`: Add 'step' and 'barstacked' to histogram_histtypes demo -* :ghpull:`15366`: Backport PR #15364 on branch v3.2.x (DOC: fix typo in colormap docs) -* :ghpull:`15362`: Backport PR #15350 on branch v3.2.x (Don't generate double-reversed cmaps ("viridis_r_r", ...).) -* :ghpull:`15360`: Backport PR #15258 on branch v3.2.x (Don't fallback to view limits when autoscale()ing no data.) -* :ghpull:`15350`: Don't generate double-reversed cmaps ("viridis_r_r", ...). -* :ghpull:`15258`: Don't fallback to view limits when autoscale()ing no data. -* :ghpull:`15299`: Backport PR #15296 on branch v3.2.x (Fix typo/bug from 18cecf7) -* :ghpull:`15327`: Backport PR #15326 on branch v3.2.x (List of minimal versions of dependencies) -* :ghpull:`15326`: List of minimal versions of dependencies -* :ghpull:`15317`: Backport PR #15291 on branch v3.2.x (Remove error_msg_qt from backend_qt4.) -* :ghpull:`15316`: Backport PR #15283 on branch v3.2.x (Don't default axes_grid colorbar locator to MaxNLocator.) -* :ghpull:`15291`: Remove error_msg_qt from backend_qt4. -* :ghpull:`15283`: Don't default axes_grid colorbar locator to MaxNLocator. -* :ghpull:`15315`: Backport PR #15308 on branch v3.2.x (Doc: Add close event to list of events) -* :ghpull:`15308`: Doc: Add close event to list of events -* :ghpull:`15312`: Backport PR #15307 on branch v3.2.x (DOC: center footer) -* :ghpull:`15307`: DOC: center footer -* :ghpull:`15276`: Backport PR #15271 on branch v3.2.x (Fix font weight validation) -* :ghpull:`15279`: Backport PR #15252 on branch v3.2.x (Mention labels and milestones in PR review guidelines) -* :ghpull:`15252`: Mention labels and milestones in PR review guidelines -* :ghpull:`15268`: Backport PR #15266 on branch v3.2.x (Embedding in Tk example: Fix toolbar being clipped.) -* :ghpull:`15269`: Backport PR #15267 on branch v3.2.x (added multi-letter example to mathtext tutorial) -* :ghpull:`15267`: added multi-letter example to mathtext tutorial -* :ghpull:`15266`: Embedding in Tk example: Fix toolbar being clipped. -* :ghpull:`15243`: Move some new API changes to the correct place -* :ghpull:`15245`: Fix incorrect calls to warn_deprecated. -* :ghpull:`15239`: Composite against white, not the savefig.facecolor rc, in print_jpeg. -* :ghpull:`15227`: contains_point() docstring fixes -* :ghpull:`15242`: Cleanup widgets docstrings. -* :ghpull:`14889`: Support pixel-by-pixel alpha in imshow. -* :ghpull:`14928`: Logit scale nonsingular -* :ghpull:`14998`: Fix nonlinear spine positions & inline Spine._calc_offset_transform into get_spine_transform. -* :ghpull:`15231`: Doc: Do not write default for non-existing rcParams -* :ghpull:`15222`: Cleanup projections/__init__.py. -* :ghpull:`15228`: Minor docstring style cleanup -* :ghpull:`15237`: Cleanup widgets.py. -* :ghpull:`15229`: Doc: Fix Bbox and BboxBase links -* :ghpull:`15235`: Kill FigureManagerTk._num. -* :ghpull:`15234`: Drop mention of msinttypes in Windows build. -* :ghpull:`15224`: Avoid infinite loop when switching actions in qt backend. -* :ghpull:`15230`: Doc: Remove hard-documented rcParams defaults -* :ghpull:`15149`: pyplot.style.use() to accept pathlib.Path objects as arguments -* :ghpull:`15220`: Correctly format floats passed to pgf backend. -* :ghpull:`15216`: Update docstrings of contains_point(s) methods -* :ghpull:`15209`: Exclude s-g generated files from flake8 check. -* :ghpull:`15204`: PEP8ify some variable names. -* :ghpull:`15196`: Force html4 writer for sphinx 2 -* :ghpull:`13544`: Improve handling of subplots spanning multiple gridspec cells. -* :ghpull:`15194`: Trivial style fixes. -* :ghpull:`15202`: Deprecate the renderer parameter to Figure.tight_layout. -* :ghpull:`15195`: Fix integers being passed as length to quiver3d. -* :ghpull:`15180`: Add some more internal links to 3.2.0 what's new -* :ghpull:`13510`: Change Locator MAXTICKS checking to emitting a log at WARNING level. -* :ghpull:`15184`: Mark missing_references extension as parallel read safe -* :ghpull:`15150`: Autodetect whether pgf can use \includegraphics[interpolate]. -* :ghpull:`15163`: 3.2.0 API changes page -* :ghpull:`15176`: What's new for 3.2.0 -* :ghpull:`11947`: Ensure streamplot Euler step is always called when going out of bounds. -* :ghpull:`13702`: Deduplicate methods shared between Container and Artist. -* :ghpull:`15169`: TST: verify warnings fail the test suite -* :ghpull:`14888`: Replace some polar baseline images by check_figures_equal. -* :ghpull:`15027`: More readability improvements on axis3d. -* :ghpull:`15171`: Add useful error message when trying to add Slider to 3DAxes -* :ghpull:`13775`: Doc: Scatter Hist example update -* :ghpull:`15164`: removed a typo -* :ghpull:`15152`: Support for shorthand hex colors. -* :ghpull:`15159`: Follow up on #14424 for docstring -* :ghpull:`14424`: ENH: Add argument size validation to quiver. -* :ghpull:`15137`: DOC: add example to power limit API change note -* :ghpull:`15144`: Improve local page contents CSS -* :ghpull:`15143`: Restore doc references. -* :ghpull:`15124`: Replace parameter lists with square brackets -* :ghpull:`13077`: fix FreeType build on Azure -* :ghpull:`15123`: Improve categorical example -* :ghpull:`15134`: Fix missing references in doc build. -* :ghpull:`13937`: Use PYTHONFAULTHANDLER to switch on the Python fault handler. -* :ghpull:`13452`: Replace axis_artist.AttributeCopier by normal inheritance. -* :ghpull:`15045`: Resize canvas when changing figure size -* :ghpull:`15122`: Fixed app creation in qt5 backend (see #15100) -* :ghpull:`15099`: Add lightsource parameter to bar3d -* :ghpull:`14876`: Inline some afm parsing code. -* :ghpull:`15119`: Deprecate a validator for a deprecated rcParam value. -* :ghpull:`15121`: Fix Stacked bar graph example -* :ghpull:`15113`: Cleanup layout_from_subplotspec. -* :ghpull:`13543`: Remove zip_safe=False flag from setup.py. -* :ghpull:`12860`: ENH: LogLocator: check for correct dimension of subs added -* :ghpull:`14349`: Replace ValidateInterval by simpler specialized validators. -* :ghpull:`14352`: Remove redundant is_landscape kwarg from backend_ps helpers. -* :ghpull:`15087`: Pass gid to renderer -* :ghpull:`14703`: Don't bother with manually resizing the Qt main window. -* :ghpull:`14833`: Reuse TexManager implementation in convert_psfrags. -* :ghpull:`14893`: Update layout.html for sphinx themes -* :ghpull:`15098`: Simplify symlog range determination logic -* :ghpull:`15112`: Cleanup legend() docstring. -* :ghpull:`15108`: Fix doc build and resync matplotlibrc.template with actual defaults. -* :ghpull:`14940`: Fix text kerning calculations and some FT2Font cleanup -* :ghpull:`15082`: Privatize font_manager.JSONEncoder. -* :ghpull:`15106`: Update docs of GridSpec -* :ghpull:`14832`: ENH:made default tick formatter to switch to scientific notation earlier -* :ghpull:`15086`: Style fixes. -* :ghpull:`15073`: Add entry for blume to thirdparty package index -* :ghpull:`15095`: Simplify _png extension by handling file open/close in Python. -* :ghpull:`15092`: MNT: Add test for aitoff-projection -* :ghpull:`15101`: Doc: fix typo in contour doc -* :ghpull:`14624`: Fix axis inversion with loglocator and logitlocator. -* :ghpull:`15088`: Fix more doc references. -* :ghpull:`15063`: Add Comic Neue as a fantasy font. -* :ghpull:`14867`: Propose change to PR merging policy. -* :ghpull:`15068`: Add FontManager.addfont to register fonts at specific paths. -* :ghpull:`13397`: Deprecate axes_grid1.colorbar (in favor of matplotlib's own). -* :ghpull:`14521`: Move required_interactive_framework to canvas class. -* :ghpull:`15083`: Cleanup spines example. -* :ghpull:`14997`: Correctly set formatters and locators on removed shared axis -* :ghpull:`15064`: Fix eps hatching in MacOS Preview -* :ghpull:`15074`: Write all ACCEPTS markers in docstrings as comments. -* :ghpull:`15078`: Clarify docstring of FT2Font.get_glyph_name. -* :ghpull:`15080`: Fix cross-references in API changes < 3.0.0. -* :ghpull:`15072`: Cleanup patheffects. -* :ghpull:`15071`: Cleanup offsetbox.py. -* :ghpull:`15070`: Fix cross-references in API changes < 2.0.0. -* :ghpull:`10691`: Fix for shared axes diverging after setting tick markers -* :ghpull:`15069`: Style fixes for font_manager.py. -* :ghpull:`15067`: Fix cross-references in API changes < 1.0 -* :ghpull:`15061`: Fix cross-references in tutorials and FAQ -* :ghpull:`15060`: Fix cross-references in examples. -* :ghpull:`14957`: Documentation for using ConnectionPatch across Axes with constrained… -* :ghpull:`15053`: Make citation bit of README less wordy -* :ghpull:`15044`: numpydoc set_size_inches docstring -* :ghpull:`15050`: Clarify unnecessary special handling for colons in paths. -* :ghpull:`14797`: DOC: create a Agg figure without pyplot in buffer example -* :ghpull:`14844`: Add citation info to README -* :ghpull:`14884`: Do not allow canvas size to become smaller than MinSize in wx backend… -* :ghpull:`14941`: Improvements to make_icons.py. -* :ghpull:`15048`: DOC: more nitpick follow up -* :ghpull:`15043`: Fix Docs: Don’t warn for unused ignores -* :ghpull:`15025`: Re-write text wrapping logic -* :ghpull:`14840`: Don't assume transform is valid on access to matrix. -* :ghpull:`14862`: Make optional in docstrings optional -* :ghpull:`15028`: Python version conf.py -* :ghpull:`15033`: FIX: un-break nightly wheels on py37 -* :ghpull:`15046`: v3.1.x merge up -* :ghpull:`15015`: Fix bad missing-references.json due to PR merge race condition. -* :ghpull:`14581`: Make logscale bar/hist autolimits more consistents. -* :ghpull:`15034`: Doc fix nitpick -* :ghpull:`14614`: Deprecate {x,y,z}axis_date. -* :ghpull:`14991`: Handle inherited is_separable, has_inverse in transform props detection. -* :ghpull:`15032`: Clarify effect of axis('equal') on explicit data limits -* :ghpull:`15031`: Update docs of GridSpec -* :ghpull:`14106`: Describe FigureManager -* :ghpull:`15024`: Update docs of GridSpecBase -* :ghpull:`14906`: Deprecate some FT2Image methods. -* :ghpull:`14963`: More Axis3D cleanup. -* :ghpull:`15009`: Provide signatures to some C-level classes and methods. -* :ghpull:`14968`: DOC: colormap manipulation tutorial update -* :ghpull:`15006`: Deprecate get/set_*ticks minor positional use -* :ghpull:`14989`: DOC:Update axes documentation -* :ghpull:`14871`: Parametrize determinism tests. -* :ghpull:`14768`: DOC: Enable nitpicky -* :ghpull:`15013`: Matplotlib requires Python 3.6, which in turn requires Mac OS X 10.6+ -* :ghpull:`15012`: Fix typesetting of "GitHub" -* :ghpull:`14954`: Cleanup polar_legend example. -* :ghpull:`14519`: Check parameters of ColorbarBase -* :ghpull:`14942`: Make _classic_test style a tiny patch on top of classic. -* :ghpull:`14988`: pathlibify/fstringify setup/setupext. -* :ghpull:`14511`: Deprecate allowing scalars for fill_between where -* :ghpull:`14493`: Remove deprecated fig parameter form GridSpecBase.get_subplot_params() -* :ghpull:`14995`: Further improve backend tutorial. -* :ghpull:`15000`: Use warnings.warn, not logging.warning, in microseconds locator warning. -* :ghpull:`14990`: Fix nonsensical transform in mixed-mode axes aspect computation. -* :ghpull:`15002`: No need to access filesystem in test_dates.py. -* :ghpull:`14549`: Improve backends documentation -* :ghpull:`14774`: Fix image bbox clip. -* :ghpull:`14978`: Typo fixes in pyplot.py -* :ghpull:`14702`: Don't enlarge toolbar for Qt high-dpi. -* :ghpull:`14922`: Autodetect some transform properties. -* :ghpull:`14962`: Replace inspect.getfullargspec by inspect.signature. -* :ghpull:`14958`: Improve docs of toplevel module. -* :ghpull:`14926`: Save a matrix unpacking/repacking in offsetbox. -* :ghpull:`14961`: Cleanup demo_agg_filter. -* :ghpull:`14924`: Kill the C-level (private) RendererAgg.buffer_rgba, which returns a copy. -* :ghpull:`14946`: Delete virtualenv faq. -* :ghpull:`14944`: Shorten style.py. -* :ghpull:`14931`: Deprecate some obscure rcParam synonyms. -* :ghpull:`14947`: Fix inaccuracy re: backends in intro tutorial. -* :ghpull:`14904`: Fix typo in secondary_axis.py example. -* :ghpull:`14925`: Support passing spine bounds as single tuple. -* :ghpull:`14921`: DOC: Make abbreviation of versus consistent. -* :ghpull:`14739`: Improve indentation of Line2D properties in docstrings. -* :ghpull:`14923`: In examples, prefer buffer_rgba to print_to_buffer. -* :ghpull:`14908`: Make matplotlib.style.available sorted alphabetically. -* :ghpull:`13567`: Deprecate MovieWriterRegistry cache-dirtyness system. -* :ghpull:`14879`: Error out when unsupported kwargs are passed to Scale. -* :ghpull:`14512`: Logit scale, changes in LogitLocator and LogitFormatter -* :ghpull:`12415`: ENH: fig.set_size to allow non-inches units -* :ghpull:`13783`: Deprecate disable_internet. -* :ghpull:`14886`: Further simplify the flow of pdf text output. -* :ghpull:`14894`: Make slowness warning for legend(loc="best") more accurate. -* :ghpull:`14891`: Fix nightly test errors -* :ghpull:`14895`: Fix typos -* :ghpull:`14890`: Remove unused private helper method in mplot3d. -* :ghpull:`14872`: Unify text layout paths. -* :ghpull:`8183`: Allow array alpha for imshow -* :ghpull:`13832`: Vectorize handling of stacked/cumulative in hist(). -* :ghpull:`13630`: Simplify PolarAxes.can_pan. -* :ghpull:`14565`: Rewrite an argument check to _check_getitem -* :ghpull:`14875`: Cleanup afm module docstring. -* :ghpull:`14880`: Fix animation blitting for plots with shared axes -* :ghpull:`14870`: FT2Font.get_char_index never returns None. -* :ghpull:`13463`: Deprecate Locator.autoscale. -* :ghpull:`13724`: ENH: anti-alias down-sampled images -* :ghpull:`14848`: Clearer error message for plt.axis() -* :ghpull:`14660`: colorbar(label=None) should give an empty label -* :ghpull:`14654`: Cleanup of docstrings of scales -* :ghpull:`14868`: Update bar stacked example to directly manipulate axes. -* :ghpull:`14749`: Fix get_canvas_width_height() for pgf backend. -* :ghpull:`14776`: Make ExecutableUnavailableError -* :ghpull:`14843`: Don't try to cleanup CallbackRegistry during interpreter shutdown. -* :ghpull:`14849`: Improve tkagg icon resolution -* :ghpull:`14866`: changed all readme headings to verbs -* :ghpull:`13364`: Numpyfy tick handling code in Axis3D. -* :ghpull:`13642`: FIX: get_datalim for collection -* :ghpull:`14860`: Stopgap fix for pandas converters in tests. -* :ghpull:`6498`: Check canvas identity in Artist.contains. -* :ghpull:`14707`: Add titlecolor in rcParams -* :ghpull:`14853`: Fix typo in set_adjustable check. -* :ghpull:`14845`: More cleanups. -* :ghpull:`14809`: Clearer calls to ConnectionPatch. -* :ghpull:`14716`: Use str instead of string as type in docstrings -* :ghpull:`14338`: Simplify/pathlibify image_comparison. -* :ghpull:`8930`: timedelta formatter -* :ghpull:`14733`: Deprecate FigureFrameWx.statusbar & NavigationToolbar2Wx.statbar. -* :ghpull:`14713`: Unite masked and NaN plot examples -* :ghpull:`14576`: Let Axes3D share have_units, _on_units_changed with 2d axes. -* :ghpull:`14575`: Make ticklabel_format work both for 2D and 3D axes. -* :ghpull:`14834`: DOC: Webpage not formated correctly on gallery docs -* :ghpull:`14730`: Factor out common parts of wx event handlers. -* :ghpull:`14727`: Fix axes aspect for non-linear, non-log, possibly mixed-scale axes. -* :ghpull:`14835`: Only allow set_adjustable("datalim") for axes with standard data ratios. -* :ghpull:`14746`: Simplify Arrow constructor. -* :ghpull:`14752`: Doc changes to git setup -* :ghpull:`14732`: Deduplicate wx configure_subplots tool. -* :ghpull:`14715`: Use array-like in docs -* :ghpull:`14728`: More floating_axes cleanup. -* :ghpull:`14719`: Make Qt navtoolbar more robust against removal of either pan or zoom. -* :ghpull:`14695`: Various small simplifications -* :ghpull:`14745`: Replace Affine2D().scale(x, x) by Affine2D().scale(x). -* :ghpull:`14687`: Add missing spaces after commas in docs -* :ghpull:`14810`: Lighten icons of NavigationToolbar2QT on dark-themes -* :ghpull:`14786`: Deprecate axis_artist.BezierPath. -* :ghpull:`14750`: Misc. simplifications. -* :ghpull:`14807`: API change note on automatic blitting detection for backends -* :ghpull:`11004`: Deprecate smart_bounds handling in Axis and Spine -* :ghpull:`14785`: Kill some never-used attributes. -* :ghpull:`14723`: Cleanup some parameter descriptions in matplotlibrc.template -* :ghpull:`14808`: Small docstring updates -* :ghpull:`14686`: Inset orientation -* :ghpull:`14805`: Simplify text_layout example. -* :ghpull:`12052`: Make AxesImage.contains account for transforms -* :ghpull:`11860`: Let MovieFileWriter save temp files in a new dir -* :ghpull:`11423`: FigureCanvas Designer -* :ghpull:`10688`: Add legend handler and artist for FancyArrow -* :ghpull:`8321`: Added ContourSet clip_path kwarg and set_clip_path() method (#2369) -* :ghpull:`14641`: Simplify _process_plot_var_args. -* :ghpull:`14631`: Refactor from_levels_and_colors. -* :ghpull:`14790`: DOC:Add link to style examples in matplotlib.style documentation -* :ghpull:`14799`: Deprecate dates.mx2num. -* :ghpull:`14793`: Remove sudo tag in travis -* :ghpull:`14795`: Autodetect whether a canvas class supports blitting. -* :ghpull:`14794`: DOC: Update the documetation of homepage of website -* :ghpull:`14629`: Delete HTML build sources to save on artefact upload time -* :ghpull:`14792`: Fix spelling typos -* :ghpull:`14789`: Prefer Affine2D.translate to offset_transform in examples. -* :ghpull:`14783`: Cleanup mlab.detrend. -* :ghpull:`14791`: Make 'extended' and 'expanded' synonymous in font_manager -* :ghpull:`14787`: Remove axis_artist _update, which is always a noop. -* :ghpull:`14758`: Compiling C-ext with incorrect FreeType libs makes future compiles break -* :ghpull:`14763`: Deprecate math_symbol_table function directive -* :ghpull:`14762`: Decrease uses of get_canvas_width_height. -* :ghpull:`14748`: Cleanup demo_text_path. -* :ghpull:`14740`: Remove sudo tag in travis -* :ghpull:`14737`: Cleanup twin axes docstrings. -* :ghpull:`14729`: Small simplifications. -* :ghpull:`14726`: Trivial simplification to Axis3d._get_coord_info. -* :ghpull:`14718`: Add explanations for single character color names. -* :ghpull:`14710`: Pin pydocstyle<4.0 -* :ghpull:`14709`: Try to improve the readability and styling of matplotlibrc.template file -* :ghpull:`14278`: Inset axes bug and docs fix -* :ghpull:`14478`: MNT: protect from out-of-bounds data access at the c level -* :ghpull:`14569`: More deduplication of backend_tools. -* :ghpull:`14652`: Soft-deprecate transform_point. -* :ghpull:`14664`: Improve error reporting for scatter c as invalid RGBA. -* :ghpull:`14625`: Don't double-wrap in silent_list. -* :ghpull:`14689`: Update embedding_in_wx4 example. -* :ghpull:`14679`: Further simplify colormap reversal. -* :ghpull:`14667`: Move most of pytest's conf to conftest.py. -* :ghpull:`14632`: Remove reference to old Tk/Windows bug. -* :ghpull:`14673`: More shortening of setup.py prints. -* :ghpull:`14678`: Fix small typo -* :ghpull:`14680`: Format parameters in descriptions with emph instead of backticks -* :ghpull:`14674`: Simplify colormap reversal. -* :ghpull:`14672`: Artist tutorial fixes -* :ghpull:`14653`: Remove some unnecessary prints from setup.py. -* :ghpull:`14662`: Add a _check_getitem helper to go with _check_in_list/_check_isinstance. -* :ghpull:`14666`: Update IPython's doc link in Image tutorial -* :ghpull:`14671`: Improve readability of matplotlibrc.template -* :ghpull:`14665`: Fix a typo in pyplot tutorial -* :ghpull:`14616`: Use builtin round instead of np.round for scalars. -* :ghpull:`12554`: backend_template docs and fixes -* :ghpull:`14635`: Fix bug when setting negative limits and using log scale -* :ghpull:`14604`: Update hist() docstring following removal of normed kwarg. -* :ghpull:`14630`: Remove the private Tick._name attribute. -* :ghpull:`14555`: Coding guidelines concerning the API -* :ghpull:`14516`: Document and test _get_packed_offsets() -* :ghpull:`14628`: matplotlib > Matplotlib in devel docs -* :ghpull:`14627`: gitignore pip-wheel-metadta/ directory -* :ghpull:`14612`: Update some mplot3d docs. -* :ghpull:`14617`: Remove a Py2.4(!) backcompat fix. -* :ghpull:`14605`: Update hist2d() docstring. -* :ghpull:`13084`: When linking against libpng/zlib on Windows, use upstream lib names. -* :ghpull:`13685`: Remove What's new fancy example -* :ghpull:`14573`: Cleanup jpl_units. -* :ghpull:`14583`: Fix overly long lines in setupext. -* :ghpull:`14588`: Remove [status] suppress from setup.cfg. -* :ghpull:`14591`: Style fixes for secondary_axis. -* :ghpull:`14594`: DOC: Make temperature scale example use a closure for easier reusability -* :ghpull:`14447`: FIX: allow secondary axes minor locators to be set -* :ghpull:`14567`: Fix unicode_minus + usetex. -* :ghpull:`14351`: Remove some redundant check_in_list calls. -* :ghpull:`14550`: Restore thumbnail of usage guide -* :ghpull:`10222`: Use symlinks instead of copies for test result_images. -* :ghpull:`14267`: cbook docs cleanup -* :ghpull:`14556`: Improve @deprecated's docstring. -* :ghpull:`14557`: Clarify how to work with threads. -* :ghpull:`14545`: In contributing.rst, encourage kwonly args and minimizing public APIs. -* :ghpull:`14533`: Misc. style fixes. -* :ghpull:`14542`: Move plot_directive doc to main API index. -* :ghpull:`14499`: Improve custom figure example -* :ghpull:`14543`: Remove the "Developing a new backend" section from contributing guide. -* :ghpull:`14540`: Simplify backend switching in plot_directive. -* :ghpull:`14539`: Don't overindent enumerated list in plot_directive docstring. -* :ghpull:`14537`: Slightly tighten the Bbox API. -* :ghpull:`14223`: Rewrite intro to usage guide. -* :ghpull:`14495`: Numpydocify axes_artist.py -* :ghpull:`14529`: mpl_toolkits style fixes. -* :ghpull:`14528`: mathtext style fixes. -* :ghpull:`13536`: Make unit converters also handle instances of subclasses. -* :ghpull:`13730`: Include FreeType error codes in FreeType exception messages. -* :ghpull:`14500`: Fix pydocstyle D403 (First word of the first line should be properly capitalized) in examples -* :ghpull:`14506`: Simplify Qt tests. -* :ghpull:`14513`: More fixes to pydocstyle D403 (First word capitalization) -* :ghpull:`14496`: Fix pydocstyle D208 (Docstring is over-indented) -* :ghpull:`14347`: Deprecate rcsetup.validate_path_exists. -* :ghpull:`14383`: Remove the ````package_data.dlls```` setup.cfg entry. -* :ghpull:`14346`: Simplify various validators in rcsetup. -* :ghpull:`14366`: Move test_rcparams test files inline into test_rcparams.py. -* :ghpull:`14401`: Assume that mpl-data is in its standard location. -* :ghpull:`14454`: Simplify implementation of svg.image_inline. -* :ghpull:`14470`: Add _check_isinstance helper. -* :ghpull:`14479`: fstringify backend_ps more. -* :ghpull:`14484`: Support unicode minus with ps.useafm. -* :ghpull:`14494`: Style fixes. -* :ghpull:`14465`: Docstrings cleanups. -* :ghpull:`14466`: Let SecondaryAxis inherit get_tightbbox from _AxesBase. -* :ghpull:`13940`: Some more f-strings. -* :ghpull:`14379`: Remove unnecessary uses of unittest.mock. -* :ghpull:`14483`: Improve font weight guessing. -* :ghpull:`14419`: Fix test_imshow_pil on Windows. -* :ghpull:`14460`: canvas.blit() already defaults to blitting the full figure canvas. -* :ghpull:`14462`: Register timeout pytest marker. -* :ghpull:`14414`: FEATURE: Alpha channel in Gouraud triangles in the pdf backend -* :ghpull:`13659`: Clarify behavior of the 'tight' kwarg to autoscale/autoscale_view. -* :ghpull:`13901`: Only test png output for mplot3d. -* :ghpull:`13338`: Replace list.extend by star-expansion or other constructs. -* :ghpull:`14448`: Misc doc style cleanup -* :ghpull:`14310`: Update to Bounding Box for Qt5 FigureCanvasATAgg.paintEvent() -* :ghpull:`14380`: Inline $MPLLOCALFREETYPE/$PYTEST_ADDOPTS/$NPROC in .travis.yml. -* :ghpull:`14413`: MAINT: small improvements to the pdf backend -* :ghpull:`14452`: MAINT: Minor cleanup to make functions more self consisntent -* :ghpull:`14441`: Misc. docstring cleanups. -* :ghpull:`14440`: Interpolations example -* :ghpull:`14402`: Prefer ``mpl.get_data_path()``, and support Paths in FontProperties. -* :ghpull:`14420`: MAINT: Upgrade pytest again -* :ghpull:`14423`: Fix docstring of subplots(). -* :ghpull:`14410`: Use aspect=1, not aspect=True. -* :ghpull:`14412`: MAINT: Don't install pytest 4.6.0 on Travis -* :ghpull:`14377`: Rewrite assert np.* tests to use numpy.testing -* :ghpull:`14399`: Improve warning for case where data kwarg entry is ambiguous. -* :ghpull:`14390`: Cleanup docs of bezier -* :ghpull:`14400`: Fix to_rgba_array() for empty input -* :ghpull:`14308`: Small clean to SymmetricalLogLocator -* :ghpull:`14311`: travis: add c code coverage measurements -* :ghpull:`14393`: Remove remaining unicode-strings markers. -* :ghpull:`14391`: Remove explicit inheritance from object -* :ghpull:`14343`: acquiring and releaseing keypresslock when textbox is being activated -* :ghpull:`14353`: Register flaky pytest marker. -* :ghpull:`14373`: Properly hide __has_include to support C++<17 compilers. -* :ghpull:`14378`: Remove setup_method -* :ghpull:`14368`: Finish removing jquery from the repo. -* :ghpull:`14360`: Deprecate ``boxplot(..., whis="range")``. -* :ghpull:`14376`: Simplify removal of figure patch from bbox calculations. -* :ghpull:`14363`: Make is_natively_supported private. -* :ghpull:`14330`: Remove remaining unittest.TestCase uses -* :ghpull:`13663`: Kill the PkgConfig singleton in setupext. -* :ghpull:`13067`: Simplify generation of error messages for missing libpng/freetype. -* :ghpull:`14358`: DOC boxplot ``whis`` parameter -* :ghpull:`14014`: Disallow figure argument for pyplot.subplot() and Figure.add_subplot() -* :ghpull:`14350`: Use cbook._check_in_list more often. -* :ghpull:`14348`: Cleanup markers.py. -* :ghpull:`14345`: Use importorskip for tests depending on pytz. -* :ghpull:`14170`: In setup.py, inline the packages that need to be installed into setup(). -* :ghpull:`14332`: Use raw docstrings instead of escaping backslashes -* :ghpull:`14336`: Enforce pydocstyle D412 -* :ghpull:`14144`: Deprecate the 'warn' parameter to matplotlib.use(). -* :ghpull:`14328`: Remove explicit inheritance from object -* :ghpull:`14035`: Improve properties formatting in interpolated docstrings. -* :ghpull:`14018`: pep8ing. -* :ghpull:`13542`: Move {setup,install}_requires from setupext.py to setup.py. -* :ghpull:`13670`: Simplify the logic of axis(). -* :ghpull:`14046`: Deprecate checkdep_ps_distiller. -* :ghpull:`14236`: Simplify StixFonts.get_sized_alternatives_for_symbol. -* :ghpull:`14101`: Shorten _ImageBase._make_image. -* :ghpull:`14246`: Deprecate public use of makeMappingArray -* :ghpull:`13740`: Deprecate plotfile. -* :ghpull:`14216`: Walk the artist tree when preparing for saving with tight bbox. -* :ghpull:`14305`: Small grammatical error. -* :ghpull:`14104`: Factor out retrieval of data relative to datapath -* :ghpull:`14016`: pep8ify backends. -* :ghpull:`14299`: Fix #13711 by importing cbook. -* :ghpull:`14244`: Remove APIs deprecated in mpl3.0. -* :ghpull:`14068`: Alternative fix for passing iterator as frames to FuncAnimation -* :ghpull:`13711`: Deprecate NavigationToolbar2Tk.set_active. -* :ghpull:`14280`: Simplify validate_markevery logic. -* :ghpull:`14273`: pep8ify a couple of variable names. -* :ghpull:`14115`: Reorganize scatter arguments parsing. -* :ghpull:`14271`: Replace some uses of np.iterable -* :ghpull:`14257`: Changing cmap(np.nan) to 'bad' value rather than 'under' value -* :ghpull:`14259`: Deprecate string as color sequence -* :ghpull:`13506`: Change colorbar for contour to have the proper axes limits... -* :ghpull:`13494`: Add colorbar annotation example plot to gallery -* :ghpull:`14266`: Make matplotlib.figure.AxesStack private -* :ghpull:`14166`: Shorten usage of ``@image_comparison``. -* :ghpull:`14240`: Merge up 31x -* :ghpull:`14242`: Avoid a buffer copy in PillowWriter. -* :ghpull:`9672`: Only set the wait cursor if the last draw was >1s ago. -* :ghpull:`14224`: Update plt.show() doc -* :ghpull:`14218`: Use stdlib mimetypes instead of hardcoding them. -* :ghpull:`14082`: In tk backend, don't try to update mouse position after resize. -* :ghpull:`14084`: Check number of positional arguments passed to quiver() -* :ghpull:`14214`: Fix some docstring style issues. -* :ghpull:`14201`: Fix E124 flake8 violations (closing bracket indentation). -* :ghpull:`14096`: Consistently use axs to refer to a set of Axes -* :ghpull:`14204`: Fix various flake8 indent problems. -* :ghpull:`14205`: Obey flake8 "don't assign a lambda, use a def". -* :ghpull:`14198`: Remove unused imports -* :ghpull:`14173`: Prepare to change the default pad for AxesDivider.append_axes. -* :ghpull:`13738`: Fix TypeError when plotting stacked bar chart with decimal -* :ghpull:`14151`: Clarify error with usetex when cm-super is not installed. -* :ghpull:`14107`: Feature: draw percentiles in violinplot -* :ghpull:`14172`: Remove check_requirements from setupext. -* :ghpull:`14158`: Fix test_lazy_imports in presence of $MPLBACKEND or matplotlibrc. -* :ghpull:`14157`: Isolate nbagg test from user ipython profile. -* :ghpull:`14147`: Dedent overindented list in example docstring. -* :ghpull:`14134`: Deprecate the dryrun parameter to print_foo(). -* :ghpull:`14145`: Remove warnings handling for fixed bugs. -* :ghpull:`13977`: Always import pyplot when calling matplotlib.use(). -* :ghpull:`14131`: Make test suite fail on warnings. -* :ghpull:`13593`: Only autoscale_view() when needed, not after every plotting call. -* :ghpull:`13902`: Add support for metadata= and pil_kwargs= in imsave(). -* :ghpull:`14140`: Avoid backslash-quote by changing surrounding quotes. -* :ghpull:`14132`: Move some toplevel strings into the only functions that use them. -* :ghpull:`13708`: Annotation.contains shouldn't consider the text+arrow's joint bbox. -* :ghpull:`13980`: Don't let margins expand polar plots to negative radii by default. -* :ghpull:`14075`: Remove uninformative entries from glossary. -* :ghpull:`14002`: Allow pandas DataFrames through norms -* :ghpull:`14114`: Allow SVG Text-as-Text to Use Data Coordinates -* :ghpull:`14120`: Remove mention of $QT_API in matplotlibrc example. -* :ghpull:`13878`: Style fixes for floating_axes. -* :ghpull:`14108`: Deprecate FigureCanvasMac.invalidate in favor of draw_idle. -* :ghpull:`13879`: Clarify handling of "extreme" values in FloatingAxisArtistHelper. -* :ghpull:`5602`: Automatic downsampling of images. -* :ghpull:`14112`: Remove old code path in layout.html -* :ghpull:`13959`: Scatter: make "c" and "s" argument handling more consistent. -* :ghpull:`14110`: Simplify scatter_piecharts example. -* :ghpull:`14111`: Trivial cleanups. -* :ghpull:`14085`: Simplify get_current_fig_manager(). -* :ghpull:`14083`: Deprecate FigureCanvasBase.draw_cursor. -* :ghpull:`14089`: Cleanup bar_stacked, bar_unit_demo examples. -* :ghpull:`14063`: Add pydocstyle checks to flake8 -* :ghpull:`14077`: Fix tick label wobbling in animated Qt example -* :ghpull:`14070`: Cleanup some pyplot docstrings. -* :ghpull:`6280`: Added ability to offset errorbars when using errorevery. -* :ghpull:`13679`: Fix passing iterator as frames to FuncAnimation -* :ghpull:`14023`: Improve Unicode minus example -* :ghpull:`14041`: Pretty-format subprocess logs. -* :ghpull:`14038`: Cleanup path.py docstrings. -* :ghpull:`13701`: Small cleanups. -* :ghpull:`14020`: Better error message when trying to use Gtk3Agg backend without cairo -* :ghpull:`14021`: Fix ax.legend Returns markup -* :ghpull:`13986`: Support RGBA for quadmesh mode of pcolorfast. -* :ghpull:`14009`: Deprecate compare_versions. -* :ghpull:`14010`: Deprecate get_home() -* :ghpull:`13932`: Remove many unused variables. -* :ghpull:`13854`: Cleanup contour.py. -* :ghpull:`13866`: Switch PyArg_ParseTupleAndKeywords from "es" to "s". -* :ghpull:`13945`: Make unicode_minus example more focused. -* :ghpull:`13876`: Deprecate factor=None in axisartist. -* :ghpull:`13929`: Better handle deprecated rcParams. -* :ghpull:`13851`: Deprecate setting Axis.major.locator to non-Locator; idem for Formatters -* :ghpull:`13938`: numpydocify quiverkey. -* :ghpull:`13936`: Pathlibify animation. -* :ghpull:`13984`: Allow setting tick colour on 3D axes -* :ghpull:`13987`: Deprecate mlab.{apply_window,stride_repeat}. -* :ghpull:`13983`: Fix locator/formatter setting when removing shared Axes -* :ghpull:`13957`: Remove many unused variables in tests. -* :ghpull:`13981`: Test cleanups. -* :ghpull:`13970`: Check vmin/vmax are valid when doing inverse in LogNorm -* :ghpull:`13978`: Make normalize_kwargs more convenient for third-party use. -* :ghpull:`13972`: Remove _process_plot_var_args.set{line,patch}_props. -* :ghpull:`13795`: Make _warn_external correctly report warnings arising from tests. -* :ghpull:`13885`: Deprecate axisartist.grid_finder.GridFinderBase. -* :ghpull:`13913`: Fix string numbers in to_rgba() and is_color_like() -* :ghpull:`13935`: Deprecate the useless switch_backend_warn parameter to matplotlib.test. -* :ghpull:`13952`: Cleanup animation tests. -* :ghpull:`13942`: Make Cursors an (Int)Enum. -* :ghpull:`13953`: Unxfail a now fixed test in test_category. -* :ghpull:`13925`: Fix passing Path to ps backend when text.usetex rc is True. -* :ghpull:`13943`: Don't crash on str(figimage(...)). -* :ghpull:`13944`: Document how to support unicode minus in pgf backend. -* :ghpull:`13802`: New rcparam to set default axes title location -* :ghpull:`13855`: ``a and b or c`` -> ``b if a else c`` -* :ghpull:`13923`: Correctly handle invalid PNG metadata. -* :ghpull:`13926`: Suppress warnings in tests. -* :ghpull:`13920`: Style fixes for category.py. -* :ghpull:`13889`: Shorten docstrings by removing unneeded :class:/:func: + rewordings. -* :ghpull:`13911`: Fix joinstyles example -* :ghpull:`13917`: Faster categorical tick formatter. -* :ghpull:`13918`: Make matplotlib.testing assume pytest by default, not nose. -* :ghpull:`13894`: Check for positive number of rows and cols -* :ghpull:`13895`: Remove unused setupext.is_min_version. -* :ghpull:`13886`: Shorten Figure.set_size_inches. -* :ghpull:`13859`: Ensure figsize is positive finite -* :ghpull:`13877`: ``zeros_like(x) + y`` -> ``full_like(x, y)`` -* :ghpull:`13875`: Style fixes for grid_helper_curvelinear. -* :ghpull:`13873`: Style fixes to grid_finder. -* :ghpull:`13782`: Don't access internet during tests. -* :ghpull:`13833`: Some more usage of _check_in_list. -* :ghpull:`13834`: Cleanup FancyArrowPatch docstring -* :ghpull:`13811`: Generate Figure method wrappers via boilerplate.py -* :ghpull:`13797`: Move sphinxext test to matplotlib.tests like everyone else. -* :ghpull:`13770`: broken_barh docstring -* :ghpull:`13757`: Remove mention of "enabling fontconfig support". -* :ghpull:`13454`: Add "c" as alias for "color" for Collections -* :ghpull:`13756`: Reorder the logic of _update_title_position. -* :ghpull:`13744`: Restructure boilerplate.py -* :ghpull:`13369`: Use default colours for examples -* :ghpull:`13697`: Delete pyplot_scales example. -* :ghpull:`13726`: Clarify a bit the implementation of blend_hsv. -* :ghpull:`13731`: Check for already running QApplication in Qt embedding example. -* :ghpull:`13736`: Deduplicate docstrings and validation for set_alpha. -* :ghpull:`13737`: Remove duplicated methods in FixedAxisArtistHelper. -* :ghpull:`13721`: Kill pyplot docstrings that get overwritten by @docstring.copy. -* :ghpull:`13690`: Cleanup hexbin. -* :ghpull:`13683`: Remove axes border for examples that list styles -* :ghpull:`13280`: Add SubplotSpec.add_subplot. -* :ghpull:`11387`: Deprecate Axes3D.w_{x,y,z}axis in favor of .{x,y,z}axis. -* :ghpull:`13671`: Suppress some warnings in tests. -* :ghpull:`13657`: DOC: fail the doc build on errors, but keep going to end -* :ghpull:`13647`: Fix FancyArrowPatch joinstyle -* :ghpull:`13637`: BLD: parameterize python_requires -* :ghpull:`13633`: plot_directive: Avoid warning if plot_formats doesn't contain 'png' -* :ghpull:`13629`: Small example simplification. -* :ghpull:`13620`: Improve watermark example -* :ghpull:`13589`: Kill Axes._connected. -* :ghpull:`13428`: free cart pendulum animation example -* :ghpull:`10487`: fixed transparency bug -* :ghpull:`13551`: Fix IndexError for pyplot.legend() when plotting empty bar chart with label -* :ghpull:`13524`: Cleanup docs for GraphicsContextBase.{get,set}_dashes. -* :ghpull:`13556`: Cleanup warnings handling in tests. -* :ghpull:`8100`: Deprecate MAXTICKS, Locator.raise_if_exceeds. -* :ghpull:`13534`: More followup to autoregistering 3d axes. -* :ghpull:`13327`: pcolorfast simplifications. -* :ghpull:`13532`: More use of cbook._check_in_list. -* :ghpull:`13520`: Register 3d projection by default. -* :ghpull:`13394`: Deduplicate some code between floating_axes and grid_helper_curvelinear. -* :ghpull:`13527`: Make SubplotSpec.num2 never None. -* :ghpull:`12249`: Replaced noqa-comments by using Axes3D.name instead of '3d' for proje… - -Issues (125): - -* :ghissue:`16487`: Add link to blog to front page -* :ghissue:`16478`: The bottom parameter of plt.hist() shifts the data as well, not just the baseline -* :ghissue:`16280`: SymLogNorm colorbar incorrect on master -* :ghissue:`16448`: Bad interaction between shared axes and pcolormesh sticky edges -* :ghissue:`16451`: InvertedLogTransform inherits from deprecated base -* :ghissue:`16420`: Error when adding colorbar to pcolormesh of a boolean array -* :ghissue:`16114`: Prose error on website (first paragraph) -* :ghissue:`8291`: Unable to pickle.load(fig) with mpl in jupyter notebook -* :ghissue:`16173`: Constrained_layout creates extra axes when used with subgridspec -* :ghissue:`16127`: nbformat 5.0.0 missing schema files -* :ghissue:`15849`: Using pandas.Timestamp in blended coordinate system of ax.annotate. -* :ghissue:`6015`: scatterplot axis autoscale fails for small data values -* :ghissue:`15806`: 3.2.0 may break some Cartopy tests -* :ghissue:`15852`: Lasso selector does not show in Jupyter notebook -* :ghissue:`15820`: Show incomplete tick labels when using mixed chinese and english characters -* :ghissue:`15770`: DOCS 2D Line label option ``_nolegend_`` is not documented -* :ghissue:`15332`: Type promotion error with datetime bins in hist -* :ghissue:`15611`: BUG: Qt5Agg window size regression -* :ghissue:`7130`: Incorrect autoscaling of polar plot limits after scatter -* :ghissue:`15576`: Multi-line ticks cause cut-offs -* :ghissue:`8609`: Clipped tick labels -* :ghissue:`15517`: antialiased image check seems wrong when used on zoomed image -* :ghissue:`13400`: Qt Embedding w/ Spyder -* :ghissue:`14724`: drawstyle parameter of line needs example -* :ghissue:`13619`: Importing matplotlib.animation prevents python script from executing in the background -* :ghissue:`14270`: Secondary axis called with [0, 1] might produce exceptions in case these are invalid data -* :ghissue:`15417`: Why is smart_bounds() being deprecated? -* :ghissue:`9778`: Blanks in colorbar just inside of 'extend' arrowpoints when using AxesGrid -* :ghissue:`15336`: DivergingNorm is a misleading name -* :ghissue:`15399`: OSError: [Errno 86] Bad CPU type in executable: 'convert' on import matplotlib.animation -* :ghissue:`15109`: matplotlib.collections inheritance diagram small/blurry -* :ghissue:`15331`: Log Scale: FloatingPointError: underflow encountered in power -* :ghissue:`15251`: Large memory growth with log scaling and linear ticking -* :ghissue:`15247`: Colorbar tick placement issues with ImageGrid and LogNorm -* :ghissue:`15306`: Footer off centre -* :ghissue:`13485`: Matplotlib NavigationToolbar2Tk disappears when reducing window size -* :ghissue:`15232`: DOC: Automatic default rcParam expansion creates misleading sentences -* :ghissue:`14141`: setting spine position on a log plot fails -* :ghissue:`15138`: Make plt.style.use accept path-like objects in addition to string -* :ghissue:`14207`: Check if point is in path or not by contains_point -* :ghissue:`13591`: Style issues when building the docs with (future) Sphinx 2.0 -* :ghissue:`8089`: Using Minute Locator to set x-axis ticks exceeds Locator.MAXTICKS -* :ghissue:`15075`: sphinxext.missing_references does not specify if it supports parallel file read. -* :ghissue:`10963`: Replace \pgfimage by \includegraphics in PGF backend -* :ghissue:`15156`: ax.text fails with positional argument error -* :ghissue:`14439`: hist() fails when all data points are np.nan -* :ghissue:`15042`: How to handle sphinx nitpicky mode -* :ghissue:`14060`: quiver(C=...) argument is not reasonably validated -* :ghissue:`11335`: TST: testing not catching bad escape sequences in doc strings -* :ghissue:`15040`: Wrong figure window size after calling fig.set_size_inches() repeatedly -* :ghissue:`15100`: Issue with creating QApplication in QT backend -* :ghissue:`14887`: kerning seems generally wrong -* :ghissue:`14800`: default tick formatter could switch to scientific notation earlier -* :ghissue:`14503`: Add a test for #14451 -* :ghissue:`14907`: ConnectionPatch across axes needs to be excluded from layout management -* :ghissue:`14911`: Removing a shared axes via ``ax.remove()`` leads to an error. -* :ghissue:`12462`: cbar.add_lines should allow manually adding lines, not just contour sets -* :ghissue:`14796`: Show user how to use Agg buffer in example -* :ghissue:`14883`: MinSize not respected using wx backend causes wxAssertionError. Bug fix included. -* :ghissue:`15014`: Wrapping of text adds leading newline character if first word is long -* :ghissue:`14918`: constrained_layout fails with hidden axis... -* :ghissue:`14981`: Barplot call crashes when called with yscale="log" and bins with h=0 -* :ghissue:`4621`: Default bottom of Stepfilled histograms should be set according to ymin -* :ghissue:`15030`: Doc build broken -* :ghissue:`8093`: set_ylim not working with plt.axis('equal') -* :ghissue:`6055`: Serious problems on the axes documentation -* :ghissue:`9979`: Axis limits are set badly with small values in scatter(). -* :ghissue:`10842`: Text bbox empty dict should be ignored -* :ghissue:`13698`: The default logit minor locator should not display tick labels -* :ghissue:`14878`: plt.yscale doesn't throw warning with invalid kwarg -* :ghissue:`5619`: Symlog linear region -* :ghissue:`14564`: Broken string interpolation -* :ghissue:`13668`: Add better error message to plt.axis() -* :ghissue:`14563`: colorbar label prints "None" when label=None -* :ghissue:`13660`: Closing a matplotlib figure with event handling occasionally causes “TypeError: isinstance()” -* :ghissue:`13033`: 'NoneType' has no attribute '_alive' when using plt in a context manager -* :ghissue:`13891`: Blurry app icon on macOS -* :ghissue:`14656`: Axes title default color -* :ghissue:`14831`: DOC: Webpage not formated correctly on gallery docs -* :ghissue:`13819`: Aspect ratio for not so common scales -* :ghissue:`8878`: Setting aspect ratio for semi-log plots -* :ghissue:`4900`: UnboundLocalError: local variable 'aspect_scale_mode' referenced before assignment -* :ghissue:`14608`: Issue with using plt.axis('equal') with plt.polar(theta,r) plot -* :ghissue:`12893`: [PyQt] NavigationToolbar2QT : Error when removing tools -* :ghissue:`14670`: indicate_inset rectangles is sensitive to axis-flipping -* :ghissue:`14362`: Add link to style examples in matplotlib.style documentation -* :ghissue:`6295`: restore_region is not documented as a method of FigureCanvas -* :ghissue:`14754`: Better pointer to dev docs on website -* :ghissue:`14744`: Savefig svg fails with "Cannot cast array data from dtype('`__ + +The following 164 authors contributed 3455 commits. + +* Abhinav Sagar +* Abhinuv Nitin Pitale +* Adam Gomaa +* Akshay Nair +* Alex Rudy +* Alexander Rudy +* Antony Lee +* Ao Liu (frankliuao) +* Ardie Orden +* Ashley Whetter +* Ben Root +* Benjamin Bengfort +* Benjamin Congdon +* Bharat123rox +* Bingyao Liu +* Brigitta Sipocz +* Bruno Pagani +* brut +* Carsten +* Carsten Schelp +* chaoyi1 +* Cho Yin Yong +* Chris Barnes +* Christer Jensen +* Christian Brodbeck +* Christoph Pohl +* chuanzhu xu +* Colin +* Cong Ma +* dabana +* DanielMatu +* David Chudzicki +* David Stansby +* Deng Tian +* depano.carlos@gmail.com +* djdt +* donchanee +* Dora Fraeman Caswell +* Elan Ernest +* Elliott Sales de Andrade +* Emlyn Price +* Eric Firing +* Eric Wieser +* Federico Ariza +* Filipe Fernandes +* fourpoints +* fredrik-1 +* Gazing +* Greg Lucas +* hannah +* Harshal Prakash Patankar +* Ian Hincks +* Ian Thomas +* ilopata1 +* ImportanceOfBeingErnest +* Jacobson Okoro +* James A. Bednar +* Jarrod Millman +* Javad +* jb-leger +* Jean-Benoist Leger +* jfbu +* joaonsg +* Jody Klymak +* Joel Frederico +* Johannes H. Jensen +* Johnny Gill +* Jonas Camillus Jeppesen +* Jorge Moraleda +* Joscha Reimer +* Joseph Albert +* Jouni K. Seppänen +* Joy Bhalla +* Juanjo Bazán +* Julian Mehne +* kolibril13 +* krishna katyal +* ksunden +* Kyle Sunden +* Larry Bradley +* lepuchi +* luftek +* Maciej Dems +* Maik Riechert +* Marat K +* Mark Wolf +* Mark Wolfman +* Matte +* Matthias Bussonnier +* Matthias Geier +* MatthieuDartiailh +* Max Chen +* Max Humber +* Max Shinn +* MeeseeksMachine +* Michael Droettboom +* Mingkai Dong +* MinRK +* miquelastein +* Molly Rossow +* Nathan Goldbaum +* nathan78906 +* Nelle Varoquaux +* Nick White +* Nicolas Courtemanche +* Nikita Kniazev +* njwhite +* O. Castany +* Oliver Natt +* Olivier +* Om Sitapara +* omsitapara23 +* Oriol (Prodesk) +* Oriol Abril +* Patrick Feiring +* Patrick Shriwise +* PatrickFeiring +* Paul +* Paul Hobson +* Paul Hoffman +* Paul Ivanov +* Peter Schutt +* pharshalp +* Phil Elson +* Philippe Pinard +* Rebecca W Perry +* ResidentMario +* Richard Ji-Cathriner +* RoryIAngus +* Ryan May +* S. Fukuda +* Samesh +* Samesh Lakhotia +* sasoripathos +* SBCV +* Sebastian Bullinger +* Sergey Royz +* Siddhesh Poyarekar +* Simon Legner +* SojiroFukuda +* Steve Dower +* Taras +* Ted Drain +* teddyrendahl +* Thomas A Caswell +* Thomas Hisch +* Thomas Robitaille +* Till Hoffmann +* tillahoffmann +* Tim Hoffmann +* Tom Flannaghan +* Travis CI +* V. Armando Solé +* Vincent L.M. Mazoyer +* Viraj Mohile +* Wafa Soofi +* Warren Weckesser +* y1thof +* yeo +* Yong Cho Yin +* Yuya +* Zhili (Jerry) Pan +* zhoubecky +* Zulko + +GitHub issues and pull requests: + +Pull Requests (839): + +* :ghpull:`16626`: Updated Readme + Setup.py for PyPa +* :ghpull:`16627`: ci: Restore nuget install step on Azure for v3.2.x. +* :ghpull:`16625`: v3.2.x: Make Azure use local FreeType. +* :ghpull:`16622`: Backport PR #16613 on branch v3.2.x (Fix edge-case in preprocess_data, if label_namer is optional and unset.) +* :ghpull:`16613`: Fix edge-case in preprocess_data, if label_namer is optional and unset. +* :ghpull:`16612`: Backport PR #16605: CI: tweak the vm images we use on azure +* :ghpull:`16611`: Backport PR #16585 on branch v3.2.x (Fix _preprocess_data for Py3.9.) +* :ghpull:`16605`: CI: tweak the vm images we use on azure +* :ghpull:`16585`: Fix _preprocess_data for Py3.9. +* :ghpull:`16541`: Merge pull request #16404 from jklymak/fix-add-base-symlognorm +* :ghpull:`16542`: Backport PR #16006: Ignore pos in StrCategoryFormatter.__call__ to di… +* :ghpull:`16543`: Backport PR #16532: Document default value of save_count parameter in… +* :ghpull:`16532`: Document default value of save_count parameter in FuncAnimation +* :ghpull:`16526`: Backport PR #16480 on v.3.2.x: Re-phrase doc for bottom kwarg to hist +* :ghpull:`16404`: FIX: add base kwarg to symlognor +* :ghpull:`16518`: Backport PR #16502 on branch v3.2.x (Document theta getters/setters) +* :ghpull:`16519`: Backport PR #16513 on branch v3.2.x (Add more FreeType tarball hashes.) +* :ghpull:`16513`: Add more FreeType tarball hashes. +* :ghpull:`16502`: Document theta getters/setters +* :ghpull:`16506`: Backport PR #16505 on branch v3.2.x (Add link to blog to front page) +* :ghpull:`16505`: Add link to blog to front page +* :ghpull:`16480`: Re-phrase doc for bottom kwarg to hist +* :ghpull:`16494`: Backport PR #16490 on branch v3.2.x (Fix some typos on the front page) +* :ghpull:`16489`: Backport PR #16272 on branch v3.2.x (Move mplot3d autoregistration api changes to 3.2.) +* :ghpull:`16490`: Fix some typos on the front page +* :ghpull:`16465`: Backport PR #16450 on branch v3.2.x (Fix interaction between sticky_edges and shared axes.) +* :ghpull:`16466`: Backport PR #16392: FIX colorbars for Norms that do not have a scale. +* :ghpull:`16392`: FIX colorbars for Norms that do not have a scale. +* :ghpull:`16450`: Fix interaction between sticky_edges and shared axes. +* :ghpull:`16453`: Backport PR #16452 on branch v3.2.x (Don't make InvertedLogTransform inherit from deprecated base class.) +* :ghpull:`16452`: Don't make InvertedLogTransform inherit from deprecated base class. +* :ghpull:`16436`: Backport PR #16435 on branch v3.2.x (Reword intro to colors api docs.) +* :ghpull:`16435`: Reword intro to colors api docs. +* :ghpull:`16399`: Backport PR #16396 on branch v3.2.x (font_manager docs cleanup.) +* :ghpull:`16396`: font_manager docs cleanup. +* :ghpull:`16397`: Backport PR #16394 on branch v3.2.x (Mark inkscape 1.0 as unsupported (at least for now).) +* :ghpull:`16394`: Mark inkscape 1.0 as unsupported (at least for now). +* :ghpull:`16286`: Fix cbars for different norms +* :ghpull:`16385`: Backport PR #16226 on branch v3.2.x: Reorganize intro section on main page +* :ghpull:`16383`: Backport PR #16379 on branch v3.2.x (FIX: catch on message content, not module) +* :ghpull:`16226`: Reorganize intro section on main page +* :ghpull:`16364`: Backport PR #16344 on branch v3.2.x (Cast vmin/vmax to floats before nonsingular-expanding them.) +* :ghpull:`16344`: Cast vmin/vmax to floats before nonsingular-expanding them. +* :ghpull:`16360`: Backport PR #16347 on branch v3.2.x (FIX: catch warnings from pandas in cbook._check_1d) +* :ghpull:`16357`: Backport PR #16330 on branch v3.2.x (Clearer signal handling) +* :ghpull:`16349`: Backport PR #16255 on branch v3.2.x (Move version info to sidebar) +* :ghpull:`16346`: Backport PR #16298 on branch v3.2.x (Don't recursively call draw_idle when updating artists at draw time.) +* :ghpull:`16331`: Backport PR #16308 on branch v3.2.x (CI: Use Ubuntu Bionic compatible package names) +* :ghpull:`16332`: Backport PR #16308 on v3.2.x: CI: Use Ubuntu Bionic compatible package names +* :ghpull:`16324`: Backport PR #16323 on branch v3.2.x (Add sphinx doc for Axis.axis_name.) +* :ghpull:`16325`: Backport PR #15462 on v3.2.x: Simplify azure setup. +* :ghpull:`16323`: Add sphinx doc for Axis.axis_name. +* :ghpull:`16321`: Backport PR #16311 on branch v3.2.x (don't override non-Python signal handlers) +* :ghpull:`16308`: CI: Use Ubuntu Bionic compatible package names +* :ghpull:`16306`: Backport PR #16300 on branch v3.2.x (Don't default to negative radii in polar plot.) +* :ghpull:`16305`: Backport PR #16250 on branch v3.2.x (Fix zerolen intersect) +* :ghpull:`16300`: Don't default to negative radii in polar plot. +* :ghpull:`16278`: Backport PR #16273 on branch v3.2.x (DOC: Changing the spelling of co-ordinates.) +* :ghpull:`16260`: Backport PR #16259 on branch v3.2.x (TST: something changed in pytest 5.3.3 that breaks our qt fixtures) +* :ghpull:`16259`: TST: something changed in pytest 5.3.3 that breaks our qt fixtures +* :ghpull:`16238`: Backport PR #16235 on branch v3.2.x (FIX: AttributeError in TimerBase.start) +* :ghpull:`16211`: DOC: ValidateInterval was deprecated in 3.2, not 3.1 +* :ghpull:`16224`: Backport PR #16223 on branch v3.2.x (Added DNA Features Viewer description + screenshot in docs/thirdparty/) +* :ghpull:`16223`: Added DNA Features Viewer description + screenshot in docs/thirdparty/ +* :ghpull:`16222`: Backport PR #16212 on branch v3.2.x (Fix deprecation from #13544) +* :ghpull:`16212`: Fix deprecation from #13544 +* :ghpull:`16207`: Backport PR #16189 on branch v3.2.x (MNT: set default canvas when un-pickling) +* :ghpull:`16189`: MNT: set default canvas when un-pickling +* :ghpull:`16179`: Backport PR #16175: FIX: ignore axes that aren't visible +* :ghpull:`16175`: FIX: ignore axes that aren't visible +* :ghpull:`16168`: Backport PR #16166 on branch v3.2.x (Add badge for citing 3.1.2) +* :ghpull:`16148`: Backport PR #16128 on branch v3.2.x (CI: Do not use nbformat 5.0.0/5.0.1 for testing) +* :ghpull:`16145`: Backport PR #16053 on branch v3.2.x (Fix v_interval setter) +* :ghpull:`16128`: CI: Do not use nbformat 5.0.0/5.0.1 for testing +* :ghpull:`16135`: Backport PR #16112 on branch v3.2.x (CI: Fail when failed to install dependencies) +* :ghpull:`16132`: Backport PR #16126 on branch v3.2.x (TST: test_fork: Missing join) +* :ghpull:`16124`: Backport PR #16105 on branch v3.2.x (Fix legend dragging.) +* :ghpull:`16122`: Backport PR #16113 on branch v3.2.x (Renderer Graphviz inheritance diagrams as svg) +* :ghpull:`16105`: Fix legend dragging. +* :ghpull:`16113`: Renderer Graphviz inheritance diagrams as svg +* :ghpull:`16112`: CI: Fail when failed to install dependencies +* :ghpull:`16119`: Backport PR #16065 on branch v3.2.x (Nicer formatting of community aspects on front page) +* :ghpull:`16074`: Backport PR #16061 on branch v3.2.x (Fix deprecation message for axes_grid1.colorbar.) +* :ghpull:`16093`: Backport PR #16079 on branch v3.2.x (Fix restuctured text formatting) +* :ghpull:`16094`: Backport PR #16080 on branch v3.2.x (Cleanup docstrings in backend_bases.py) +* :ghpull:`16086`: FIX: use supported attribute to check pillow version +* :ghpull:`16084`: Backport PR #16077 on branch v3.2.x (Fix some typos) +* :ghpull:`16077`: Fix some typos +* :ghpull:`16079`: Fix restuctured text formatting +* :ghpull:`16080`: Cleanup docstrings in backend_bases.py +* :ghpull:`16061`: Fix deprecation message for axes_grid1.colorbar. +* :ghpull:`16006`: Ignore pos in StrCategoryFormatter.__call__ to display correct label in the preview window +* :ghpull:`16056`: Backport PR #15864 on branch v3.2.x ([Add the info of 'sviewgui' in thirdparty package]) +* :ghpull:`15864`: Add 'sviewgui' to list of thirdparty packages +* :ghpull:`16055`: Backport PR #16037 on branch v3.2.x (Doc: use empty ScalarMappable for colorbars with no associated image.) +* :ghpull:`16054`: Backport PR #16048 on branch v3.2.x (Document that colorbar() takes a label kwarg.) +* :ghpull:`16037`: Doc: use empty ScalarMappable for colorbars with no associated image. +* :ghpull:`16048`: Document that colorbar() takes a label kwarg. +* :ghpull:`16042`: Backport PR #16031 on branch v3.2.x (Fix docstring of hillshade().) +* :ghpull:`16033`: Backport PR #16028 on branch v3.2.x (Prevent FigureCanvasQT_draw_idle recursively calling itself.) +* :ghpull:`16021`: Backport PR #16007 on branch v3.2.x (Fix search on nested pages) +* :ghpull:`16019`: Backport PR #15735 on branch v3.2.x (Cleanup some mplot3d docstrings.) +* :ghpull:`15987`: Backport PR #15886 on branch v3.2.x (Fix Annotation using different units and different coords on x/y.) +* :ghpull:`15886`: Fix Annotation using different units and different coords on x/y. +* :ghpull:`15984`: Backport PR #15970 on branch v3.2.x (Process clip paths the same way as regular Paths.) +* :ghpull:`15970`: Process clip paths the same way as regular Paths. +* :ghpull:`15963`: Backport PR #15937 on branch v3.2.x (Don't hide exceptions in FontManager.addfont.) +* :ghpull:`15956`: Backport PR #15901 on branch v3.2.x (Update backend_nbagg for removal of Gcf._activeQue.) +* :ghpull:`15937`: Don't hide exceptions in FontManager.addfont. +* :ghpull:`15959`: Backport PR #15953 on branch v3.2.x (Update donation link) +* :ghpull:`15901`: Update backend_nbagg for removal of Gcf._activeQue. +* :ghpull:`15954`: Backport PR #15914 on branch v3.2.x (Example for sigmoid function with horizontal lines) +* :ghpull:`15914`: Example for sigmoid function with horizontal lines +* :ghpull:`15930`: Backport PR #15925 on branch v3.2.x (Optimize setting units to None when they're already None.) +* :ghpull:`15925`: Optimize setting units to None when they're already None. +* :ghpull:`15915`: Backport PR #15903 on branch v3.2.x (Correctly handle non-affine transData in Collection.get_datalim.) +* :ghpull:`15903`: Correctly handle non-affine transData in Collection.get_datalim. +* :ghpull:`15908`: Backport PR #15857 on branch v3.2.x (LassoSelection shouldn't useblit on canvas not supporting blitting.) +* :ghpull:`15857`: LassoSelection shouldn't useblit on canvas not supporting blitting. +* :ghpull:`15905`: Backport PR #15763 on branch v3.2.x (Skip webagg test if tornado is not available.) +* :ghpull:`15882`: Backport PR #15859 on branch v3.2.x (Doc: Move search field into nav bar) +* :ghpull:`15868`: Backport PR #15848 on branch v3.2.x: Cleanup environment variables FAQ +* :ghpull:`15872`: Backport PR #15869 on branch v3.2.x (Update markers docs.) +* :ghpull:`15869`: Update markers docs. +* :ghpull:`15867`: Backport PR #15789 on branch v3.2.x (Cleanup xticks/yticks docstrings.) +* :ghpull:`15870`: Backport PR #15865 on branch v3.2.x (Fix a typo) +* :ghpull:`15871`: Backport PR #15824 on branch v3.2.x (Document doc style for default values) +* :ghpull:`15824`: Document doc style for default values +* :ghpull:`15865`: Fix a typo +* :ghpull:`15789`: Cleanup xticks/yticks docstrings. +* :ghpull:`15862`: Backport PR #15851 on branch v3.2.x (ffmpeg is available on default ubuntu packages now) +* :ghpull:`15848`: Cleanup environment variables FAQ. +* :ghpull:`15844`: Backport PR #15841 on branch v3.2.x (DOC: specify the expected shape in the Collection.set_offset) +* :ghpull:`15841`: DOC: specify the expected shape in the Collection.set_offset +* :ghpull:`15837`: Backport PR #15799 on branch v3.2.x (Improve display of author names on PDF titlepage of matplotlib own docs) +* :ghpull:`15799`: Improve display of author names on PDF titlepage of matplotlib own docs +* :ghpull:`15831`: Backport PR #15829 on branch v3.2.x (In C extensions, use FutureWarning, not DeprecationWarning.) +* :ghpull:`15829`: In C extensions, use FutureWarning, not DeprecationWarning. +* :ghpull:`15818`: Backport PR #15619 on branch v3.2.x (Improve zorder demo) +* :ghpull:`15819`: Backport PR #15601 on branch v3.2.x (Fix FontProperties conversion to/from strings) +* :ghpull:`15601`: Fix FontProperties conversion to/from strings +* :ghpull:`15619`: Improve zorder demo +* :ghpull:`15810`: Backport PR #15809 on branch v3.2.x (Exclude artists from legend using label attributte) +* :ghpull:`15809`: Exclude artists from legend using label attributte +* :ghpull:`15808`: Backport PR #15513 on branch v3.2.x (Separate plots using #### in make_room_for_ylabel_using_axesgrid.py) +* :ghpull:`15513`: Separate plots using #### in make_room_for_ylabel_using_axesgrid.py +* :ghpull:`15807`: Backport PR #15791 on branch v3.2.x (Cleanup backend_bases docstrings.) +* :ghpull:`15791`: Cleanup backend_bases docstrings. +* :ghpull:`15803`: Backport PR #15795 on branch v3.2.x (Remove incorrect statement re2: colorbars in image tutorial.) +* :ghpull:`15795`: Remove incorrect statement re: colorbars in image tutorial. +* :ghpull:`15794`: Backport PR #15793 on branch v3.2.x (fix a couple typos in tutorials) +* :ghpull:`15793`: fix a couple typos in tutorials +* :ghpull:`15774`: Backport PR #15748 on branch v3.2.x (Fix incorrect macro in FT2Font setup.) +* :ghpull:`15748`: Fix incorrect macro in FT2Font setup. +* :ghpull:`15759`: Backport PR #15751 on branch v3.2.x (Modernize FAQ entry for plt.show().) +* :ghpull:`15762`: Backport PR #15752 on branch v3.2.x (Update boxplot/violinplot faq.) +* :ghpull:`15755`: Backport PR #15661 on branch v3.2.x (Document scope of 3D scatter depthshading.) +* :ghpull:`15742`: Backport PR #15729 on branch v3.2.x (Catch correct parse errror type for dateutil >= 2.8.1) +* :ghpull:`15738`: Backport PR #15737 on branch v3.2.x (Fix env override in WebAgg backend test.) +* :ghpull:`15724`: Backport PR #15718 on branch v3.2.x (Update donation link) +* :ghpull:`15716`: Backport PR #15683 on branch v3.2.x (Cleanup dates.py docstrings.) +* :ghpull:`15683`: Cleanup dates.py docstrings. +* :ghpull:`15688`: Backport PR #15682 on branch v3.2.x (Make histogram_bin_edges private.) +* :ghpull:`15682`: Make histogram_bin_edges private. +* :ghpull:`15666`: Backport PR #15649 on branch v3.2.x (Fix searchindex.js loading when ajax fails (because e.g. CORS in embedded iframes)) +* :ghpull:`15669`: Backport PR #15654 on branch v3.2.x (Fix some broken links.) +* :ghpull:`15660`: Backport PR #15647 on branch v3.2.x (Update some links) +* :ghpull:`15653`: Backport PR #15623 on branch v3.2.x (Docstring for Artist.mouseover) +* :ghpull:`15623`: Docstring for Artist.mouseover +* :ghpull:`15634`: Backport PR #15626 on branch v3.2.x (Note minimum supported version for fontconfig.) +* :ghpull:`15633`: Backport PR #15620 on branch v3.2.x (TST: Increase tolerance of some tests for aarch64) +* :ghpull:`15626`: Note minimum supported version for fontconfig. +* :ghpull:`15632`: Backport PR #15627 on branch v3.2.x (Make it easier to test various animation writers in examples.) +* :ghpull:`15620`: TST: Increase tolerance of some tests for aarch64 +* :ghpull:`15627`: Make it easier to test various animation writers in examples. +* :ghpull:`15618`: Backport PR #15613 on branch v3.2.x (Revert "Don't bother with manually resizing the Qt main window.") +* :ghpull:`15613`: Revert "Don't bother with manually resizing the Qt main window." +* :ghpull:`15593`: Backport PR #15590 on branch v3.2.x (Rename numpy to NumPy in docs.) +* :ghpull:`15590`: Rename numpy to NumPy in docs. +* :ghpull:`15588`: Backport PR #15478 on branch v3.2.x (Make ConciseDateFormatter obey timezone) +* :ghpull:`15478`: Make ConciseDateFormatter obey timezone +* :ghpull:`15583`: Backport PR #15512 on branch v3.2.x +* :ghpull:`15584`: Backport PR #15579 on branch v3.2.x (Remove matplotlib.sphinxext.tests from __init__.py) +* :ghpull:`15579`: Remove matplotlib.sphinxext.tests from __init__.py +* :ghpull:`15577`: Backport PR #14705 on branch v3.2.x (Correctly size non-ASCII characters in agg backend.) +* :ghpull:`14705`: Correctly size non-ASCII characters in agg backend. +* :ghpull:`15572`: Backport PR #15452 on branch v3.2.x (Improve example for tick formatters) +* :ghpull:`15570`: Backport PR #15561 on branch v3.2.x (Update thirdparty scalebar) +* :ghpull:`15452`: Improve example for tick formatters +* :ghpull:`15545`: Backport PR #15429 on branch v3.2.x (Fix OSX build on azure) +* :ghpull:`15544`: Backport PR #15537 on branch v3.2.x (Add a third party package in the doc: matplotlib-scalebar) +* :ghpull:`15561`: Update thirdparty scalebar +* :ghpull:`15567`: Backport PR #15562 on branch v3.2.x (Improve docsting of AxesImage) +* :ghpull:`15562`: Improve docsting of AxesImage +* :ghpull:`15565`: Backport PR #15556 on branch v3.2.x (Fix test suite compat with ghostscript 9.50.) +* :ghpull:`15556`: Fix test suite compat with ghostscript 9.50. +* :ghpull:`15560`: Backport PR #15553 on branch v3.2.x (DOC: add cache-buster query string to css path) +* :ghpull:`15552`: Backport PR #15528 on branch v3.2.x (Declutter home page) +* :ghpull:`15554`: Backport PR #15523 on branch v3.2.x (numpydoc AxesImage) +* :ghpull:`15523`: numpydoc AxesImage +* :ghpull:`15549`: Backport PR #15516 on branch v3.2.x (Add logo like font) +* :ghpull:`15543`: Backport PR #15539 on branch v3.2.x (Small cleanups to backend docs.) +* :ghpull:`15542`: Backport PR #15540 on branch v3.2.x (axisartist tutorial fixes.) +* :ghpull:`15537`: Add a third party package in the doc: matplotlib-scalebar +* :ghpull:`15541`: Backport PR #15533 on branch v3.2.x (Use svg instead of png for website logo) +* :ghpull:`15539`: Small cleanups to backend docs. +* :ghpull:`15540`: axisartist tutorial fixes. +* :ghpull:`15538`: Backport PR #15535 on branch v3.2.x (Avoid really long lines in event handling docs.) +* :ghpull:`15535`: Avoid really long lines in event handling docs. +* :ghpull:`15531`: Backport PR #15527 on branch v3.2.x (Clarify imshow() docs concerning scaling and grayscale images) +* :ghpull:`15527`: Clarify imshow() docs concerning scaling and grayscale images +* :ghpull:`15522`: Backport PR #15500 on branch v3.2.x (Improve antialiasing example) +* :ghpull:`15524`: Backport PR #15499 on branch v3.2.x (Do not show path in font table example) +* :ghpull:`15525`: Backport PR #15498 on branch v3.2.x (Simplify matshow example) +* :ghpull:`15498`: Simplify matshow example +* :ghpull:`15499`: Do not show path in font table example +* :ghpull:`15521`: Backport PR #15519 on branch v3.2.x (FIX: fix anti-aliasing zoom bug) +* :ghpull:`15500`: Improve antialiasing example +* :ghpull:`15519`: FIX: fix anti-aliasing zoom bug +* :ghpull:`15510`: Backport PR #15489 on branch v3.2.x (DOC: adding main nav to site) +* :ghpull:`15495`: Backport PR #15486 on branch v3.2.x (Fixes an error in the documentation of Ellipse) +* :ghpull:`15488`: Backport PR #15372 on branch v3.2.x (Add example for drawstyle) +* :ghpull:`15490`: Backport PR #15487 on branch v3.2.x (Fix window not always raised in Qt example) +* :ghpull:`15487`: Fix window not always raised in Qt example +* :ghpull:`15372`: Add example for drawstyle +* :ghpull:`15485`: Backport PR #15454 on branch v3.2.x (Rewrite Anscombe's quartet example) +* :ghpull:`15483`: Backport PR #15480 on branch v3.2.x (Fix wording in [packages] section of setup.cfg) +* :ghpull:`15454`: Rewrite Anscombe's quartet example +* :ghpull:`15480`: Fix wording in [packages] section of setup.cfg +* :ghpull:`15477`: Backport PR #15464 on branch v3.2.x (Remove unused code (remainder from #15453)) +* :ghpull:`15471`: Backport PR #15460 on branch v3.2.x (Fix incorrect value check in axes_grid.) +* :ghpull:`15456`: Backport PR #15453 on branch v3.2.x (Improve example for tick locators) +* :ghpull:`15457`: Backport PR #15450 on branch v3.2.x (API: rename DivergingNorm to TwoSlopeNorm) +* :ghpull:`15450`: API: rename DivergingNorm to TwoSlopeNorm +* :ghpull:`15434`: In imsave, let pnginfo have precedence over metadata. +* :ghpull:`15445`: Backport PR #15439 on branch v3.2.x (DOC: mention discourse main page) +* :ghpull:`15425`: Backport PR #15422 on branch v3.2.x (FIX: typo in attribute lookup) +* :ghpull:`15449`: DOC: fix build +* :ghpull:`15429`: Fix OSX build on azure +* :ghpull:`15420`: Backport PR #15380 on branch v3.2.x (Update docs of BoxStyle) +* :ghpull:`15380`: Update docs of BoxStyle +* :ghpull:`15300`: CI: use python -m to make sure we are using the pip/pytest we want +* :ghpull:`15414`: Backport PR #15413 on branch v3.2.x (catch OSError instead of FileNotFoundError in _get_executable_info to resolve #15399) +* :ghpull:`15413`: catch OSError instead of FileNotFoundError in _get_executable_info to resolve #15399 +* :ghpull:`15406`: Backport PR #15347 on branch v3.2.x (Fix axes.hist bins units) +* :ghpull:`15405`: Backport PR #15391 on branch v3.2.x (Increase fontsize in inheritance graphs) +* :ghpull:`15347`: Fix axes.hist bins units +* :ghpull:`15391`: Increase fontsize in inheritance graphs +* :ghpull:`15389`: Backport PR #15379 on branch v3.2.x (Document formatting strings in the docs) +* :ghpull:`15379`: Document formatting strings in the docs +* :ghpull:`15386`: Backport PR #15385 on branch v3.2.x (Reword hist() doc.) +* :ghpull:`15385`: Reword hist() doc. +* :ghpull:`15377`: Backport PR #15357 on branch v3.2.x (Add 'step' and 'barstacked' to histogram_histtypes demo) +* :ghpull:`15357`: Add 'step' and 'barstacked' to histogram_histtypes demo +* :ghpull:`15366`: Backport PR #15364 on branch v3.2.x (DOC: fix typo in colormap docs) +* :ghpull:`15362`: Backport PR #15350 on branch v3.2.x (Don't generate double-reversed cmaps ("viridis_r_r", ...).) +* :ghpull:`15360`: Backport PR #15258 on branch v3.2.x (Don't fallback to view limits when autoscale()ing no data.) +* :ghpull:`15350`: Don't generate double-reversed cmaps ("viridis_r_r", ...). +* :ghpull:`15258`: Don't fallback to view limits when autoscale()ing no data. +* :ghpull:`15299`: Backport PR #15296 on branch v3.2.x (Fix typo/bug from 18cecf7) +* :ghpull:`15327`: Backport PR #15326 on branch v3.2.x (List of minimal versions of dependencies) +* :ghpull:`15326`: List of minimal versions of dependencies +* :ghpull:`15317`: Backport PR #15291 on branch v3.2.x (Remove error_msg_qt from backend_qt4.) +* :ghpull:`15316`: Backport PR #15283 on branch v3.2.x (Don't default axes_grid colorbar locator to MaxNLocator.) +* :ghpull:`15291`: Remove error_msg_qt from backend_qt4. +* :ghpull:`15283`: Don't default axes_grid colorbar locator to MaxNLocator. +* :ghpull:`15315`: Backport PR #15308 on branch v3.2.x (Doc: Add close event to list of events) +* :ghpull:`15308`: Doc: Add close event to list of events +* :ghpull:`15312`: Backport PR #15307 on branch v3.2.x (DOC: center footer) +* :ghpull:`15307`: DOC: center footer +* :ghpull:`15276`: Backport PR #15271 on branch v3.2.x (Fix font weight validation) +* :ghpull:`15279`: Backport PR #15252 on branch v3.2.x (Mention labels and milestones in PR review guidelines) +* :ghpull:`15252`: Mention labels and milestones in PR review guidelines +* :ghpull:`15268`: Backport PR #15266 on branch v3.2.x (Embedding in Tk example: Fix toolbar being clipped.) +* :ghpull:`15269`: Backport PR #15267 on branch v3.2.x (added multi-letter example to mathtext tutorial) +* :ghpull:`15267`: added multi-letter example to mathtext tutorial +* :ghpull:`15266`: Embedding in Tk example: Fix toolbar being clipped. +* :ghpull:`15243`: Move some new API changes to the correct place +* :ghpull:`15245`: Fix incorrect calls to warn_deprecated. +* :ghpull:`15239`: Composite against white, not the savefig.facecolor rc, in print_jpeg. +* :ghpull:`15227`: contains_point() docstring fixes +* :ghpull:`15242`: Cleanup widgets docstrings. +* :ghpull:`14889`: Support pixel-by-pixel alpha in imshow. +* :ghpull:`14928`: Logit scale nonsingular +* :ghpull:`14998`: Fix nonlinear spine positions & inline Spine._calc_offset_transform into get_spine_transform. +* :ghpull:`15231`: Doc: Do not write default for non-existing rcParams +* :ghpull:`15222`: Cleanup projections/__init__.py. +* :ghpull:`15228`: Minor docstring style cleanup +* :ghpull:`15237`: Cleanup widgets.py. +* :ghpull:`15229`: Doc: Fix Bbox and BboxBase links +* :ghpull:`15235`: Kill FigureManagerTk._num. +* :ghpull:`15234`: Drop mention of msinttypes in Windows build. +* :ghpull:`15224`: Avoid infinite loop when switching actions in qt backend. +* :ghpull:`15230`: Doc: Remove hard-documented rcParams defaults +* :ghpull:`15149`: pyplot.style.use() to accept pathlib.Path objects as arguments +* :ghpull:`15220`: Correctly format floats passed to pgf backend. +* :ghpull:`15216`: Update docstrings of contains_point(s) methods +* :ghpull:`15209`: Exclude s-g generated files from flake8 check. +* :ghpull:`15204`: PEP8ify some variable names. +* :ghpull:`15196`: Force html4 writer for sphinx 2 +* :ghpull:`13544`: Improve handling of subplots spanning multiple gridspec cells. +* :ghpull:`15194`: Trivial style fixes. +* :ghpull:`15202`: Deprecate the renderer parameter to Figure.tight_layout. +* :ghpull:`15195`: Fix integers being passed as length to quiver3d. +* :ghpull:`15180`: Add some more internal links to 3.2.0 what's new +* :ghpull:`13510`: Change Locator MAXTICKS checking to emitting a log at WARNING level. +* :ghpull:`15184`: Mark missing_references extension as parallel read safe +* :ghpull:`15150`: Autodetect whether pgf can use \includegraphics[interpolate]. +* :ghpull:`15163`: 3.2.0 API changes page +* :ghpull:`15176`: What's new for 3.2.0 +* :ghpull:`11947`: Ensure streamplot Euler step is always called when going out of bounds. +* :ghpull:`13702`: Deduplicate methods shared between Container and Artist. +* :ghpull:`15169`: TST: verify warnings fail the test suite +* :ghpull:`14888`: Replace some polar baseline images by check_figures_equal. +* :ghpull:`15027`: More readability improvements on axis3d. +* :ghpull:`15171`: Add useful error message when trying to add Slider to 3DAxes +* :ghpull:`13775`: Doc: Scatter Hist example update +* :ghpull:`15164`: removed a typo +* :ghpull:`15152`: Support for shorthand hex colors. +* :ghpull:`15159`: Follow up on #14424 for docstring +* :ghpull:`14424`: ENH: Add argument size validation to quiver. +* :ghpull:`15137`: DOC: add example to power limit API change note +* :ghpull:`15144`: Improve local page contents CSS +* :ghpull:`15143`: Restore doc references. +* :ghpull:`15124`: Replace parameter lists with square brackets +* :ghpull:`13077`: fix FreeType build on Azure +* :ghpull:`15123`: Improve categorical example +* :ghpull:`15134`: Fix missing references in doc build. +* :ghpull:`13937`: Use PYTHONFAULTHANDLER to switch on the Python fault handler. +* :ghpull:`13452`: Replace axis_artist.AttributeCopier by normal inheritance. +* :ghpull:`15045`: Resize canvas when changing figure size +* :ghpull:`15122`: Fixed app creation in qt5 backend (see #15100) +* :ghpull:`15099`: Add lightsource parameter to bar3d +* :ghpull:`14876`: Inline some afm parsing code. +* :ghpull:`15119`: Deprecate a validator for a deprecated rcParam value. +* :ghpull:`15121`: Fix Stacked bar graph example +* :ghpull:`15113`: Cleanup layout_from_subplotspec. +* :ghpull:`13543`: Remove zip_safe=False flag from setup.py. +* :ghpull:`12860`: ENH: LogLocator: check for correct dimension of subs added +* :ghpull:`14349`: Replace ValidateInterval by simpler specialized validators. +* :ghpull:`14352`: Remove redundant is_landscape kwarg from backend_ps helpers. +* :ghpull:`15087`: Pass gid to renderer +* :ghpull:`14703`: Don't bother with manually resizing the Qt main window. +* :ghpull:`14833`: Reuse TexManager implementation in convert_psfrags. +* :ghpull:`14893`: Update layout.html for sphinx themes +* :ghpull:`15098`: Simplify symlog range determination logic +* :ghpull:`15112`: Cleanup legend() docstring. +* :ghpull:`15108`: Fix doc build and resync matplotlibrc.template with actual defaults. +* :ghpull:`14940`: Fix text kerning calculations and some FT2Font cleanup +* :ghpull:`15082`: Privatize font_manager.JSONEncoder. +* :ghpull:`15106`: Update docs of GridSpec +* :ghpull:`14832`: ENH:made default tick formatter to switch to scientific notation earlier +* :ghpull:`15086`: Style fixes. +* :ghpull:`15073`: Add entry for blume to thirdparty package index +* :ghpull:`15095`: Simplify _png extension by handling file open/close in Python. +* :ghpull:`15092`: MNT: Add test for aitoff-projection +* :ghpull:`15101`: Doc: fix typo in contour doc +* :ghpull:`14624`: Fix axis inversion with loglocator and logitlocator. +* :ghpull:`15088`: Fix more doc references. +* :ghpull:`15063`: Add Comic Neue as a fantasy font. +* :ghpull:`14867`: Propose change to PR merging policy. +* :ghpull:`15068`: Add FontManager.addfont to register fonts at specific paths. +* :ghpull:`13397`: Deprecate axes_grid1.colorbar (in favor of matplotlib's own). +* :ghpull:`14521`: Move required_interactive_framework to canvas class. +* :ghpull:`15083`: Cleanup spines example. +* :ghpull:`14997`: Correctly set formatters and locators on removed shared axis +* :ghpull:`15064`: Fix eps hatching in MacOS Preview +* :ghpull:`15074`: Write all ACCEPTS markers in docstrings as comments. +* :ghpull:`15078`: Clarify docstring of FT2Font.get_glyph_name. +* :ghpull:`15080`: Fix cross-references in API changes < 3.0.0. +* :ghpull:`15072`: Cleanup patheffects. +* :ghpull:`15071`: Cleanup offsetbox.py. +* :ghpull:`15070`: Fix cross-references in API changes < 2.0.0. +* :ghpull:`10691`: Fix for shared axes diverging after setting tick markers +* :ghpull:`15069`: Style fixes for font_manager.py. +* :ghpull:`15067`: Fix cross-references in API changes < 1.0 +* :ghpull:`15061`: Fix cross-references in tutorials and FAQ +* :ghpull:`15060`: Fix cross-references in examples. +* :ghpull:`14957`: Documentation for using ConnectionPatch across Axes with constrained… +* :ghpull:`15053`: Make citation bit of README less wordy +* :ghpull:`15044`: numpydoc set_size_inches docstring +* :ghpull:`15050`: Clarify unnecessary special handling for colons in paths. +* :ghpull:`14797`: DOC: create a Agg figure without pyplot in buffer example +* :ghpull:`14844`: Add citation info to README +* :ghpull:`14884`: Do not allow canvas size to become smaller than MinSize in wx backend… +* :ghpull:`14941`: Improvements to make_icons.py. +* :ghpull:`15048`: DOC: more nitpick follow up +* :ghpull:`15043`: Fix Docs: Don’t warn for unused ignores +* :ghpull:`15025`: Re-write text wrapping logic +* :ghpull:`14840`: Don't assume transform is valid on access to matrix. +* :ghpull:`14862`: Make optional in docstrings optional +* :ghpull:`15028`: Python version conf.py +* :ghpull:`15033`: FIX: un-break nightly wheels on py37 +* :ghpull:`15046`: v3.1.x merge up +* :ghpull:`15015`: Fix bad missing-references.json due to PR merge race condition. +* :ghpull:`14581`: Make logscale bar/hist autolimits more consistents. +* :ghpull:`15034`: Doc fix nitpick +* :ghpull:`14614`: Deprecate {x,y,z}axis_date. +* :ghpull:`14991`: Handle inherited is_separable, has_inverse in transform props detection. +* :ghpull:`15032`: Clarify effect of axis('equal') on explicit data limits +* :ghpull:`15031`: Update docs of GridSpec +* :ghpull:`14106`: Describe FigureManager +* :ghpull:`15024`: Update docs of GridSpecBase +* :ghpull:`14906`: Deprecate some FT2Image methods. +* :ghpull:`14963`: More Axis3D cleanup. +* :ghpull:`15009`: Provide signatures to some C-level classes and methods. +* :ghpull:`14968`: DOC: colormap manipulation tutorial update +* :ghpull:`15006`: Deprecate get/set_*ticks minor positional use +* :ghpull:`14989`: DOC:Update axes documentation +* :ghpull:`14871`: Parametrize determinism tests. +* :ghpull:`14768`: DOC: Enable nitpicky +* :ghpull:`15013`: Matplotlib requires Python 3.6, which in turn requires Mac OS X 10.6+ +* :ghpull:`15012`: Fix typesetting of "GitHub" +* :ghpull:`14954`: Cleanup polar_legend example. +* :ghpull:`14519`: Check parameters of ColorbarBase +* :ghpull:`14942`: Make _classic_test style a tiny patch on top of classic. +* :ghpull:`14988`: pathlibify/fstringify setup/setupext. +* :ghpull:`14511`: Deprecate allowing scalars for fill_between where +* :ghpull:`14493`: Remove deprecated fig parameter form GridSpecBase.get_subplot_params() +* :ghpull:`14995`: Further improve backend tutorial. +* :ghpull:`15000`: Use warnings.warn, not logging.warning, in microseconds locator warning. +* :ghpull:`14990`: Fix nonsensical transform in mixed-mode axes aspect computation. +* :ghpull:`15002`: No need to access filesystem in test_dates.py. +* :ghpull:`14549`: Improve backends documentation +* :ghpull:`14774`: Fix image bbox clip. +* :ghpull:`14978`: Typo fixes in pyplot.py +* :ghpull:`14702`: Don't enlarge toolbar for Qt high-dpi. +* :ghpull:`14922`: Autodetect some transform properties. +* :ghpull:`14962`: Replace inspect.getfullargspec by inspect.signature. +* :ghpull:`14958`: Improve docs of toplevel module. +* :ghpull:`14926`: Save a matrix unpacking/repacking in offsetbox. +* :ghpull:`14961`: Cleanup demo_agg_filter. +* :ghpull:`14924`: Kill the C-level (private) RendererAgg.buffer_rgba, which returns a copy. +* :ghpull:`14946`: Delete virtualenv faq. +* :ghpull:`14944`: Shorten style.py. +* :ghpull:`14931`: Deprecate some obscure rcParam synonyms. +* :ghpull:`14947`: Fix inaccuracy re: backends in intro tutorial. +* :ghpull:`14904`: Fix typo in secondary_axis.py example. +* :ghpull:`14925`: Support passing spine bounds as single tuple. +* :ghpull:`14921`: DOC: Make abbreviation of versus consistent. +* :ghpull:`14739`: Improve indentation of Line2D properties in docstrings. +* :ghpull:`14923`: In examples, prefer buffer_rgba to print_to_buffer. +* :ghpull:`14908`: Make matplotlib.style.available sorted alphabetically. +* :ghpull:`13567`: Deprecate MovieWriterRegistry cache-dirtyness system. +* :ghpull:`14879`: Error out when unsupported kwargs are passed to Scale. +* :ghpull:`14512`: Logit scale, changes in LogitLocator and LogitFormatter +* :ghpull:`12415`: ENH: fig.set_size to allow non-inches units +* :ghpull:`13783`: Deprecate disable_internet. +* :ghpull:`14886`: Further simplify the flow of pdf text output. +* :ghpull:`14894`: Make slowness warning for legend(loc="best") more accurate. +* :ghpull:`14891`: Fix nightly test errors +* :ghpull:`14895`: Fix typos +* :ghpull:`14890`: Remove unused private helper method in mplot3d. +* :ghpull:`14872`: Unify text layout paths. +* :ghpull:`8183`: Allow array alpha for imshow +* :ghpull:`13832`: Vectorize handling of stacked/cumulative in hist(). +* :ghpull:`13630`: Simplify PolarAxes.can_pan. +* :ghpull:`14565`: Rewrite an argument check to _check_getitem +* :ghpull:`14875`: Cleanup afm module docstring. +* :ghpull:`14880`: Fix animation blitting for plots with shared axes +* :ghpull:`14870`: FT2Font.get_char_index never returns None. +* :ghpull:`13463`: Deprecate Locator.autoscale. +* :ghpull:`13724`: ENH: anti-alias down-sampled images +* :ghpull:`14848`: Clearer error message for plt.axis() +* :ghpull:`14660`: colorbar(label=None) should give an empty label +* :ghpull:`14654`: Cleanup of docstrings of scales +* :ghpull:`14868`: Update bar stacked example to directly manipulate axes. +* :ghpull:`14749`: Fix get_canvas_width_height() for pgf backend. +* :ghpull:`14776`: Make ExecutableUnavailableError +* :ghpull:`14843`: Don't try to cleanup CallbackRegistry during interpreter shutdown. +* :ghpull:`14849`: Improve tkagg icon resolution +* :ghpull:`14866`: changed all readme headings to verbs +* :ghpull:`13364`: Numpyfy tick handling code in Axis3D. +* :ghpull:`13642`: FIX: get_datalim for collection +* :ghpull:`14860`: Stopgap fix for pandas converters in tests. +* :ghpull:`6498`: Check canvas identity in Artist.contains. +* :ghpull:`14707`: Add titlecolor in rcParams +* :ghpull:`14853`: Fix typo in set_adjustable check. +* :ghpull:`14845`: More cleanups. +* :ghpull:`14809`: Clearer calls to ConnectionPatch. +* :ghpull:`14716`: Use str instead of string as type in docstrings +* :ghpull:`14338`: Simplify/pathlibify image_comparison. +* :ghpull:`8930`: timedelta formatter +* :ghpull:`14733`: Deprecate FigureFrameWx.statusbar & NavigationToolbar2Wx.statbar. +* :ghpull:`14713`: Unite masked and NaN plot examples +* :ghpull:`14576`: Let Axes3D share have_units, _on_units_changed with 2d axes. +* :ghpull:`14575`: Make ticklabel_format work both for 2D and 3D axes. +* :ghpull:`14834`: DOC: Webpage not formated correctly on gallery docs +* :ghpull:`14730`: Factor out common parts of wx event handlers. +* :ghpull:`14727`: Fix axes aspect for non-linear, non-log, possibly mixed-scale axes. +* :ghpull:`14835`: Only allow set_adjustable("datalim") for axes with standard data ratios. +* :ghpull:`14746`: Simplify Arrow constructor. +* :ghpull:`14752`: Doc changes to git setup +* :ghpull:`14732`: Deduplicate wx configure_subplots tool. +* :ghpull:`14715`: Use array-like in docs +* :ghpull:`14728`: More floating_axes cleanup. +* :ghpull:`14719`: Make Qt navtoolbar more robust against removal of either pan or zoom. +* :ghpull:`14695`: Various small simplifications +* :ghpull:`14745`: Replace Affine2D().scale(x, x) by Affine2D().scale(x). +* :ghpull:`14687`: Add missing spaces after commas in docs +* :ghpull:`14810`: Lighten icons of NavigationToolbar2QT on dark-themes +* :ghpull:`14786`: Deprecate axis_artist.BezierPath. +* :ghpull:`14750`: Misc. simplifications. +* :ghpull:`14807`: API change note on automatic blitting detection for backends +* :ghpull:`11004`: Deprecate smart_bounds handling in Axis and Spine +* :ghpull:`14785`: Kill some never-used attributes. +* :ghpull:`14723`: Cleanup some parameter descriptions in matplotlibrc.template +* :ghpull:`14808`: Small docstring updates +* :ghpull:`14686`: Inset orientation +* :ghpull:`14805`: Simplify text_layout example. +* :ghpull:`12052`: Make AxesImage.contains account for transforms +* :ghpull:`11860`: Let MovieFileWriter save temp files in a new dir +* :ghpull:`11423`: FigureCanvas Designer +* :ghpull:`10688`: Add legend handler and artist for FancyArrow +* :ghpull:`8321`: Added ContourSet clip_path kwarg and set_clip_path() method (#2369) +* :ghpull:`14641`: Simplify _process_plot_var_args. +* :ghpull:`14631`: Refactor from_levels_and_colors. +* :ghpull:`14790`: DOC:Add link to style examples in matplotlib.style documentation +* :ghpull:`14799`: Deprecate dates.mx2num. +* :ghpull:`14793`: Remove sudo tag in travis +* :ghpull:`14795`: Autodetect whether a canvas class supports blitting. +* :ghpull:`14794`: DOC: Update the documetation of homepage of website +* :ghpull:`14629`: Delete HTML build sources to save on artefact upload time +* :ghpull:`14792`: Fix spelling typos +* :ghpull:`14789`: Prefer Affine2D.translate to offset_transform in examples. +* :ghpull:`14783`: Cleanup mlab.detrend. +* :ghpull:`14791`: Make 'extended' and 'expanded' synonymous in font_manager +* :ghpull:`14787`: Remove axis_artist _update, which is always a noop. +* :ghpull:`14758`: Compiling C-ext with incorrect FreeType libs makes future compiles break +* :ghpull:`14763`: Deprecate math_symbol_table function directive +* :ghpull:`14762`: Decrease uses of get_canvas_width_height. +* :ghpull:`14748`: Cleanup demo_text_path. +* :ghpull:`14740`: Remove sudo tag in travis +* :ghpull:`14737`: Cleanup twin axes docstrings. +* :ghpull:`14729`: Small simplifications. +* :ghpull:`14726`: Trivial simplification to Axis3d._get_coord_info. +* :ghpull:`14718`: Add explanations for single character color names. +* :ghpull:`14710`: Pin pydocstyle<4.0 +* :ghpull:`14709`: Try to improve the readability and styling of matplotlibrc.template file +* :ghpull:`14278`: Inset axes bug and docs fix +* :ghpull:`14478`: MNT: protect from out-of-bounds data access at the c level +* :ghpull:`14569`: More deduplication of backend_tools. +* :ghpull:`14652`: Soft-deprecate transform_point. +* :ghpull:`14664`: Improve error reporting for scatter c as invalid RGBA. +* :ghpull:`14625`: Don't double-wrap in silent_list. +* :ghpull:`14689`: Update embedding_in_wx4 example. +* :ghpull:`14679`: Further simplify colormap reversal. +* :ghpull:`14667`: Move most of pytest's conf to conftest.py. +* :ghpull:`14632`: Remove reference to old Tk/Windows bug. +* :ghpull:`14673`: More shortening of setup.py prints. +* :ghpull:`14678`: Fix small typo +* :ghpull:`14680`: Format parameters in descriptions with emph instead of backticks +* :ghpull:`14674`: Simplify colormap reversal. +* :ghpull:`14672`: Artist tutorial fixes +* :ghpull:`14653`: Remove some unnecessary prints from setup.py. +* :ghpull:`14662`: Add a _check_getitem helper to go with _check_in_list/_check_isinstance. +* :ghpull:`14666`: Update IPython's doc link in Image tutorial +* :ghpull:`14671`: Improve readability of matplotlibrc.template +* :ghpull:`14665`: Fix a typo in pyplot tutorial +* :ghpull:`14616`: Use builtin round instead of np.round for scalars. +* :ghpull:`12554`: backend_template docs and fixes +* :ghpull:`14635`: Fix bug when setting negative limits and using log scale +* :ghpull:`14604`: Update hist() docstring following removal of normed kwarg. +* :ghpull:`14630`: Remove the private Tick._name attribute. +* :ghpull:`14555`: Coding guidelines concerning the API +* :ghpull:`14516`: Document and test _get_packed_offsets() +* :ghpull:`14628`: matplotlib > Matplotlib in devel docs +* :ghpull:`14627`: gitignore pip-wheel-metadta/ directory +* :ghpull:`14612`: Update some mplot3d docs. +* :ghpull:`14617`: Remove a Py2.4(!) backcompat fix. +* :ghpull:`14605`: Update hist2d() docstring. +* :ghpull:`13084`: When linking against libpng/zlib on Windows, use upstream lib names. +* :ghpull:`13685`: Remove What's new fancy example +* :ghpull:`14573`: Cleanup jpl_units. +* :ghpull:`14583`: Fix overly long lines in setupext. +* :ghpull:`14588`: Remove [status] suppress from setup.cfg. +* :ghpull:`14591`: Style fixes for secondary_axis. +* :ghpull:`14594`: DOC: Make temperature scale example use a closure for easier reusability +* :ghpull:`14447`: FIX: allow secondary axes minor locators to be set +* :ghpull:`14567`: Fix unicode_minus + usetex. +* :ghpull:`14351`: Remove some redundant check_in_list calls. +* :ghpull:`14550`: Restore thumbnail of usage guide +* :ghpull:`10222`: Use symlinks instead of copies for test result_images. +* :ghpull:`14267`: cbook docs cleanup +* :ghpull:`14556`: Improve @deprecated's docstring. +* :ghpull:`14557`: Clarify how to work with threads. +* :ghpull:`14545`: In contributing.rst, encourage kwonly args and minimizing public APIs. +* :ghpull:`14533`: Misc. style fixes. +* :ghpull:`14542`: Move plot_directive doc to main API index. +* :ghpull:`14499`: Improve custom figure example +* :ghpull:`14543`: Remove the "Developing a new backend" section from contributing guide. +* :ghpull:`14540`: Simplify backend switching in plot_directive. +* :ghpull:`14539`: Don't overindent enumerated list in plot_directive docstring. +* :ghpull:`14537`: Slightly tighten the Bbox API. +* :ghpull:`14223`: Rewrite intro to usage guide. +* :ghpull:`14495`: Numpydocify axes_artist.py +* :ghpull:`14529`: mpl_toolkits style fixes. +* :ghpull:`14528`: mathtext style fixes. +* :ghpull:`13536`: Make unit converters also handle instances of subclasses. +* :ghpull:`13730`: Include FreeType error codes in FreeType exception messages. +* :ghpull:`14500`: Fix pydocstyle D403 (First word of the first line should be properly capitalized) in examples +* :ghpull:`14506`: Simplify Qt tests. +* :ghpull:`14513`: More fixes to pydocstyle D403 (First word capitalization) +* :ghpull:`14496`: Fix pydocstyle D208 (Docstring is over-indented) +* :ghpull:`14347`: Deprecate rcsetup.validate_path_exists. +* :ghpull:`14383`: Remove the ````package_data.dlls```` setup.cfg entry. +* :ghpull:`14346`: Simplify various validators in rcsetup. +* :ghpull:`14366`: Move test_rcparams test files inline into test_rcparams.py. +* :ghpull:`14401`: Assume that mpl-data is in its standard location. +* :ghpull:`14454`: Simplify implementation of svg.image_inline. +* :ghpull:`14470`: Add _check_isinstance helper. +* :ghpull:`14479`: fstringify backend_ps more. +* :ghpull:`14484`: Support unicode minus with ps.useafm. +* :ghpull:`14494`: Style fixes. +* :ghpull:`14465`: Docstrings cleanups. +* :ghpull:`14466`: Let SecondaryAxis inherit get_tightbbox from _AxesBase. +* :ghpull:`13940`: Some more f-strings. +* :ghpull:`14379`: Remove unnecessary uses of unittest.mock. +* :ghpull:`14483`: Improve font weight guessing. +* :ghpull:`14419`: Fix test_imshow_pil on Windows. +* :ghpull:`14460`: canvas.blit() already defaults to blitting the full figure canvas. +* :ghpull:`14462`: Register timeout pytest marker. +* :ghpull:`14414`: FEATURE: Alpha channel in Gouraud triangles in the pdf backend +* :ghpull:`13659`: Clarify behavior of the 'tight' kwarg to autoscale/autoscale_view. +* :ghpull:`13901`: Only test png output for mplot3d. +* :ghpull:`13338`: Replace list.extend by star-expansion or other constructs. +* :ghpull:`14448`: Misc doc style cleanup +* :ghpull:`14310`: Update to Bounding Box for Qt5 FigureCanvasATAgg.paintEvent() +* :ghpull:`14380`: Inline $MPLLOCALFREETYPE/$PYTEST_ADDOPTS/$NPROC in .travis.yml. +* :ghpull:`14413`: MAINT: small improvements to the pdf backend +* :ghpull:`14452`: MAINT: Minor cleanup to make functions more self consisntent +* :ghpull:`14441`: Misc. docstring cleanups. +* :ghpull:`14440`: Interpolations example +* :ghpull:`14402`: Prefer ``mpl.get_data_path()``, and support Paths in FontProperties. +* :ghpull:`14420`: MAINT: Upgrade pytest again +* :ghpull:`14423`: Fix docstring of subplots(). +* :ghpull:`14410`: Use aspect=1, not aspect=True. +* :ghpull:`14412`: MAINT: Don't install pytest 4.6.0 on Travis +* :ghpull:`14377`: Rewrite assert np.* tests to use numpy.testing +* :ghpull:`14399`: Improve warning for case where data kwarg entry is ambiguous. +* :ghpull:`14390`: Cleanup docs of bezier +* :ghpull:`14400`: Fix to_rgba_array() for empty input +* :ghpull:`14308`: Small clean to SymmetricalLogLocator +* :ghpull:`14311`: travis: add c code coverage measurements +* :ghpull:`14393`: Remove remaining unicode-strings markers. +* :ghpull:`14391`: Remove explicit inheritance from object +* :ghpull:`14343`: acquiring and releaseing keypresslock when textbox is being activated +* :ghpull:`14353`: Register flaky pytest marker. +* :ghpull:`14373`: Properly hide __has_include to support C++<17 compilers. +* :ghpull:`14378`: Remove setup_method +* :ghpull:`14368`: Finish removing jquery from the repo. +* :ghpull:`14360`: Deprecate ``boxplot(..., whis="range")``. +* :ghpull:`14376`: Simplify removal of figure patch from bbox calculations. +* :ghpull:`14363`: Make is_natively_supported private. +* :ghpull:`14330`: Remove remaining unittest.TestCase uses +* :ghpull:`13663`: Kill the PkgConfig singleton in setupext. +* :ghpull:`13067`: Simplify generation of error messages for missing libpng/freetype. +* :ghpull:`14358`: DOC boxplot ``whis`` parameter +* :ghpull:`14014`: Disallow figure argument for pyplot.subplot() and Figure.add_subplot() +* :ghpull:`14350`: Use cbook._check_in_list more often. +* :ghpull:`14348`: Cleanup markers.py. +* :ghpull:`14345`: Use importorskip for tests depending on pytz. +* :ghpull:`14170`: In setup.py, inline the packages that need to be installed into setup(). +* :ghpull:`14332`: Use raw docstrings instead of escaping backslashes +* :ghpull:`14336`: Enforce pydocstyle D412 +* :ghpull:`14144`: Deprecate the 'warn' parameter to matplotlib.use(). +* :ghpull:`14328`: Remove explicit inheritance from object +* :ghpull:`14035`: Improve properties formatting in interpolated docstrings. +* :ghpull:`14018`: pep8ing. +* :ghpull:`13542`: Move {setup,install}_requires from setupext.py to setup.py. +* :ghpull:`13670`: Simplify the logic of axis(). +* :ghpull:`14046`: Deprecate checkdep_ps_distiller. +* :ghpull:`14236`: Simplify StixFonts.get_sized_alternatives_for_symbol. +* :ghpull:`14101`: Shorten _ImageBase._make_image. +* :ghpull:`14246`: Deprecate public use of makeMappingArray +* :ghpull:`13740`: Deprecate plotfile. +* :ghpull:`14216`: Walk the artist tree when preparing for saving with tight bbox. +* :ghpull:`14305`: Small grammatical error. +* :ghpull:`14104`: Factor out retrieval of data relative to datapath +* :ghpull:`14016`: pep8ify backends. +* :ghpull:`14299`: Fix #13711 by importing cbook. +* :ghpull:`14244`: Remove APIs deprecated in mpl3.0. +* :ghpull:`14068`: Alternative fix for passing iterator as frames to FuncAnimation +* :ghpull:`13711`: Deprecate NavigationToolbar2Tk.set_active. +* :ghpull:`14280`: Simplify validate_markevery logic. +* :ghpull:`14273`: pep8ify a couple of variable names. +* :ghpull:`14115`: Reorganize scatter arguments parsing. +* :ghpull:`14271`: Replace some uses of np.iterable +* :ghpull:`14257`: Changing cmap(np.nan) to 'bad' value rather than 'under' value +* :ghpull:`14259`: Deprecate string as color sequence +* :ghpull:`13506`: Change colorbar for contour to have the proper axes limits... +* :ghpull:`13494`: Add colorbar annotation example plot to gallery +* :ghpull:`14266`: Make matplotlib.figure.AxesStack private +* :ghpull:`14166`: Shorten usage of ``@image_comparison``. +* :ghpull:`14240`: Merge up 31x +* :ghpull:`14242`: Avoid a buffer copy in PillowWriter. +* :ghpull:`9672`: Only set the wait cursor if the last draw was >1s ago. +* :ghpull:`14224`: Update plt.show() doc +* :ghpull:`14218`: Use stdlib mimetypes instead of hardcoding them. +* :ghpull:`14082`: In tk backend, don't try to update mouse position after resize. +* :ghpull:`14084`: Check number of positional arguments passed to quiver() +* :ghpull:`14214`: Fix some docstring style issues. +* :ghpull:`14201`: Fix E124 flake8 violations (closing bracket indentation). +* :ghpull:`14096`: Consistently use axs to refer to a set of Axes +* :ghpull:`14204`: Fix various flake8 indent problems. +* :ghpull:`14205`: Obey flake8 "don't assign a lambda, use a def". +* :ghpull:`14198`: Remove unused imports +* :ghpull:`14173`: Prepare to change the default pad for AxesDivider.append_axes. +* :ghpull:`13738`: Fix TypeError when plotting stacked bar chart with decimal +* :ghpull:`14151`: Clarify error with usetex when cm-super is not installed. +* :ghpull:`14107`: Feature: draw percentiles in violinplot +* :ghpull:`14172`: Remove check_requirements from setupext. +* :ghpull:`14158`: Fix test_lazy_imports in presence of $MPLBACKEND or matplotlibrc. +* :ghpull:`14157`: Isolate nbagg test from user ipython profile. +* :ghpull:`14147`: Dedent overindented list in example docstring. +* :ghpull:`14134`: Deprecate the dryrun parameter to print_foo(). +* :ghpull:`14145`: Remove warnings handling for fixed bugs. +* :ghpull:`13977`: Always import pyplot when calling matplotlib.use(). +* :ghpull:`14131`: Make test suite fail on warnings. +* :ghpull:`13593`: Only autoscale_view() when needed, not after every plotting call. +* :ghpull:`13902`: Add support for metadata= and pil_kwargs= in imsave(). +* :ghpull:`14140`: Avoid backslash-quote by changing surrounding quotes. +* :ghpull:`14132`: Move some toplevel strings into the only functions that use them. +* :ghpull:`13708`: Annotation.contains shouldn't consider the text+arrow's joint bbox. +* :ghpull:`13980`: Don't let margins expand polar plots to negative radii by default. +* :ghpull:`14075`: Remove uninformative entries from glossary. +* :ghpull:`14002`: Allow pandas DataFrames through norms +* :ghpull:`14114`: Allow SVG Text-as-Text to Use Data Coordinates +* :ghpull:`14120`: Remove mention of $QT_API in matplotlibrc example. +* :ghpull:`13878`: Style fixes for floating_axes. +* :ghpull:`14108`: Deprecate FigureCanvasMac.invalidate in favor of draw_idle. +* :ghpull:`13879`: Clarify handling of "extreme" values in FloatingAxisArtistHelper. +* :ghpull:`5602`: Automatic downsampling of images. +* :ghpull:`14112`: Remove old code path in layout.html +* :ghpull:`13959`: Scatter: make "c" and "s" argument handling more consistent. +* :ghpull:`14110`: Simplify scatter_piecharts example. +* :ghpull:`14111`: Trivial cleanups. +* :ghpull:`14085`: Simplify get_current_fig_manager(). +* :ghpull:`14083`: Deprecate FigureCanvasBase.draw_cursor. +* :ghpull:`14089`: Cleanup bar_stacked, bar_unit_demo examples. +* :ghpull:`14063`: Add pydocstyle checks to flake8 +* :ghpull:`14077`: Fix tick label wobbling in animated Qt example +* :ghpull:`14070`: Cleanup some pyplot docstrings. +* :ghpull:`6280`: Added ability to offset errorbars when using errorevery. +* :ghpull:`13679`: Fix passing iterator as frames to FuncAnimation +* :ghpull:`14023`: Improve Unicode minus example +* :ghpull:`14041`: Pretty-format subprocess logs. +* :ghpull:`14038`: Cleanup path.py docstrings. +* :ghpull:`13701`: Small cleanups. +* :ghpull:`14020`: Better error message when trying to use Gtk3Agg backend without cairo +* :ghpull:`14021`: Fix ax.legend Returns markup +* :ghpull:`13986`: Support RGBA for quadmesh mode of pcolorfast. +* :ghpull:`14009`: Deprecate compare_versions. +* :ghpull:`14010`: Deprecate get_home() +* :ghpull:`13932`: Remove many unused variables. +* :ghpull:`13854`: Cleanup contour.py. +* :ghpull:`13866`: Switch PyArg_ParseTupleAndKeywords from "es" to "s". +* :ghpull:`13945`: Make unicode_minus example more focused. +* :ghpull:`13876`: Deprecate factor=None in axisartist. +* :ghpull:`13929`: Better handle deprecated rcParams. +* :ghpull:`13851`: Deprecate setting Axis.major.locator to non-Locator; idem for Formatters +* :ghpull:`13938`: numpydocify quiverkey. +* :ghpull:`13936`: Pathlibify animation. +* :ghpull:`13984`: Allow setting tick colour on 3D axes +* :ghpull:`13987`: Deprecate mlab.{apply_window,stride_repeat}. +* :ghpull:`13983`: Fix locator/formatter setting when removing shared Axes +* :ghpull:`13957`: Remove many unused variables in tests. +* :ghpull:`13981`: Test cleanups. +* :ghpull:`13970`: Check vmin/vmax are valid when doing inverse in LogNorm +* :ghpull:`13978`: Make normalize_kwargs more convenient for third-party use. +* :ghpull:`13972`: Remove _process_plot_var_args.set{line,patch}_props. +* :ghpull:`13795`: Make _warn_external correctly report warnings arising from tests. +* :ghpull:`13885`: Deprecate axisartist.grid_finder.GridFinderBase. +* :ghpull:`13913`: Fix string numbers in to_rgba() and is_color_like() +* :ghpull:`13935`: Deprecate the useless switch_backend_warn parameter to matplotlib.test. +* :ghpull:`13952`: Cleanup animation tests. +* :ghpull:`13942`: Make Cursors an (Int)Enum. +* :ghpull:`13953`: Unxfail a now fixed test in test_category. +* :ghpull:`13925`: Fix passing Path to ps backend when text.usetex rc is True. +* :ghpull:`13943`: Don't crash on str(figimage(...)). +* :ghpull:`13944`: Document how to support unicode minus in pgf backend. +* :ghpull:`13802`: New rcparam to set default axes title location +* :ghpull:`13855`: ``a and b or c`` -> ``b if a else c`` +* :ghpull:`13923`: Correctly handle invalid PNG metadata. +* :ghpull:`13926`: Suppress warnings in tests. +* :ghpull:`13920`: Style fixes for category.py. +* :ghpull:`13889`: Shorten docstrings by removing unneeded :class:/:func: + rewordings. +* :ghpull:`13911`: Fix joinstyles example +* :ghpull:`13917`: Faster categorical tick formatter. +* :ghpull:`13918`: Make matplotlib.testing assume pytest by default, not nose. +* :ghpull:`13894`: Check for positive number of rows and cols +* :ghpull:`13895`: Remove unused setupext.is_min_version. +* :ghpull:`13886`: Shorten Figure.set_size_inches. +* :ghpull:`13859`: Ensure figsize is positive finite +* :ghpull:`13877`: ``zeros_like(x) + y`` -> ``full_like(x, y)`` +* :ghpull:`13875`: Style fixes for grid_helper_curvelinear. +* :ghpull:`13873`: Style fixes to grid_finder. +* :ghpull:`13782`: Don't access internet during tests. +* :ghpull:`13833`: Some more usage of _check_in_list. +* :ghpull:`13834`: Cleanup FancyArrowPatch docstring +* :ghpull:`13811`: Generate Figure method wrappers via boilerplate.py +* :ghpull:`13797`: Move sphinxext test to matplotlib.tests like everyone else. +* :ghpull:`13770`: broken_barh docstring +* :ghpull:`13757`: Remove mention of "enabling fontconfig support". +* :ghpull:`13454`: Add "c" as alias for "color" for Collections +* :ghpull:`13756`: Reorder the logic of _update_title_position. +* :ghpull:`13744`: Restructure boilerplate.py +* :ghpull:`13369`: Use default colours for examples +* :ghpull:`13697`: Delete pyplot_scales example. +* :ghpull:`13726`: Clarify a bit the implementation of blend_hsv. +* :ghpull:`13731`: Check for already running QApplication in Qt embedding example. +* :ghpull:`13736`: Deduplicate docstrings and validation for set_alpha. +* :ghpull:`13737`: Remove duplicated methods in FixedAxisArtistHelper. +* :ghpull:`13721`: Kill pyplot docstrings that get overwritten by @docstring.copy. +* :ghpull:`13690`: Cleanup hexbin. +* :ghpull:`13683`: Remove axes border for examples that list styles +* :ghpull:`13280`: Add SubplotSpec.add_subplot. +* :ghpull:`11387`: Deprecate Axes3D.w_{x,y,z}axis in favor of .{x,y,z}axis. +* :ghpull:`13671`: Suppress some warnings in tests. +* :ghpull:`13657`: DOC: fail the doc build on errors, but keep going to end +* :ghpull:`13647`: Fix FancyArrowPatch joinstyle +* :ghpull:`13637`: BLD: parameterize python_requires +* :ghpull:`13633`: plot_directive: Avoid warning if plot_formats doesn't contain 'png' +* :ghpull:`13629`: Small example simplification. +* :ghpull:`13620`: Improve watermark example +* :ghpull:`13589`: Kill Axes._connected. +* :ghpull:`13428`: free cart pendulum animation example +* :ghpull:`10487`: fixed transparency bug +* :ghpull:`13551`: Fix IndexError for pyplot.legend() when plotting empty bar chart with label +* :ghpull:`13524`: Cleanup docs for GraphicsContextBase.{get,set}_dashes. +* :ghpull:`13556`: Cleanup warnings handling in tests. +* :ghpull:`8100`: Deprecate MAXTICKS, Locator.raise_if_exceeds. +* :ghpull:`13534`: More followup to autoregistering 3d axes. +* :ghpull:`13327`: pcolorfast simplifications. +* :ghpull:`13532`: More use of cbook._check_in_list. +* :ghpull:`13520`: Register 3d projection by default. +* :ghpull:`13394`: Deduplicate some code between floating_axes and grid_helper_curvelinear. +* :ghpull:`13527`: Make SubplotSpec.num2 never None. +* :ghpull:`12249`: Replaced noqa-comments by using Axes3D.name instead of '3d' for proje… + +Issues (125): + +* :ghissue:`16487`: Add link to blog to front page +* :ghissue:`16478`: The bottom parameter of plt.hist() shifts the data as well, not just the baseline +* :ghissue:`16280`: SymLogNorm colorbar incorrect on master +* :ghissue:`16448`: Bad interaction between shared axes and pcolormesh sticky edges +* :ghissue:`16451`: InvertedLogTransform inherits from deprecated base +* :ghissue:`16420`: Error when adding colorbar to pcolormesh of a boolean array +* :ghissue:`16114`: Prose error on website (first paragraph) +* :ghissue:`8291`: Unable to pickle.load(fig) with mpl in jupyter notebook +* :ghissue:`16173`: Constrained_layout creates extra axes when used with subgridspec +* :ghissue:`16127`: nbformat 5.0.0 missing schema files +* :ghissue:`15849`: Using pandas.Timestamp in blended coordinate system of ax.annotate. +* :ghissue:`6015`: scatterplot axis autoscale fails for small data values +* :ghissue:`15806`: 3.2.0 may break some Cartopy tests +* :ghissue:`15852`: Lasso selector does not show in Jupyter notebook +* :ghissue:`15820`: Show incomplete tick labels when using mixed chinese and english characters +* :ghissue:`15770`: DOCS 2D Line label option ``_nolegend_`` is not documented +* :ghissue:`15332`: Type promotion error with datetime bins in hist +* :ghissue:`15611`: BUG: Qt5Agg window size regression +* :ghissue:`7130`: Incorrect autoscaling of polar plot limits after scatter +* :ghissue:`15576`: Multi-line ticks cause cut-offs +* :ghissue:`8609`: Clipped tick labels +* :ghissue:`15517`: antialiased image check seems wrong when used on zoomed image +* :ghissue:`13400`: Qt Embedding w/ Spyder +* :ghissue:`14724`: drawstyle parameter of line needs example +* :ghissue:`13619`: Importing matplotlib.animation prevents python script from executing in the background +* :ghissue:`14270`: Secondary axis called with [0, 1] might produce exceptions in case these are invalid data +* :ghissue:`15417`: Why is smart_bounds() being deprecated? +* :ghissue:`9778`: Blanks in colorbar just inside of 'extend' arrowpoints when using AxesGrid +* :ghissue:`15336`: DivergingNorm is a misleading name +* :ghissue:`15399`: OSError: [Errno 86] Bad CPU type in executable: 'convert' on import matplotlib.animation +* :ghissue:`15109`: matplotlib.collections inheritance diagram small/blurry +* :ghissue:`15331`: Log Scale: FloatingPointError: underflow encountered in power +* :ghissue:`15251`: Large memory growth with log scaling and linear ticking +* :ghissue:`15247`: Colorbar tick placement issues with ImageGrid and LogNorm +* :ghissue:`15306`: Footer off centre +* :ghissue:`13485`: Matplotlib NavigationToolbar2Tk disappears when reducing window size +* :ghissue:`15232`: DOC: Automatic default rcParam expansion creates misleading sentences +* :ghissue:`14141`: setting spine position on a log plot fails +* :ghissue:`15138`: Make plt.style.use accept path-like objects in addition to string +* :ghissue:`14207`: Check if point is in path or not by contains_point +* :ghissue:`13591`: Style issues when building the docs with (future) Sphinx 2.0 +* :ghissue:`8089`: Using Minute Locator to set x-axis ticks exceeds Locator.MAXTICKS +* :ghissue:`15075`: sphinxext.missing_references does not specify if it supports parallel file read. +* :ghissue:`10963`: Replace \pgfimage by \includegraphics in PGF backend +* :ghissue:`15156`: ax.text fails with positional argument error +* :ghissue:`14439`: hist() fails when all data points are np.nan +* :ghissue:`15042`: How to handle sphinx nitpicky mode +* :ghissue:`14060`: quiver(C=...) argument is not reasonably validated +* :ghissue:`11335`: TST: testing not catching bad escape sequences in doc strings +* :ghissue:`15040`: Wrong figure window size after calling fig.set_size_inches() repeatedly +* :ghissue:`15100`: Issue with creating QApplication in QT backend +* :ghissue:`14887`: kerning seems generally wrong +* :ghissue:`14800`: default tick formatter could switch to scientific notation earlier +* :ghissue:`14503`: Add a test for #14451 +* :ghissue:`14907`: ConnectionPatch across axes needs to be excluded from layout management +* :ghissue:`14911`: Removing a shared axes via ``ax.remove()`` leads to an error. +* :ghissue:`12462`: cbar.add_lines should allow manually adding lines, not just contour sets +* :ghissue:`14796`: Show user how to use Agg buffer in example +* :ghissue:`14883`: MinSize not respected using wx backend causes wxAssertionError. Bug fix included. +* :ghissue:`15014`: Wrapping of text adds leading newline character if first word is long +* :ghissue:`14918`: constrained_layout fails with hidden axis... +* :ghissue:`14981`: Barplot call crashes when called with yscale="log" and bins with h=0 +* :ghissue:`4621`: Default bottom of Stepfilled histograms should be set according to ymin +* :ghissue:`15030`: Doc build broken +* :ghissue:`8093`: set_ylim not working with plt.axis('equal') +* :ghissue:`6055`: Serious problems on the axes documentation +* :ghissue:`9979`: Axis limits are set badly with small values in scatter(). +* :ghissue:`10842`: Text bbox empty dict should be ignored +* :ghissue:`13698`: The default logit minor locator should not display tick labels +* :ghissue:`14878`: plt.yscale doesn't throw warning with invalid kwarg +* :ghissue:`5619`: Symlog linear region +* :ghissue:`14564`: Broken string interpolation +* :ghissue:`13668`: Add better error message to plt.axis() +* :ghissue:`14563`: colorbar label prints "None" when label=None +* :ghissue:`13660`: Closing a matplotlib figure with event handling occasionally causes “TypeError: isinstance()” +* :ghissue:`13033`: 'NoneType' has no attribute '_alive' when using plt in a context manager +* :ghissue:`13891`: Blurry app icon on macOS +* :ghissue:`14656`: Axes title default color +* :ghissue:`14831`: DOC: Webpage not formated correctly on gallery docs +* :ghissue:`13819`: Aspect ratio for not so common scales +* :ghissue:`8878`: Setting aspect ratio for semi-log plots +* :ghissue:`4900`: UnboundLocalError: local variable 'aspect_scale_mode' referenced before assignment +* :ghissue:`14608`: Issue with using plt.axis('equal') with plt.polar(theta,r) plot +* :ghissue:`12893`: [PyQt] NavigationToolbar2QT : Error when removing tools +* :ghissue:`14670`: indicate_inset rectangles is sensitive to axis-flipping +* :ghissue:`14362`: Add link to style examples in matplotlib.style documentation +* :ghissue:`6295`: restore_region is not documented as a method of FigureCanvas +* :ghissue:`14754`: Better pointer to dev docs on website +* :ghissue:`14744`: Savefig svg fails with "Cannot cast array data from dtype(' Date: Tue, 17 Mar 2020 17:47:44 -0400 Subject: [PATCH 107/113] Add GitHub stats for 3.2-doc changes. --- doc/users/github_stats.rst | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/doc/users/github_stats.rst b/doc/users/github_stats.rst index 88a6dc3ce23b..b334a404a5b2 100644 --- a/doc/users/github_stats.rst +++ b/doc/users/github_stats.rst @@ -7,14 +7,17 @@ GitHub stats for 2020/03/03 - 2020/03/17 (tag: v3.2.0) These lists are automatically generated, and may be incomplete or contain duplicates. -We closed 11 issues and merged 44 pull requests. +We closed 12 issues and merged 54 pull requests. The full list can be seen `on GitHub `__ +and `on GitHub `__ -The following 11 authors contributed 89 commits. +The following 13 authors contributed 158 commits. +* Amy Roberts * Antony Lee * Elliott Sales de Andrade * hannah +* Hugo van Kemenade * Jody Klymak * Kyle Sunden * MarcoGorelli @@ -26,7 +29,7 @@ The following 11 authors contributed 89 commits. GitHub issues and pull requests: -Pull Requests (44): +Pull Requests (54): * :ghpull:`15199`: MNT/TST: generalize check_figures_equal to work with pytest.marks * :ghpull:`15685`: Avoid a RuntimeError at animation shutdown with PySide2. @@ -35,10 +38,13 @@ Pull Requests (44): * :ghpull:`16648`: Document filling of Poly3DCollection * :ghpull:`16649`: Fix typo in docs * :ghpull:`16650`: Backport PR #16649 on branch v3.2.x (Fix typo in docs) +* :ghpull:`16651`: Docs: Change Python 2 note to past tense +* :ghpull:`16654`: Backport PR #16651 on branch v3.2.0-doc (Docs: Change Python 2 note to past tense) * :ghpull:`16656`: Make test_imagegrid_cbar_mode_edge less flaky. * :ghpull:`16661`: added Framework :: Matplotlib to setup * :ghpull:`16665`: Backport PR #16661 on branch v3.2.x (added Framework :: Matplotlib to setup) * :ghpull:`16671`: Fix some readme bits +* :ghpull:`16672`: Update CircleCI and add direct artifact link * :ghpull:`16682`: Avoid floating point rounding causing bezier.get_parallels to fail * :ghpull:`16690`: Backport PR #16682 on branch v3.2.x (Avoid floating point rounding causing bezier.get_parallels to fail) * :ghpull:`16693`: TST: use pytest name in naming files for check_figures_equal @@ -61,19 +67,26 @@ Pull Requests (44): * :ghpull:`16760`: Backport PR #16735 on branch v3.2.x (Make test_stem less flaky.) * :ghpull:`16761`: Backport PR #16745 on branch v3.2.x (Allow numbers to set uvc for all arrows in quiver.set_UVC, fixes #16743) * :ghpull:`16763`: Backport PR #16648 on branch v3.2.x (Document filling of Poly3DCollection) +* :ghpull:`16764`: Backport PR #16672 on branch v3.2.0-doc * :ghpull:`16765`: Backport PR #16736 on branch v3.2.x (xpdf: Set AutoRotatePages to None, not false.) * :ghpull:`16766`: Backport PR #16734 on branch v3.2.x (Disable draw_foo methods on renderer used to estimate tight extents.) * :ghpull:`16767`: Backport PR #15685 on branch v3.2.x (Avoid a RuntimeError at animation shutdown with PySide2.) * :ghpull:`16768`: Backport PR #16725 on branch v3.2.x (TST/CI: also try to run test_user_fonts_win32 on azure) * :ghpull:`16770`: Fix tuple markers +* :ghpull:`16779`: Documentation: make instructions for documentation contributions easier to find, add to requirements for building docs * :ghpull:`16784`: Update CircleCI URL for downloading humor-sans.ttf. * :ghpull:`16790`: Backport PR #16784 on branch v3.2.x (Update CircleCI URL for downloading humor-sans.ttf.) * :ghpull:`16791`: Backport PR #16770 on branch v3.2.x (Fix tuple markers) +* :ghpull:`16794`: DOC: Don't mention drawstyle in ``set_linestyle`` docs. * :ghpull:`16795`: Backport PR #15199 on branch v3.2.x (MNT/TST: generalize check_figures_equal to work with pytest.marks) * :ghpull:`16797`: Backport #15589 and #16693, fixes for check_figures_equal +* :ghpull:`16799`: Backport PR #16794 on branch v3.2.0-doc (DOC: Don't mention drawstyle in ``set_linestyle`` docs.) * :ghpull:`16800`: Fix check_figures_equal for tests that use its fixtures. +* :ghpull:`16803`: Fix some doc issues +* :ghpull:`16806`: Backport PR #16803 on branch v3.2.0-doc (Fix some doc issues) +* :ghpull:`16809`: Backport PR #16779 on branch v3.2.0-doc (Documentation: make instructions for documentation contributions easier to find, add to requirements for building docs) -Issues (11): +Issues (12): * :ghissue:`12820`: [Annotations] ValueError: lines do not intersect when computing tight bounding box containing arrow with filled paths * :ghissue:`16538`: xpdf distiller seems broken @@ -86,6 +99,7 @@ Issues (11): * :ghissue:`16731`: PGF backend + savefig.bbox results in I/O error in 3.2 * :ghissue:`16739`: a length check fails (_axes.py @ 4386): new to 3.2.0; not present in 3.1.3 * :ghissue:`16743`: Breaking change in 3.2: quiver.set_UVC does not support single numbers any more +* :ghissue:`16801`: Doc: figure for colormaps off Previous GitHub Stats From 13e21ad690cd8d66b520efb3869d49c1b57e3bee Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Tue, 17 Mar 2020 19:08:26 -0400 Subject: [PATCH 108/113] DOC: Fix broken links. --- doc/index.rst | 2 +- doc/users/prev_whats_new/whats_new_1.0.rst | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/doc/index.rst b/doc/index.rst index 19a3c9e1ca9c..6e091938979a 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -198,7 +198,7 @@ Open source Matplotlib is a Sponsored Project of NumFOCUS, a 501(c)(3) nonprofit charity in the United States. NumFOCUS provides Matplotlib with fiscal, legal, and administrative support to help ensure the health -and sustainability of the project. Visit `numfocus.org `_ for more +and sustainability of the project. Visit `numfocus.org `_ for more information. Donations to Matplotlib are managed by NumFOCUS. For donors in the diff --git a/doc/users/prev_whats_new/whats_new_1.0.rst b/doc/users/prev_whats_new/whats_new_1.0.rst index 981f8ea8a8c9..e8bb8f190bff 100644 --- a/doc/users/prev_whats_new/whats_new_1.0.rst +++ b/doc/users/prev_whats_new/whats_new_1.0.rst @@ -142,8 +142,6 @@ developers for the heavy lifting. Bugfix marathon ---------------- -Eric Firing went on a bug fixing and closing marathon, closing over -100 bugs on the `bug tracker -`__ with -help from Jae-Joon Lee, Michael Droettboom, Christoph Gohlke and -Michiel de Hoon. +Eric Firing went on a bug fixing and closing marathon, closing over 100 bugs on +the (now-closed) SourceForge bug tracker with help from Jae-Joon Lee, Michael +Droettboom, Christoph Gohlke and Michiel de Hoon. From 098d12ec37c6edacd0718f9a002e8031ccfa5f78 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 18 Mar 2020 00:05:48 -0400 Subject: [PATCH 109/113] Remove GitHub stats that aren't on this milestone. --- doc/users/github_stats.rst | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/doc/users/github_stats.rst b/doc/users/github_stats.rst index b334a404a5b2..5f127bc364bd 100644 --- a/doc/users/github_stats.rst +++ b/doc/users/github_stats.rst @@ -7,11 +7,11 @@ GitHub stats for 2020/03/03 - 2020/03/17 (tag: v3.2.0) These lists are automatically generated, and may be incomplete or contain duplicates. -We closed 12 issues and merged 54 pull requests. +We closed 11 issues and merged 52 pull requests. The full list can be seen `on GitHub `__ and `on GitHub `__ -The following 13 authors contributed 158 commits. +The following 12 authors contributed 154 commits. * Amy Roberts * Antony Lee @@ -23,13 +23,12 @@ The following 13 authors contributed 158 commits. * MarcoGorelli * Maximilian Nöthe * Sandro Tosi -* terrycojones * Thomas A Caswell * Tim Hoffmann GitHub issues and pull requests: -Pull Requests (54): +Pull Requests (52): * :ghpull:`15199`: MNT/TST: generalize check_figures_equal to work with pytest.marks * :ghpull:`15685`: Avoid a RuntimeError at animation shutdown with PySide2. @@ -49,13 +48,11 @@ Pull Requests (54): * :ghpull:`16690`: Backport PR #16682 on branch v3.2.x (Avoid floating point rounding causing bezier.get_parallels to fail) * :ghpull:`16693`: TST: use pytest name in naming files for check_figures_equal * :ghpull:`16695`: Restart pgf's latex instance after bad latex inputs. -* :ghpull:`16703`: Use ASCII hyphen in README.rst to prevent setup.py from raising UnicodeDecodeError when reading that file to set long_description * :ghpull:`16705`: Backport PR #16656 on branch v3.2.x (Make test_imagegrid_cbar_mode_edge less flaky.) * :ghpull:`16708`: Backport PR #16671: Fix some readme bits * :ghpull:`16709`: Fix saving PNGs to file objects in some places * :ghpull:`16722`: Deprecate rcParams["datapath"] in favor of mpl.get_data_path(). * :ghpull:`16725`: TST/CI: also try to run test_user_fonts_win32 on azure -* :ghpull:`16732`: Fix pgf+bbox_inches=tight combo * :ghpull:`16734`: Disable draw_foo methods on renderer used to estimate tight extents. * :ghpull:`16735`: Make test_stem less flaky. * :ghpull:`16736`: xpdf: Set AutoRotatePages to None, not false. @@ -86,7 +83,7 @@ Pull Requests (54): * :ghpull:`16806`: Backport PR #16803 on branch v3.2.0-doc (Fix some doc issues) * :ghpull:`16809`: Backport PR #16779 on branch v3.2.0-doc (Documentation: make instructions for documentation contributions easier to find, add to requirements for building docs) -Issues (12): +Issues (11): * :ghissue:`12820`: [Annotations] ValueError: lines do not intersect when computing tight bounding box containing arrow with filled paths * :ghissue:`16538`: xpdf distiller seems broken @@ -97,7 +94,6 @@ Issues (12): * :ghissue:`16704`: 3.2.0: ``setup.py clean`` fails with ``NameError: name 'long_description' is not defined`` * :ghissue:`16721`: nbAgg backend does not allow saving figures as png * :ghissue:`16731`: PGF backend + savefig.bbox results in I/O error in 3.2 -* :ghissue:`16739`: a length check fails (_axes.py @ 4386): new to 3.2.0; not present in 3.1.3 * :ghissue:`16743`: Breaking change in 3.2: quiver.set_UVC does not support single numbers any more * :ghissue:`16801`: Doc: figure for colormaps off From ca3d653536dec38a0c1ac3b80413961ca1bcdda6 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 18 Mar 2020 00:07:16 -0400 Subject: [PATCH 110/113] REL: v3.2.1 This is the first bugfix release of the 3.2.x series. This release contains several critical bug-fixes: - fix `Quiver.set_UVC` calls with scalar inputs - fix `bezier.get_parallels` failure from floating point rounding errors - fix markers specified as tuples (polygons, stars, or asterisks) - fix saving PNGs to file objects in some places - fix saving figures using the nbAgg/notebook backend - fix saving with tight layout using the PGF backend - fix setting custom datapath in rcParams (note: it is still deprecated) - fix various issues running setup.py in non-CI environments - fix xpdf distiller - various minor bug and documentation fixes From 38635f53bd7ab13a494df7a5197c7d754336aa19 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 18 Mar 2020 00:15:12 -0400 Subject: [PATCH 111/113] BLD: bump branch away from tag So the tarballs from GitHub are stable. From b573119ab40c7cdea7a5973838c371d46ab496e6 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 18 Mar 2020 01:57:58 -0400 Subject: [PATCH 112/113] Add DOIs for v3.2.x. --- doc/citing.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/citing.rst b/doc/citing.rst index 1a25d9bfefe2..b267bf845197 100644 --- a/doc/citing.rst +++ b/doc/citing.rst @@ -27,6 +27,12 @@ pp. 90-95, 2007 `_. DOIs ---- +v3.2.1 + .. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.3714460.svg + :target: https://doi.org/10.5281/zenodo.3714460 +v3.2.0 + .. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.3695547.svg + :target: https://doi.org/10.5281/zenodo.3695547 v3.1.3 .. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.3633844.svg :target: https://doi.org/10.5281/zenodo.3633844 From 2c59d6d2d4c365354eb6676c04696a7403bf0415 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 18 Mar 2020 05:13:20 -0400 Subject: [PATCH 113/113] DOC: Fix references to SymmetricalLogScale. Not sure why it didn't fail to build on this branch. --- .../prev_api_changes/api_changes_3.2.0/behavior.rst | 11 +++++------ .../api_changes_3.2.0/deprecations.rst | 7 ++++--- doc/missing-references.json | 3 --- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst b/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst index 82ad95a07eb1..0e525c1daad6 100644 --- a/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst +++ b/doc/api/prev_api_changes/api_changes_3.2.0/behavior.rst @@ -312,10 +312,9 @@ longer necessary to import mplot3d to create 3d axes with :: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Previously, `.SymLogNorm` had no *base* keyword argument and the base was -hard-coded to ``base=np.e``. This was inconsistent with the default -behavior of `.SymLogScale` (which defaults to ``base=10``) and the use -of the word "decade" in the documentation. +hard-coded to ``base=np.e``. This was inconsistent with the default behavior of +`.SymmetricalLogScale` (which defaults to ``base=10``) and the use of the word +"decade" in the documentation. -In preparation for changing the default base to 10, calling -`.SymLogNorm` without the new *base* kwarg emits a deprecation -warning. +In preparation for changing the default base to 10, calling `.SymLogNorm` +without the new *base* keyword argument emits a deprecation warning. diff --git a/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst b/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst index 0003a0643158..a788df76fdef 100644 --- a/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst +++ b/doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst @@ -232,10 +232,11 @@ deprecated. Use an explicit list instead. Scales ~~~~~~ -Passing unsupported keyword arguments to `.ScaleBase` and its subclasses -`.LinearScale`, and `.SymLogScale` is deprecated and will raise a `TypeError` in 3.3. +Passing unsupported keyword arguments to `.ScaleBase`, and its subclasses +`.LinearScale` and `.SymmetricalLogScale`, is deprecated and will raise a +`TypeError` in 3.3. -If extra kwargs are passed to `.LogScale`, `TypeError` will now be +If extra keyword arguments are passed to `.LogScale`, `TypeError` will now be raised instead of `ValueError`. Testing diff --git a/doc/missing-references.json b/doc/missing-references.json index ba4d10ccce1d..64a887324438 100644 --- a/doc/missing-references.json +++ b/doc/missing-references.json @@ -933,9 +933,6 @@ "Locator.view_limits()": [ "doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst:113" ], - "SymLogScale": [ - "doc/api/prev_api_changes/api_changes_3.2.0/deprecations.rst:224" - ], "GraphicsContextBase": [ "lib/matplotlib/backends/backend_agg.py:docstring of matplotlib.backends.backend_agg.RendererAgg.draw_text:8", "lib/matplotlib/backends/backend_cairo.py:docstring of matplotlib.backends.backend_cairo.RendererCairo.draw_image:8",