[Matplotlib-users] contourf looking ugly with transparent colors
Remo Goetschi
surf at libecciu.ch
Thu Nov 12 04:07:40 EST 2015
Hi,
Thanks for your response. Hm, are you saying there is probably no way to
work around this?
Are there other opinions?
Personally, I consider this a bug (or two bugs, since pcolormesh() has a
problem as well). It looks really ugly if you, e.g., use
semi-transparent plots as map overlays.
Cheers,
Remo
On 11.11.2015 15:53, Jens Nielsen wrote:
> The issue you are seeing is slightly different from the one the docs
> mention.
> I wrote the docs suggesting the work around and this is mainly relevant
> for vector backends (PDF and so on) The problem with PDF viewers is that
> many of them create visible gaps when two polygons are rendered next to
> each other with zero overlap. This is a viewer specific thing but lots
> of viewers suffers from this.
> This effect is much more visible that the one you see. I think the one
> you see is due to the way the edge between the 2 colours is antialiased
> by the render.
>
> The work around with adding edges is only a workaround exactly as you
> remarked because it doesn't work well with non transparent surfaces.
>
> best
> Jens
>
> On Wed, 11 Nov 2015 at 13:44 Remo Goetschi <surf at libecciu.ch
> <mailto:surf at libecciu.ch>> wrote:
>
> Hi,
>
> Does somebody know how to produce a good-looking filled contour plot
> with semi-transparent colors? If contourf() is passed a colormap with
> semi-transparent colors, it produces small gaps between the filled
> areas:
> http://i.stack.imgur.com/eEQXI.png
>
> According to the docs, this is not a bug ("contourf() [...] does not
> draw the polygon edges"). To draw the edges, it is suggested to "add
> line contours with calls to contour()". But that doesn't look good
> either as the edges become too opaque:
> http://i.stack.imgur.com/s17F9.png
> You can play with the linewidth argument of contour(), but that doesn't
> help much. Any ideas?
>
> The code that reproduces the problem is attached below (I use the
> object-oriented API, but the result is the same with pyplot).
>
> BTW, pcolormesh() suffers from a similar problem:
> http://i.stack.imgur.com/Gbwcb.png
>
> Both problems do not seem to occur with the SVG backend.
>
> I asked the same question already on stackoverflow. Feel free to respond
> there:
> http://stackoverflow.com/questions/33547926/matplotlib-filled-contour-plot-with-transparent-colors
>
> Thanks,
> Remo
>
> ---------
> import matplotlib
> import numpy as np
> from matplotlib.figure import Figure
> from matplotlib.backends.backend_agg import FigureCanvasAgg
>
> # generate some data
> shape = (100, 100)
> x_rng = np.linspace(-1, 1, shape[1])
> y_rng = np.linspace(-1, 1, shape[0])
> x, y = np.meshgrid(x_rng, y_rng)
> z = np.sqrt(x**2 + y**2)
>
> # create figure
> width_inch, height_inch = 5, 5 # results in 500x500px with dpi=100
> fig = Figure()
> fig.set_size_inches((width_inch, height_inch))
> FigureCanvasAgg(fig)
> ax = fig.add_axes([0., 0., 1., 1.])
> ax.set_axis_off()
>
> # define some colors with alpha < 1
> alpha = 0.9
> colors = [
> (0.1, 0.1, 0.5, alpha), # dark blue
> (0.0, 0.7, 0.3, alpha), # green
> (0.9, 0.2, 0.7, alpha), # pink
> (0.0, 0.0, 0.0, alpha), # black
> (0.1, 0.7, 0.7, alpha), # light blue
> ]
> cmap = matplotlib.colors.ListedColormap(colors)
> levels = np.array(np.linspace(0, z.max(), len(colors)))
> norm = matplotlib.colors.BoundaryNorm(levels, ncolors=cmap.N)
>
> # contourf plot produces small gaps between filled areas
> cnt = ax.contourf(x, y, z, levels, cmap=cmap, norm=norm,
> antialiased=True, linecolor='none')
>
> # this fills the gaps, but it makes them too opaque
> # ax.contour(x, y, z, levels, cmap=cmap, norm=norm,
> # antialiased=True)
>
> # the same is true for this trick:
> # for c in cnt.collections:
> # c.set_edgecolor("face")
>
> filename = "/tmp/contourf.png"
> fig.savefig(filename, dpi=100, transparent=True, format="png")
> print("Saved plot to {}.".format(filename))
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users at python.org <mailto:Matplotlib-users at python.org>
> https://mail.python.org/mailman/listinfo/matplotlib-users
>
More information about the Matplotlib-users
mailing list