From 4f2ecf2ba0f8861e89a6841af5f99add873db3b3 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 27 Mar 2013 11:50:45 -0400 Subject: [PATCH 1/2] Fixes #1860: Unfilled members of collections are not handled correctly in the PDF backend. Also fixes a related bug that alpha could not be set on individual members of a collection. --- lib/matplotlib/backend_bases.py | 20 +- lib/matplotlib/backends/backend_pdf.py | 30 +- .../test_axes/mixed_collection.pdf | Bin 0 -> 2365 bytes .../test_axes/mixed_collection.png | Bin 0 -> 39641 bytes .../test_axes/mixed_collection.svg | 342 ++++++++++++++++++ lib/matplotlib/tests/test_axes.py | 32 ++ 6 files changed, 416 insertions(+), 8 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/mixed_collection.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/mixed_collection.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/mixed_collection.svg diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 18046336741d..52190fe0295f 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -352,6 +352,8 @@ def _iter_collection(self, gc, master_transform, all_transforms, gc0 = self.new_gc() gc0.copy_properties(gc) + original_alpha = gc.get_alpha() + if Nfacecolors == 0: rgbFace = None @@ -374,22 +376,28 @@ def _iter_collection(self, gc, master_transform, all_transforms, yo = -(yp - yo) if not (np.isfinite(xo) and np.isfinite(yo)): continue + gc0.set_alpha(original_alpha) if Nfacecolors: rgbFace = facecolors[i % Nfacecolors] if Nedgecolors: - fg = edgecolors[i % Nedgecolors] - if Nfacecolors == 0 and len(fg)==4: - gc0.set_alpha(fg[3]) - gc0.set_foreground(fg) if Nlinewidths: gc0.set_linewidth(linewidths[i % Nlinewidths]) if Nlinestyles: gc0.set_dashes(*linestyles[i % Nlinestyles]) - if rgbFace is not None and len(rgbFace)==4: + fg = edgecolors[i % Nedgecolors] + if len(fg) == 4: + if fg[3] == 0.0: + gc0.set_linewidth(0) + else: + gc0.set_alpha(gc0.get_alpha() * fg[3]) + gc0.set_foreground(fg[:3]) + else: + gc0.set_foreground(fg) + if rgbFace is not None and len(rgbFace) == 4: if rgbFace[3] == 0: rgbFace = None else: - gc0.set_alpha(rgbFace[3]) + gc0.set_alpha(gc0.get_alpha() * rgbFace[3]) rgbFace = rgbFace[:3] gc0.set_antialiased(antialiaseds[i % Naa]) if Nurls: diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index 4ff617c307f1..6373aca6d2aa 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -1523,10 +1523,36 @@ def draw_path_collection(self, gc, master_transform, paths, all_transforms, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds, urls, offset_position): + # We can only reuse the objects if the presence of fill and + # stroke (and the amount of alpha for each) is the same for + # all of them + can_do_optimization = True + + if not len(facecolors): + filled = False + else: + if np.all(facecolors[:, 3] == facecolors[0, 3]): + filled = facecolors[0, 3] != 0.0 + else: + can_do_optimization = False + + if not len(edgecolors): + stroked = False + else: + if np.all(edgecolors[:, 3] == edgecolors[0, 3]): + stroked = edgecolors[0, 3] != 0.0 + else: + can_do_optimization = False + + if not can_do_optimization: + return RendererBase.draw_path_collection( + self, gc, master_transform, paths, all_transforms, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds, urls, + offset_position) + padding = np.max(linewidths) path_codes = [] - filled = len(facecolors) - stroked = len(edgecolors) for i, (path, transform) in enumerate(self._iter_collection_raw_paths( master_transform, paths, all_transforms)): name = self.file.pathCollectionObject( diff --git a/lib/matplotlib/tests/baseline_images/test_axes/mixed_collection.pdf b/lib/matplotlib/tests/baseline_images/test_axes/mixed_collection.pdf new file mode 100644 index 0000000000000000000000000000000000000000..22879f1e141ce2c66e7d37c2319cbd1844f54706 GIT binary patch literal 2365 zcmZuzdsGuw8rM_TQzEkMVgc7Gw+B)1k<8=?K7b}676_0HL0BxU$z*^a$%JH39tv)4 z#ih!Y*u?^}Rzw~pU`Us0DYgQFghi2KfdfZ_+DciF`Tzm<#okGXSm^wbnftrn{a*L` zeqX#LLeW-~&Zc=AZ-bgf8VV3VD3WPAb^wMfLyH53Ku*e2h(y4U$P;lrU_t>Y2ne9z z8YLy@_tJsbNJTP^k$`8Dfd@zu*J%KUTGAL29f3vRB-jI02}Mvno=yTrh#IQp&%Fh6 z?+_3V7{Te}t|(GY;(%>e5S1iXsx*m!YgaEKG$dfzzUSRR5ePT}*rg-Vw15gl5Cs@Q ze7_3ArMsXpxRUAQ8ogGo!!=ljBUHP5KmZjh+#v12(iq{mQYGgT>CkmbJ%`5yY!;L9 zQHtw{G#v)>Lghi~P(-B)8ifu*EqdT@+naZiT049csZwB)07H}lBNgHpp@b*JxF(TI z0w{GGwq)x`9WGbX(odf#49kD>E$5)=(;v7ZUp;5I1}FR0h|L{KGp7QAY*xK_v8yCa>qBnN%#OzkIStNz!vW6-@u`D#eT(GkOcC$48VbT<|GJ?o6LE;DWD@J`}#S_}JeipA5;f*t6fPCUVWWguY-?cjF(=SRNEh^EfA(myDQ% zLeDRq|8<`^vue|aGBMDl@Wo#TnLLivytdEfRdjIk_IqoW35^Zl(a8+dN4B}*3jOJ% z!u0gCfxljSs3VVzE;?Xr%DQ{?bpN?!b+WD{ZP$2K$qkp}C3)wM4qsol;z_&gq3_%Qr>5yYxj#B0EAw*x=+4H0)IB{CT7KxJHrLMV#GGTN62A*u zdPN%1qrE#~7-%5`UfbiXh68a#_tZcMuVGu8IVN+3b+Ruu>!;3fn3Sd;+#g=}tK0eS zkMmQpKg6%8S!s6PgQboawm+2gzJ?Gm@JyS9G)P;m)Y=@fLAK9SG*vhtbF zhYj@+R!Pg{Pby=}Z-!yD&1>ooPlo>^;?((1!>|)hCSKoHWzA+@-+-q$3sd)K&2d=m zy^CiHO6i1Ud+o)PzF18w&sCzKPiKExGj>#PHIC zV~O>$xb^~O*ef1+%=l<=Lx|fGfu&Atu0Hu@vEj!WtLuMgWU!@fQ}y8beI%>t?A%U3 znJ!!wx(aVJ3J;UY1fS5fX#d^~MI#+uk_`jjhq#1W9xN~IuQrT*lv&bWV+iZL)_0(9 z#YE=M!mRVZ?>%injqm=Quifo`e{f+_nMfVg5WtZHtsr{Im$9IMHEAf&g?OkJl0&z>@?N~Ci$3hN`djzrYli)+_Nts`mcG&Y@Yv&g_o}*% z2VJ8XAH;oDE)REWV6Xh?&;I6)!*@)U?I$d2U2dM;hzMQDW7%<>U#VH!)DhVuMjMK8dZ95~w+Vmvs*7GNwkOvXZt z3p;Ef=C{ZOf^ZjOEZ!o02ow1gUs#JVHVXS~fn7h&OEyTIT$O_BZ2xmYGzkQ--6R~~ iQi7lgz&6aIRGBzTqP<<@I?|R_CUlnO?HwE`qWvEhyK+hZ literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/mixed_collection.png b/lib/matplotlib/tests/baseline_images/test_axes/mixed_collection.png new file mode 100644 index 0000000000000000000000000000000000000000..990e886b6a7076add5dec78f0172cf352c46c956 GIT binary patch literal 39641 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index c54a7a4cc36e..38377fabb06f 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1058,3 +1058,35 @@ def test_eb_line_zorder(): ax.axhline(-j, lw=5, color='k', zorder=j) ax.set_title("errorbar zorder test") + + +@image_comparison(baseline_images=['mixed_collection'], remove_text=True) +def test_mixed_collection(): + from matplotlib import patches + from matplotlib import collections + + x = range(10) + + # First illustrate basic pyplot interface, using defaults where possible. + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + + c = patches.Circle((8, 8), radius=4, facecolor='none', edgecolor='green') + + # PDF can optimize this one + p1 = collections.PatchCollection([c], match_original=True) + p1.set_offsets([[0, 0], [24, 24]]) + p1.set_linewidths([1, 5]) + + # PDF can't optimize this one, because the alpha of the edge changes + p2 = collections.PatchCollection([c], match_original=True) + p2.set_offsets([[48, 0], [-32, -16]]) + p2.set_linewidths([1, 5]) + p2.set_edgecolors([[0, 0, 0.1, 1.0], [0, 0, 0.1, 0.5]]) + + ax.patch.set_color('0.5') + ax.add_collection(p1) + ax.add_collection(p2) + + ax.set_xlim(0, 16) + ax.set_ylim(0, 16) From ae318776a1616834f76c75ee0c9404b2d47d6855 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 28 Mar 2013 08:31:25 -0400 Subject: [PATCH 2/2] Document change to collections. --- doc/users/whats_new.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/doc/users/whats_new.rst b/doc/users/whats_new.rst index bfc927c7b0cd..34fd38713bec 100644 --- a/doc/users/whats_new.rst +++ b/doc/users/whats_new.rst @@ -17,6 +17,18 @@ revision, see the :ref:`github-stats`. .. contents:: Table of Contents +.. _whats-new-1-2-2: + +new in matplotlib 1.2.2 +======================= + +Improved collections +-------------------- + +The individual items of a collection may now have different alpha +values and be rendered correctly. This also fixes a bug where +collections were always filled in the PDF backend. + .. _whats-new-1-2: new in matplotlib-1.2