Skip to content
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

pyplot plot raises ValueError when plotting NaN against datetime dates #14034

Closed
c-johan-s opened this issue Apr 25, 2019 · 1 comment
Closed
Milestone

Comments

@c-johan-s
Copy link

Bug report

Bug summary

Plotting a series of NaN normally works fine, like : plt.plot([1,2],[np.nan, np.nan]). But if instead plotted against a list of datetime date objects, like plt.plot([datetime.date(2019,1,1), datetime.date(2019,1,2)], [np.nan, np.nan]) a ValueError is raised with a message that I did not find intuitive.

Code for reproduction

import matplotlib.pyplot as plt
import datetime
import numpy as np
plt.plot([datetime.date(2019,1,1), datetime.date(2019,1,2)], [np.nan, np.nan])

Actual outcome

Out[8]: [<matplotlib.lines.Line2D at 0x25eacabbc18>]
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\tkinter\__init__.py", line 749, in callit
    func(*args)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\backends\_backend_tk.py", line 346, in idle_draw
    self.draw()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 9, in draw
    super(FigureCanvasTkAgg, self).draw()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\backends\backend_agg.py", line 402, in draw
    self.figure.draw(self.renderer)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\artist.py", line 50, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\figure.py", line 1649, in draw
    renderer, self, artists, self.suppressComposite)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\image.py", line 138, in _draw_list_compositing_images
    a.draw(renderer)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\artist.py", line 50, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\axes\_base.py", line 2610, in draw
    mimage._draw_list_compositing_images(renderer, self, artists)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\image.py", line 138, in _draw_list_compositing_images
    a.draw(renderer)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\artist.py", line 50, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\axis.py", line 1185, in draw
    ticks_to_draw = self._update_ticks(renderer)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\axis.py", line 1023, in _update_ticks
    tick_tups = list(self.iter_ticks())  # iter_ticks calls the locator
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\axis.py", line 967, in iter_ticks
    majorLocs = self.major.locator()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\dates.py", line 1230, in __call__
    self.refresh()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\dates.py", line 1250, in refresh
    dmin, dmax = self.viewlim_to_dt()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\dates.py", line 1001, in viewlim_to_dt
    .format(vmin))
ValueError: view limit minimum -0.001 is less than 1 and is an invalid Matplotlib date value. This often happens if you pass a non-datetime value to an axis that has datetime units
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\backends\_backend_tk.py", line 267, in resize
    self.draw()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 9, in draw
    super(FigureCanvasTkAgg, self).draw()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\backends\backend_agg.py", line 402, in draw
    self.figure.draw(self.renderer)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\artist.py", line 50, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\figure.py", line 1649, in draw
    renderer, self, artists, self.suppressComposite)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\image.py", line 138, in _draw_list_compositing_images
    a.draw(renderer)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\artist.py", line 50, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\axes\_base.py", line 2610, in draw
    mimage._draw_list_compositing_images(renderer, self, artists)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\image.py", line 138, in _draw_list_compositing_images
    a.draw(renderer)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\artist.py", line 50, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\axis.py", line 1185, in draw
    ticks_to_draw = self._update_ticks(renderer)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\axis.py", line 1023, in _update_ticks
    tick_tups = list(self.iter_ticks())  # iter_ticks calls the locator
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\axis.py", line 967, in iter_ticks
    majorLocs = self.major.locator()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\dates.py", line 1230, in __call__
    self.refresh()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\dates.py", line 1250, in refresh
    dmin, dmax = self.viewlim_to_dt()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\dates.py", line 1001, in viewlim_to_dt
    .format(vmin))
ValueError: view limit minimum -0.001 is less than 1 and is an invalid Matplotlib date value. This often happens if you pass a non-datetime value to an axis that has datetime units
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\tkinter\__init__.py", line 749, in callit
    func(*args)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\backends\_backend_tk.py", line 346, in idle_draw
    self.draw()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 9, in draw
    super(FigureCanvasTkAgg, self).draw()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\backends\backend_agg.py", line 402, in draw
    self.figure.draw(self.renderer)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\artist.py", line 50, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\figure.py", line 1649, in draw
    renderer, self, artists, self.suppressComposite)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\image.py", line 138, in _draw_list_compositing_images
    a.draw(renderer)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\artist.py", line 50, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\axes\_base.py", line 2610, in draw
    mimage._draw_list_compositing_images(renderer, self, artists)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\image.py", line 138, in _draw_list_compositing_images
    a.draw(renderer)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\artist.py", line 50, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\axis.py", line 1185, in draw
    ticks_to_draw = self._update_ticks(renderer)
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\axis.py", line 1023, in _update_ticks
    tick_tups = list(self.iter_ticks())  # iter_ticks calls the locator
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\axis.py", line 967, in iter_ticks
    majorLocs = self.major.locator()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\dates.py", line 1230, in __call__
    self.refresh()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\dates.py", line 1250, in refresh
    dmin, dmax = self.viewlim_to_dt()
  File "C:\Python\WinPython\WPy-3710\python-3.7.1.amd64\lib\site-packages\matplotlib\dates.py", line 1001, in viewlim_to_dt
    .format(vmin))
ValueError: view limit minimum -0.001 is less than 1 and is an invalid Matplotlib date value. This often happens if you pass a non-datetime value to an axis that has datetime units

Expected outcome
I would expect this to work in a similar way as if I would have run:

plt.plot([1, 2], [np.nan, np.nan])

Matplotlib version

  • Operating system: Windows 10
  • Matplotlib version: 3.0.1
  • Matplotlib backend (print(matplotlib.get_backend())): TkAgg
  • Python version: 3.7.1
  • Jupyter version (if applicable):
  • Other libraries:
@dstansby
Copy link
Member

It looks like this is working fine on the current up to date master branch, so is definitely going to be fixed in 3.1 which should be released soon.

@dstansby dstansby added this to the v3.1.0 milestone Apr 25, 2019
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

No branches or pull requests

2 participants