Thanks to visit codestin.com
Credit goes to github.com

Skip to content

[Bug]: pcolormesh passes alpha value down to colormap instead of alpha blending #29761

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
aw32 opened this issue Mar 16, 2025 · 4 comments
Open

Comments

@aw32
Copy link

aw32 commented Mar 16, 2025

Bug summary

Using a combination of the following:

  • pcolormesh with a set alpha parameter
  • a colormap that uses the alpha channel for color mapping
    results in the colormap using the alpha parameter from pcolormesh as a constant.

Expected result would be that all resulting values from the colormapping are additionally blended with the alpha parameter from pcolormesh.

Code for reproduction

import matplotlib.pyplot as plt
import matplotlib.colors

cdict ={'red':[(0.0, None, 1.0),
               (1.0, 1.0,  None)],
     'green': [(0.0, None, 0.0),
               (1.0, 0.0,  None)],
     'blue':  [(0.0, None, 0.0),
               (1.0, 0.0,  None)],
     'alpha': [(0.0, None, 0.0),
               (1.0,  1.0, None)]}
cmap = matplotlib.colors.LinearSegmentedColormap('custom',cdict,256)

H = [[1,2,3]]
yedges = [0,1]
xedges = [0,1,2,3]

f, (ax1, ax2) = plt.subplots(2, 1)

# case 1: no alpha, colormap defines alpha of values
ax1.pcolormesh(xedges, yedges, H, cmap=cmap)
ax1.set_title("pcolormesh without alpha parameter")

# case 2: with alpha, alpha is passed to colormap and every value has the same alpha
ax2.pcolormesh(xedges, yedges, H, cmap=cmap, alpha=0.5)
ax2.set_title("pcolormesh with alpha parameter 0.5")

plt.show()

Actual outcome

Image

Expected outcome

Image

The expected outcome is, that the "normal" output of pcolormesh is additionally alpha blended.

Additional information

This happens when an alpha parameter is passed to pcolormesh.
I suspect that the alpha parameter is passed to the colormap call, which effectively sets the colormap result alpha value to a constant.

Operating system

MacOS

Matplotlib Version

3.10.1

Matplotlib Backend

macosx

Python version

Python 3.13.1

Jupyter version

No response

Installation

pip

@greglucas
Copy link
Contributor

There was some recent discussion in #28437 about how the various alphas should interact. I think different people have different expectations for whether one should take precedence, whether we should blend, a combination of some sort. It would be good to handle this consistently throughout the library.

I do find it a bit odd that we have a colormap with alpha, but then if blend we actually get different alphas rendered. I'm thinking about the case where we add a colorbar to this only red linear alpha ramp. If we blend, the image values would not map to the colorbar values anymore because that blending stage happens later.

@jklymak
Copy link
Member

jklymak commented Mar 16, 2025

As a workaround, you can convert your data to rgba (data->norm->colormap) apply your alpha mask to the alpha channel, and pass to pcolormesh as rgba.

@timhoffm
Copy link
Member

Indeed, colormapping with alpha is problematic. In particular with the white-to-read colormap, adding alpha makes the values more whitish, which gives the impression of a value shift.

@aw32
Copy link
Author

aw32 commented Mar 18, 2025

My use case was to create multiple 2d histograms that are rendered on top of each other.
Therefore, I was confused about the resulting blended image.
After figuring out the behavior, I solved it by adjusting the maximum alpha value in the colormap instead of using the alpha parameter of pcolormesh.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants