Revision: 8920 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8920&view=rev Author: efiring Date: 2011-01-16 01:00:37 +0000 (Sun, 16 Jan 2011)
Log Message: ----------- Change pcolor and contourf default antialiasing to False; closes 3151847. To avoid misplaced boundaries and artifacts with alpha < 1, we do not stroke the pcolor and contourf patch boundaries by default; but without that stroking, antialiasing produces boundary artifacts that tend to be visually disturbing. Therefore we sacrifice antialiasing for these patches. Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/axes.py branches/v1_0_maint/lib/matplotlib/contour.py Modified: branches/v1_0_maint/lib/matplotlib/axes.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/axes.py 2011-01-15 19:49:09 UTC (rev 8919) +++ branches/v1_0_maint/lib/matplotlib/axes.py 2011-01-16 01:00:37 UTC (rev 8920) @@ -6921,14 +6921,14 @@ %(PolyCollection)s - Note: the default *antialiaseds* is taken from + Note: the default *antialiaseds* is False if the default + *edgecolors*="none" is used. This eliminates artificial lines + at patch boundaries, and works regardless of the value of + alpha. If *edgecolors* is not "none", then the default + *antialiaseds* is taken from rcParams['patch.antialiased'], which defaults to *True*. - In some cases, particularly if *alpha* is 1, - you may be able to reduce rendering artifacts (light or - dark patch boundaries) by setting it to *False*. An - alternative it to set *edgecolors* to 'face'. Unfortunately, - there seems to be no single combination of parameters that - eliminates artifacts under all conditions. + Stroking the edges may be preferred if *alpha* is 1, but + will cause artifacts otherwise. """ @@ -6977,22 +6977,29 @@ C = compress(ravelmask, ma.filled(C[0:Ny-1,0:Nx-1]).ravel()) + linewidths = (0.25,) + if 'linewidth' in kwargs: + kwargs['linewidths'] = kwargs.pop('linewidth') + kwargs.setdefault('linewidths', linewidths) + if shading == 'faceted': edgecolors = 'k', else: edgecolors = 'none' - linewidths = (0.25,) - # Not sure if we want to have the following, or just trap - # invalid kwargs and raise an exception. if 'edgecolor' in kwargs: kwargs['edgecolors'] = kwargs.pop('edgecolor') - if 'linewidth' in kwargs: - kwargs['linewidths'] = kwargs.pop('linewidth') + ec = kwargs.setdefault('edgecolors', edgecolors) + + # aa setting will default via collections to patch.antialiased + # unless the boundary is not stroked, in which case the + # default will be False; with unstroked boundaries, aa + # makes artifacts that are often disturbing. if 'antialiased' in kwargs: kwargs['antialiaseds'] = kwargs.pop('antialiased') - kwargs.setdefault('edgecolors', edgecolors) - kwargs.setdefault('linewidths', linewidths) + if 'antialiaseds' not in kwargs and ec.lower() == "none": + kwargs['antialiaseds'] = False + collection = mcoll.PolyCollection(verts, **kwargs) collection.set_alpha(alpha) Modified: branches/v1_0_maint/lib/matplotlib/contour.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/contour.py 2011-01-15 19:49:09 UTC (rev 8919) +++ branches/v1_0_maint/lib/matplotlib/contour.py 2011-01-16 01:00:37 UTC (rev 8920) @@ -662,7 +662,14 @@ self.colors = kwargs.get('colors', None) norm = kwargs.get('norm', None) self.extend = kwargs.get('extend', 'neither') - self.antialiased = kwargs.get('antialiased', True) + self.antialiased = kwargs.get('antialiased', None) + if self.antialiased is None and self.filled: + self.antialiased = False # eliminate artifacts; we are not + # stroking the boundaries. + # The default for line contours will be taken from + # the LineCollection default, which uses the + # rcParams['lines.antialiased'] + self.nchunk = kwargs.get('nchunk', 0) self.locator = kwargs.get('locator', None) if (isinstance(norm, colors.LogNorm) @@ -734,11 +741,15 @@ tlinewidths = self._process_linewidths() self.tlinewidths = tlinewidths tlinestyles = self._process_linestyles() + aa = self.antialiased + if aa is not None: + aa = (self.antialiased,) for level, width, lstyle, segs in \ zip(self.levels, tlinewidths, tlinestyles, self.allsegs): # Default zorder taken from LineCollection zorder = kwargs.get('zorder', 2) col = collections.LineCollection(segs, + antialiaseds = aa, linewidths = width, linestyle = lstyle, alpha=self.alpha, @@ -1358,6 +1369,10 @@ Override axis units by specifying an instance of a :class:`matplotlib.units.ConversionInterface`. + *antialiased*: [ True | False ] + enable antialiasing, overriding the defaults. For + filled contours, the default is True. For line contours, + it is taken from rcParams['lines.antialiased']. contour-only keyword arguments: @@ -1385,9 +1400,6 @@ contourf-only keyword arguments: - *antialiased*: [ True | False ] - enable antialiasing - *nchunk*: [ 0 | integer ] If 0, no subdivision of the domain. Specify a positive integer to divide the domain into subdomains of roughly *nchunk* by *nchunk* This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Protect Your Site and Customers from Malware Attacks Learn about various malware tactics and how to avoid them. Understand malware threats, the impact they can have on your business, and how you can protect your company and customers by using code signing. http://p.sf.net/sfu/oracle-sfdevnl _______________________________________________ Matplotlib-checkins mailing list Matplotlib-checkins@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins