用matplotlib绘制numpy datetime64 [英] Plot numpy datetime64 with matplotlib
问题描述
array ([2011-11-15 01:08:11,2011-11-16 02:08:04,...,2012-07-07 11:08:00],dtype = datetime64 [us])
和整数数据的长度和维数相同的其他数组。
我想在matplotlib时间vs数据中绘制一个情节。如果我直接输入数据,这是我得到的:
plot(timeSeries,data)
有没有办法获得时间更自然的单位?例如在这种情况下,几个月/年会很好。
编辑:
我尝试过Gustav Larsson的建议,但是我收到一个错误:
Out [128]:
[< matplotlib.lines.Line2D at 0x419aad0>]
----- -------------------------------------------------- --------------------
OverflowError追溯(最近的最后一次调用)
/usr/lib/python2.7/dist-packages/IPython /zmq/pylab/backend_inline.pyc在显示(关闭)
100 try:
101 for gsf.get_all_fig_managers()中的figure_manager:
- > 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在send_figure(图)
209
210 fmt = InlineBackend.instance()。figure_format
- > 211 data = print_figure(fig,fmt )
212#print_figure将返回None,如果没有任何内容可以绘制:
213如果数据为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 print_figure(self,filename,dpi,facecolor,edgecolor,orientation,format,** kwargs)
1981 orient ation = orientation,
1982 dryrun = True,
- > 1983 ** kwargs)
1984 renderer = self.figure._cachedRenderer
1985 bbox_inches = self.figure.get_tightbbox(renderer)
/usr/lib/pymodules/python2.7 print_png中的/matplotlib/backends/backend_agg.pyc(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/ backend / 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画幅(艺术家,渲染器,* 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 (艺术家,渲染者,* args,** kwargs)
53 def draw_wrapper(artist,renderer,* args,** kwargs):
54 before(artist,renderer)
--- > 55画幅(艺术家,渲染器,* 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 (艺术家,渲染器,* args,** kwargs)
53 def draw_wrapper(artist,renderer,* args,** kwargs):
54 before(artist,renderer)
- - > 55画幅(艺术家,渲染器,* 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/ _update_ticks(self,renderer)中的matplotlib / axis.pyc
929
930 interval = self.get_view_interval()
- > 931 tick_tups = [t for self in the self.iter_ticks()]
932 if self._smart_bounds:
933#handle inverted limits
/ usr / lib / pymodules / python2。 7 / matplotlib / axis.pyc在iter_ticks(self)
876通过所有主要和次要的ticks迭代。
877
- > 878 majorLocs = self.major.locator()
879 majorTicks = self.get_major_ticks(len(majorLocs))
880 self.major .formatter.set_locs(majorLocs)
__call __(self)
$ usb / lib / pymodules/python2.7/matplotlib/dates.pyc
747 def __call __(self):
748'返回蜱的位置
- > 749 self.refresh()
750 return self._locator()
751
/ usr /lib/pymodules/python2.7/matplotlib/dates.pyc在刷新(自)
756 def refresh(self):
757'根据当前限制刷新内部信息'
- - > 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如果tz是None:tz = _get_rc_timezone()
- > 289如果不是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如果tz为None:tz = _get_rc_timezone()
202 ix = int(x)
- > 203 dt = datetime.datetime.fromordinal(ix)
204余数= float(x) - ix
205小时,余数= divmod(24 *余数,1)
OverflowError:signed integer大于最大
这可能是一个错误吗?我也尝试过一些简单的东西:
import matplotlib.pyplo t 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(日期,数据)
plt.show()
我仍然收到此错误:
OverflowError:有符号整数大于最大
我不明白我做错了什么ipython 0.13,matplotlib 1.1,Ubuntu 12.04 x64。
最终编辑:
似乎matplotlib不支持 dtype = datetime64
,所以我需要将 timeSeries
转换为普通的 datetime.datetime
从 datetime
。
from datetime import datetime
a = np.datetime64('2002-06-28')。astype(datetime)
plot_date(a,2)
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)
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
.
from datetime import datetime
a=np.datetime64('2002-06-28').astype(datetime)
plot_date(a,2)
这篇关于用matplotlib绘制numpy datetime64的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!