只是想看看其他人是否认为matplotlib plot_date
中的以下行为是错误的,或者它是否只是我应该忍受的。
我有一个多面板图,我使用sharex
进行设置,以便在所有轴上进行缩放/平移,并在两个面板中绘制时间序列数据。但是,在第二个面板中,所有数据都是无效的(在本例中我将其屏蔽)。
from matplotlib.pyplot import figure,show
from datetime import datetime,timedelta
from numpy import sin,cos,linspace,pi,ma,array
fig=figure(figsize=(16,9))
ax1=fig.add_subplot(211)
ax2=fig.add_subplot(212,sharex=ax1)
# xdata is seconds
xdata=linspace(0,9999,10000)
tdata=array([datetime(2000,1,1)+timedelta(seconds=ss) for ss in xdata])
data1=ma.masked_array(sin(pi*xdata/300),mask=False)
data2=ma.masked_array(cos(pi*xdata/300),mask=True)
ax1.plot_date(tdata,data1,marker='',color='r')
ax2.plot_date(tdata,data2,marker='',color='b')
show()
我希望(更喜欢)它只是显示一个空白的面板,不会失败并给我一个长期无益的追溯。这是预期的行为吗?
注意:
ax.plot(...)
代替ax.plot_date(...)
xdata
进行绘图,而不是日期时间数组tsdata
(但我必须使用ax1.set_xlim(xdata[0],xdata[-1])
来获得合理的域名),它的工作正常(即给我一个空面板)显示):ax1.plot(xdata,data1,marker='',color='r') ax2.plot(xdata,data2,marker='',color='b') ax1.set_xlim(xdata[0],xdata[-1]) show()
ax2
命令之前强制show()
限制来挽救上面的情节。我仍然认为主要例子中的失败是不优雅的:ax2.set_xlim(tdata[0],tdata[-1]) show()
专家们的想法是什么?
谢谢!
F.Y.I。,这是在matplotlib 1.1.0上,从我的电脑上的源代码编译而来。
这是我得到的追溯:
Traceback (most recent call last):
File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/backendsbackend_gtk.py", line 395, in expose_even self._render_figure(self._pixmap, w, h) File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/backends/backend_gtkagg.py", line 75, in _render_f FigureCanvasAgg.draw(self) File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/backends/backend_agg.py", line 401, in draw self.figure.draw(self.renderer) File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/artist.py", line 55, in draw_wrapper draw(artist, renderer, *args, **kwargs) File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/figure.py", line 884, in draw func(*args) File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/artist.py", line 55, in draw_wrapper draw(artist, renderer, *args, **kwargs) File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/axes.py", line 1983, in draw a.draw(renderer) File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/artist.py", line 55, in draw_wrapper draw(artist, renderer, *args, **kwargs) File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/axis.py", line 1036, in draw ticks_to_draw = self._update_ticks(renderer) File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/axis.py", line 926, in _update_ticks tick_tups = [ t for t in self.iter_ticks()] File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/axis.py", line 873, in iter_ticks majorLocs = self.major.locator() File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/dates.py", line 749, in __call__ self.refresh() File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/dates.py", line 758, in refresh dmin, dmax = self.viewlim_to_dt() File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/dates.py", line 530, in viewlim_to_dt return num2date(vmin, self.tz), num2date(vmax, self.tz) File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/dates.py", line 289, in num2date if not cbook.iterable(x): return _from_ordinalf(x, tz) File "/home/tchubb/local/lib/python2.7/site-packages/matplotlib/dates.py", line 203, in _from_ordinalf dt = datetime.datetime.fromordinal(ix) ValueError: ordinal must be >= 1
If you suspect this is an IPython bug, please report it at:
https://github.com/ipython/ipython/issues
or send an email to the mailing list at ipython-dev@scipy.org
答案 0 :(得分:2)
是的,我会称这是一个错误,或者至少是一个看起来已被修复的疏忽(通过@ali_m https://github.com/matplotlib/matplotlib/issues/162)。
我得到了这个例外,但那是6月份的1.3.x版本(我的不好,以为我在这台电脑上有一个更新的版本)。当前主服务器没有这个问题,@ali_m报告它也可以在1.2.1和1.3.0上运行,所以我怀疑修复是为了升级你的matplotlib
版本。
正在发生的事情是,在代码中没有检查 以确定你没有检查以确保你已经给出了非空数据。
明确设置限制的原因是错误是代码永远不会试图弄清楚空数据的范围是什么。
请为此创建一个github问题(并在问题中包含回溯)。
In [7]: Traceback (most recent call last):
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/backends/backend_qt4.py", line 366, in idle_draw
self.draw()
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/backends/backend_qt4agg.py", line 148, in draw
FigureCanvasAgg.draw(self)
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/backends/backend_agg.py", line 440, in draw
self.figure.draw(self.renderer)
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/artist.py", line 54, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/figure.py", line 1027, in draw
func(*args)
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/artist.py", line 54, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/axes.py", line 2088, in draw
a.draw(renderer)
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/artist.py", line 54, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/axis.py", line 1076, in draw
ticks_to_draw = self._update_ticks(renderer)
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/axis.py", line 938, in _update_ticks
tick_tups = [t for t in self.iter_ticks()]
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/axis.py", line 882, in iter_ticks
majorLocs = self.major.locator()
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/dates.py", line 785, in __call__
self.refresh()
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/dates.py", line 794, in refresh
dmin, dmax = self.viewlim_to_dt()
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/dates.py", line 560, in viewlim_to_dt
return num2date(vmin, self.tz), num2date(vmax, self.tz)
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/dates.py", line 305, in num2date
return _from_ordinalf(x, tz)
File "/home/tcaswell/local_installs/lib/python2.7/site-packages/matplotlib-1.3.x-py2.7-linux-x86_64.egg/matplotlib/dates.py", line 208, in _from_ordinalf
dt = datetime.datetime.fromordinal(ix)
ValueError: ordinal must be >= 1