Skip to content

Fix image vlim clipping again #17636

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

Merged
merged 2 commits into from
Jun 15, 2020

Conversation

tacaswell
Copy link
Member

PR Summary

We use the Agg resampling routines to resample the user supplied data
to the number of pixels we need in the final rendering. The Agg
routines require that the input be in the range [0, 1] and it
aggressively clips input and output to that range. Thus, we rescale
the user data to [0, 1], pass it to the resampling routine and then
rescale the result back to the original range. The resampled (shape
wise) data is than passed to the user supplied norm to normalize the
data to [0, 1] (again), and then onto the color map to get to RBGA.

Due to float precision, the first re-scaling does not round-trip
exactly in all casses. The error is extremely small (8-16 orders of
magnitude smaller than the data) but for values that are exactly equal
to the user supplied vmin or vmax this can be enough to push the data
out of the "valid" gamut and be marked as "over" or "under". The
colormaps default to using the top/bottom color for the over/under
color so this is not visible, however if the user sets the over/under
colors of the cmap this issue will be visible.

closes #16910

PR Checklist

  • Has Pytest style unit tests
  • Code is Flake 8 compliant

We use the Agg resampling routines to resample the user supplied data
to the number of pixels we need in the final rendering.  The Agg
routines require that the input be in the range [0, 1] and it
aggressively clips input and output to that range.  Thus, we rescale
the user data to [0, 1], pass it to the resampling routine and then
rescale the result back to the original range.   The resampled (shape
wise) data is than passed to the user supplied norm to normalize the
data to [0, 1] (again), and then onto the color map to get to RBGA.

Due to float precision, the first re-scaling does not round-trip
exactly in all casses.  The error is extremely small (8-16 orders of
magnitude smaller than the data) but for values that are exactly equal
to the user supplied vmin or vmax this can be enough to push the data
out of the "valid" gamut and be marked as "over" or "under".  The
colormaps default to using the top/bottom color for the over/under
color so this is not visible, however if the user sets the over/under
colors of the cmap this issue will be visible.

closes matplotlib#16910
There are 7 pixels in the bi-linear interpolation that have changed by
at most 1 bit per channel.
@tacaswell tacaswell added this to the v3.4.0 milestone Jun 15, 2020
@anntzer
Copy link
Contributor

anntzer commented Jun 15, 2020

postci

@tacaswell tacaswell modified the milestones: v3.4.0, v3.3.0 Jun 15, 2020
@jklymak jklymak merged commit c3b37ca into matplotlib:master Jun 15, 2020
@tacaswell tacaswell deleted the fix_image_vlim_clipping_again branch June 15, 2020 20:36
tacaswell added a commit to tacaswell/matplotlib that referenced this pull request Sep 11, 2020
closes matplotlib#18415

We need to special case when rescaling the user input for
interpolation with LogNorm.  The issue is that due to the inherent
precision limits of floating point math we can end up with errors on
the order if 1e-18 of the overall data range when rescaling.  If the
bottom vlim is close to 0 and the top is order 10e20 than this error
can result in the rescaled vmin being negative which then fails when
we (temporarily) change the vmin/vmax on the norm.

We started adjusting the vmin/vmax to work around the same issue with
float precision in matplotlib#17636 / 3dea5c7 to make sure that values exactly
equal to the limits did not move across the boundary and get
erroneously mapped is over/under.

Long term we may want to add the ability for the norms to suggest to
their clients what the constraints on the vmin/vmax are, but
hard-coding a special case for LogNorm is the pragmatic solution.
@tacaswell tacaswell mentioned this pull request Sep 11, 2020
2 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Axes.imshow draws invalid color at value is 0 when max of 'X' not equal to vmax
3 participants