Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plot numpy datetime64 with matplotlib

Tags:

I have two numpy arrays 1D, one is time of measurement in datetime64 format, for example:

array([2011-11-15 01:08:11, 2011-11-16 02:08:04, ..., 2012-07-07 11:08:00], dtype=datetime64[us]) 

and other array of same length and dimension with integer data.
I'd like to make a plot in matplotlib time vs data. If I put the data directly, this is what I get:

plot(timeSeries, data) 

enter image description here

Is there a way to get time in more natural units? For example in this case months/year would be fine.

EDIT:
I have tried Gustav Larsson's suggestion however I get an error:

Out[128]: [<matplotlib.lines.Line2D at 0x419aad0>] --------------------------------------------------------------------------- OverflowError                             Traceback (most recent call last) /usr/lib/python2.7/dist-packages/IPython/zmq/pylab/backend_inline.pyc in show(close)     100     try:     101         for figure_manager in Gcf.get_all_fig_managers(): --> 102             send_figure(figure_manager.canvas.figure)     103     finally:     104         show._to_draw = []  /usr/lib/python2.7/dist-packages/IPython/zmq/pylab/backend_inline.pyc in send_figure(fig)     209     """     210     fmt = InlineBackend.instance().figure_format --> 211     data = print_figure(fig, fmt)     212     # print_figure will return None if there's nothing to draw:     213     if data is None:  /usr/lib/python2.7/dist-packages/IPython/core/pylabtools.pyc in print_figure(fig, fmt)     102     try:     103         bytes_io = BytesIO() --> 104         fig.canvas.print_figure(bytes_io, format=fmt, bbox_inches='tight')     105         data = bytes_io.getvalue()     106     finally:  /usr/lib/pymodules/python2.7/matplotlib/backend_bases.pyc in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs)    1981                     orientation=orientation,    1982                     dryrun=True, -> 1983                     **kwargs)    1984                 renderer = self.figure._cachedRenderer    1985                 bbox_inches = self.figure.get_tightbbox(renderer)  /usr/lib/pymodules/python2.7/matplotlib/backends/backend_agg.pyc in print_png(self, filename_or_obj, *args, **kwargs)     467      468     def print_png(self, filename_or_obj, *args, **kwargs): --> 469         FigureCanvasAgg.draw(self)     470         renderer = self.get_renderer()     471         original_dpi = renderer.dpi  /usr/lib/pymodules/python2.7/matplotlib/backends/backend_agg.pyc in draw(self)     419      420         try: --> 421             self.figure.draw(self.renderer)     422         finally:     423             RendererAgg.lock.release()  /usr/lib/pymodules/python2.7/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)      53     def draw_wrapper(artist, renderer, *args, **kwargs):      54         before(artist, renderer) ---> 55         draw(artist, renderer, *args, **kwargs)      56         after(artist, renderer)      57   /usr/lib/pymodules/python2.7/matplotlib/figure.pyc in draw(self, renderer)     896         dsu.sort(key=itemgetter(0))     897         for zorder, a, func, args in dsu: --> 898             func(*args)     899      900         renderer.close_group('figure')  /usr/lib/pymodules/python2.7/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)      53     def draw_wrapper(artist, renderer, *args, **kwargs):      54         before(artist, renderer) ---> 55         draw(artist, renderer, *args, **kwargs)      56         after(artist, renderer)      57   /usr/lib/pymodules/python2.7/matplotlib/axes.pyc in draw(self, renderer, inframe)    1995     1996         for zorder, a in dsu: -> 1997             a.draw(renderer)    1998     1999         renderer.close_group('axes')  /usr/lib/pymodules/python2.7/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)      53     def draw_wrapper(artist, renderer, *args, **kwargs):      54         before(artist, renderer) ---> 55         draw(artist, renderer, *args, **kwargs)      56         after(artist, renderer)      57   /usr/lib/pymodules/python2.7/matplotlib/axis.pyc in draw(self, renderer, *args, **kwargs)    1039         renderer.open_group(__name__)    1040  -> 1041         ticks_to_draw = self._update_ticks(renderer)    1042         ticklabelBoxes, ticklabelBoxes2 = self._get_tick_bboxes(ticks_to_draw, renderer)    1043   /usr/lib/pymodules/python2.7/matplotlib/axis.pyc in _update_ticks(self, renderer)     929      930         interval = self.get_view_interval() --> 931         tick_tups = [ t for t in self.iter_ticks()]     932         if self._smart_bounds:     933             # handle inverted limits  /usr/lib/pymodules/python2.7/matplotlib/axis.pyc in iter_ticks(self)     876         Iterate through all of the major and minor ticks.     877         """ --> 878         majorLocs = self.major.locator()     879         majorTicks = self.get_major_ticks(len(majorLocs))     880         self.major.formatter.set_locs(majorLocs)  /usr/lib/pymodules/python2.7/matplotlib/dates.pyc in __call__(self)     747     def __call__(self):     748         'Return the locations of the ticks' --> 749         self.refresh()     750         return self._locator()     751   /usr/lib/pymodules/python2.7/matplotlib/dates.pyc in refresh(self)     756     def refresh(self):     757         'Refresh internal information based on current limits.' --> 758         dmin, dmax = self.viewlim_to_dt()     759         self._locator = self.get_locator(dmin, dmax)     760   /usr/lib/pymodules/python2.7/matplotlib/dates.pyc in viewlim_to_dt(self)     528     def viewlim_to_dt(self):     529         vmin, vmax = self.axis.get_view_interval() --> 530         return num2date(vmin, self.tz), num2date(vmax, self.tz)     531      532     def _get_unit(self):  /usr/lib/pymodules/python2.7/matplotlib/dates.pyc in num2date(x, tz)     287     """     288     if tz is None: tz = _get_rc_timezone() --> 289     if not cbook.iterable(x): return _from_ordinalf(x, tz)     290     else: return [_from_ordinalf(val, tz) for val in x]     291   /usr/lib/pymodules/python2.7/matplotlib/dates.pyc in _from_ordinalf(x, tz)     201     if tz is None: tz = _get_rc_timezone()     202     ix = int(x) --> 203     dt = datetime.datetime.fromordinal(ix)     204     remainder = float(x) - ix     205     hour, remainder = divmod(24*remainder, 1)  OverflowError: signed integer is greater than maximum 

Could this be an bug? Or am I missing something. I also tried something simple:

import matplotlib.pyplot as plt import numpy as np dates=np.array(["2011-11-13", "2011-11-14", "2011-11-15", "2011-11-16", "2011-11-19"], dtype='datetime64[us]') data=np.array([1, 2, 3, 4, 5]) plt.plot_date(dates, data) plt.show() 

I still get this error:

OverflowError: signed integer is greater than maximum 

I don't understand what am I doing wrong. ipython 0.13, matplotlib 1.1, Ubuntu 12.04 x64.

FINAL EDIT:
It seems that matplotlib doesn't support dtype=datetime64, so I needed to convert the timeSeries to ordinary datetime.datetime from datetime.

like image 464
enedene Avatar asked Jul 07 '12 15:07

enedene


People also ask

How do I plot a time series in Matplotlib?

A basic time series plot is obtained the same way than any other line plot -- with plt. plot(x, y) or ax. plot(x, y) . The only difference is that now x isn't just a numeric variable, but a date variable that Matplotlib recognizes as such.

What is datetime64 in Python?

The datetime64 function in python allows the array representation of dates to the user. It takes the input in a particular format. Below given is the basic syntax of using the datetime64 function in a Python program: numpy.datetime64('dates') Output generated by the datetime64 function is in 'yyyy-mm-dd' format.

How do I convert datetime64 to datetime?

Step 2: Create a Sample date in the format datetime64. Then an array of datetime64 type. After that, You can create datetime64 format using the numpy. datetime64() format. To convert it to datetime format then you have to use astype() method and just pass the datetime as an argument.


2 Answers

from datetime import datetime a=np.datetime64('2002-06-28').astype(datetime) plot_date(a,2) 
like image 92
kidnakyo Avatar answered Oct 30 '22 18:10

kidnakyo


You might want to try this:

plot_date(timeSeries, data) 

By default, the x axis will be considered a date axis, and y a regular one. This can be customized.

like image 38
Gustav Larsson Avatar answered Oct 30 '22 17:10

Gustav Larsson