GLMakie: masking values when plotting images

I’m using GLMakie to display 2 images.
GLMakie.image!(GLMakie.rotr90(some_extra_data), colormap=(“viridis”, 0.5))

The second image have a transparency of 0.5. See here: GLMakie: how to plot two images with transparency?
some_extra_data contains good values and also invalid values. Invalid values are equal to zero.

What I want to achieve is to mask the invalid values in some_extra_data such that they are not displayed at all. Only the valid values shall be displayed. In python this can be achieved via matplotlib and
So, how to do this masking with GLMakie?

NaN values are transparent by default, so you can replace the invalid numbers with NaNs

Replacing with NaN doesn’t work, I have tried the following:

some_with_nan = [e == 0 ? NaN : e for e in some_extra_data]
GLMakie.image!(GLMakie.rotr90(some_with_nan ), colormap=(“viridis”, 0.5))

I have tried to use heatmap for “some_with_nan”. And there indeed NaN values are transparent when I only display the heatmap. But the problem is that I can no longer display heatmap “some_with_nan” over “image_data”.

It seems to me that nan_color option in GLMakie.image is not implemented yet. I have opened an issue: nan_color does not work

I have managed to overlap “image” and “heatmap” by setting a transparency value to the “image” as well.
image(rotr90(image_data), colormap=(:gray1, 0.5))
image!(rotr90(some_with_nan ), colormap=(:viridis, 0.5))

This is how the output looks like, currently. To be improved.

1 Like

With some extra tweaks, I have reached the desired output. Instead of GLMakie.image I have used GLMakie.heatmap also for the image data, in order to get transparency for the image as well, see bellow.

some_extra_data_nan = [e == 0 ? NaN : e for e in some_extra_data]

img_data2 = img_data/256
img_data2[some_extra_data .!= 0] .= NaN

img_data3 = imr_wide.img_data/256.0
img_data3[some_extra_data .== 0] .= NaN

# where extra data is invalid, show the image, no transparency
heatmap(rotr90(img_data2), colormap=:gray1)
# where the extra data is valid, show the image with 0.5 transparency
heatmap!(rotr90(img_data3), colormap=(:gray1, 0.5)) 
# show the extra data
heatmap!(rotr90(some_extra_data_nan), colormap=(:viridis, 0.5)) 

Here is the output: