我试图在pandas数据框中绘制数据,使用索引(日期和时间)作为x轴,将数据框中的其余数据作为实际数据。以下是我现在正在尝试的内容:
from matplotlib.finance import candlestick2
bars[['open','high','low','close']].head()
tickdatetime open high low close
2012-09-20 09:00:00 1447.50 1447.50 1447.00 1447.00
2012-09-20 09:01:00 1447.00 1447.25 1447.00 1447.25
2012-09-20 09:02:00 1447.25 1447.75 1447.25 1447.50
2012-09-20 09:03:00 1447.75 1447.75 1447.25 1447.50
2012-09-20 09:04:00 1447.25 1447.50 1447.25 1447.50
fig,ax = plt.subplots()
ax.plot_date(bars.ix.to_pydatetime(), s, 'v-')
fig,ax = plt.subplots()
ax.plot_date(bars.ix.to_pydatetime(), s, 'v-')
ax = fig.add_axes([0.1, 0.2, 0.85, 0.7])
ax.autoscale_view()
linecol, rectcol = candlestick2(ax,bars['open'],bars['close'],bars['high'],bars['low'],width=.5,colorup='g',colordown''r',alpha=1)
z = rectcol.get_zorder()
linecol.set_zorder(0.9*z)
但是我收到了这个错误:
AttributeError Traceback (most recent call last)
<ipython-input-57-d62385067ceb> in <module>()
1 fig,ax = plt.subplots()
----> 2 ax.plot_date(bars.ix.to_pydatetime(), s, 'v-')
3
4 #ax = fig.add_axes([0.1, 0.2, 0.85, 0.7])
5 ax.autoscale_view()
AttributeError: '_NDFrameIndexer' object has no attribute 'to_pydatetime'
据我所知,bars.plot()是一个很好的自动处理它的界面,但我希望能够做一些像使用烛台2,更多子图等的东西。
我认为问题的根源只是试图从数据框中获取索引值,并将索引值转换为日期时间,但我还没有能够做到这一点。
感谢任何想法!
答案 0 :(得分:5)
正如Chang She所说,bars.index
是你想要的,而不是bars.ix
。 bars.index
返回一个Index对象,该对象本质上是带有索引的Series。这就是你想要的。 bars.ix返回一个_NDFrameIndexer,这看起来很难记录,但它是整个DataFrame的某种视图(例如,try bars.ix[2]
)。
在代码中用bars.index替换bars.ix将删除错误(如果你还删除了造成无法匹配的错误'),并在前两个子图上做日期标记。但是,值得注意的是它不会在你的烛台图上做日期标记:你的代码不会这样做,虽然使用bars.index它肯定可以毫不费力地完成。
但是,如果你想在烛台2上绘制日期标记,那就更难了。这里的问题是烛台2,你可以通过输入它看到的东西,根本不使用x轴值。它将烛台绘制在0,1,2 ......等等。如果你试图用你的日期设置你的x轴,无论是刻度还是限制,那么一切都会搞砸,因为你的情节将在x轴上完全不同。
解决此问题的一种简单方法是不使用烛台而不是烛台2,让x轴保持为数据的整数索引,而是设置基于标签的刻度线在你的约会。所以,例如:
fig = figure()
ax = fig.add_subplot(111)
candlestick2(ax,bars['open'],bars['close'],bars['high'],bars['low'],width=.5,colorup='g',colordown='r',alpha=1)
ax.set_xticks(arange(0,len(bars)))
ax.set_xticklabels(bars.index,rotation=70)
这会绘制您的日期,(a)确保您的刻度位于整数位置,然后根据日期设置这些刻度的标签。我也旋转了它们,你可以真正看到它们。 ax.set_xticklabels接受字符串,因此您可以根据需要修改日期格式。