Skip to content

ValueError: cannot convert float NaN to integer #15093

@zxdawn

Description

@zxdawn

Bug report

Bug summary

Code for reproduction

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['figure.figsize'] = 10,10

class MidpointNormalize(matplotlib.colors.Normalize):
    def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):
        self.midpoint = midpoint
        matplotlib.colors.Normalize.__init__(self, vmin, vmax, clip)

    def __call__(self, value, clip=None):
        # Note that I'm ignoring clipping and other edge cases here.
        result, is_scalar = self.process_value(value)
        x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1]
        return np.ma.array(np.interp(value, x, y), mask=result.mask, copy=False)

# make these smaller to increase the resolution
dx, dy = 0.15, 0.05

# generate 2 2d grids for the x & y bounds
y, x = np.mgrid[slice(-3, 3 + dy, dy),
                slice(-3, 3 + dx, dx)]
z = (1 - x / 2. + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)

z = z[:-1, :-1]
z_min, z_max = -np.abs(z).max(), np.abs(z).max()
z [0:2,0:2] = np.nan

plt.pcolormesh(x, y, z, cmap='seismic',norm=MidpointNormalize(midpoint=0.,vmin=-3,vmax=3))
plt.title('pcolormesh')
plt.axis([x.min(), x.max(), y.min(), y.max()])
plt.colorbar(extend='min')

plt.tight_layout(w_pad=0.1, h_pad=1)
plt.savefig('test.png', dpi = 720)

Actual outcome

E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\colorbar.py:1042: RuntimeWarning: invalid value encountered in true_divide
  z = np.take(y, i0) + (xn - np.take(b, i0)) * dy / db
E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\transforms.py:402: RuntimeWarning: invalid value encountered in double_scalars
  return points[1, 0] - points[0, 0]
Traceback (most recent call last):
  File "C:\Users\Xin\Desktop\test_extend.py", line 37, in <module>
    plt.savefig('test.png', dpi = 720)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\pyplot.py", line 689, in savefig
    res = fig.savefig(*args, **kwargs)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\figure.py", line 2094, in savefig
    self.canvas.print_figure(fname, **kwargs)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\backend_bases.py", line 2075, in print_figure
    **kwargs)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\backends\backend_agg.py", line 510, in print_png
    FigureCanvasAgg.draw(self)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\backends\backend_agg.py", line 402, in draw
    self.figure.draw(self.renderer)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\artist.py", line 50, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\figure.py", line 1649, in draw
    renderer, self, artists, self.suppressComposite)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\image.py", line 138, in _draw_list_compositing_images
    a.draw(renderer)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\artist.py", line 50, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\axes\_base.py", line 2628, in draw
    mimage._draw_list_compositing_images(renderer, self, artists)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\image.py", line 138, in _draw_list_compositing_images
    a.draw(renderer)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\artist.py", line 50, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\axis.py", line 1185, in draw
    ticks_to_draw = self._update_ticks(renderer)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\axis.py", line 1023, in _update_ticks
    tick_tups = list(self.iter_ticks())  # iter_ticks calls the locator
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\axis.py", line 967, in iter_ticks
    majorLocs = self.major.locator()
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\ticker.py", line 1985, in __call__
    return self.tick_values(vmin, vmax)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\ticker.py", line 1993, in tick_values
    locs = self._raw_ticks(vmin, vmax)
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\ticker.py", line 1932, in _raw_ticks
    nbins = np.clip(self.axis.get_tick_space(),
  File "E:\miniconda3\envs\satpy\lib\site-packages\matplotlib\axis.py", line 2159, in get_tick_space
    return int(np.floor(length / size))
ValueError: cannot convert float NaN to integer

Expected outcome

image

Tmp solution
Add the min and max of z to vmin and vmax:

plt.pcolormesh(x, y, z, vmin=z_min, vmax=z_max, cmap='seismic',norm=MidpointNormalize(midpoint=0.,vmin=-3,vmax=3))

However, it doesn't work if the vmin or vmax is beyond that:

plt.pcolormesh(x, y, z, vmin=-2, vmax=z_max, cmap='seismic',norm=MidpointNormalize(midpoint=0.,vmin=-3,vmax=3))

Matplotlib version

  • Operating system: Win 10
  • Matplotlib version: 3.0.3 (conda-forge)
  • Matplotlib backend: TkAgg
  • Python version: 3.6.7

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions