I've been trying to plot candlesticks from a pandas DataFrame containing ohlc data (in m5 timeframe), as well as data from another pandas array (in s1 timeframe), but I didn't manage to make it work.
My data looks like this:
In [83]: df[:3]
Out[83]:
open high low close
DateTime
2015-01-04 22:00:00 1.19548 1.19551 1.18627 1.19257
2015-01-04 22:05:00 1.19257 1.19455 1.18976 1.19116
2015-01-04 22:10:00 1.19115 1.19404 1.19068 1.19353
In [84]: sec[:5]
Out[84]:
open high low close
DateTime
2015-01-04 22:00:00 1.19548 1.19551 1.19525 1.19551
2015-01-04 22:00:01 1.19535 1.19535 1.19479 1.19482
2015-01-04 22:00:02 1.19483 1.19496 1.19474 1.19485
2015-01-04 22:00:03 1.19487 1.19490 1.19487 1.19490
2015-01-04 22:00:04 1.19453 1.19453 1.19388 1.19397
Both my DataFrames' indexes are Datatime index, and both are holding ohlc data.
When I try to plot data from both DataFrame on the same graph, it works perfectly well:
fig,ax1 = plt.subplots()
ax1.plot(sec['open'],linewidth=2)
ax1.plot(df['close'],'ko')
But after I plot the candlesticks, I can't find a way to change the x-axis so that I can plot the above data on the same figure:
fig,ax1 = plt.subplots()
candlestick2_ohlc(ax1,opens=df["open"].values,highs=df["high"].values,lows=df["low"].values,closes=df["close"].values,width=.4,colorup='g')
I can't find a way to plot both on the same figure, I looked a bit on how to tweak the x-axis after I plot the candlesticks, but I think that I have a bad understanding of how matplotlib axis work, and of why I can plot data from pandas array with different TimeSeries on the same graph.
Would anyone have an idea on how to make it work?
Edit:
I didn't notice I was using the wrong function (candlestick_ohlc instead of candlestick2_ohlc), which explained why I didn't manage to make work the documentation I looked about my issue.
I tried to do the same as I found here: Overlapping Dates in Candlestick Plot from a Pandas DataFrame
fig,ax1 = plt.subplots()
ax1.xaxis_date()
ohlc = [df.index.map(mdates.date2num),df["open"].values,df['high'].values,df['low'].values,df['close'].values]
candlestick_ohlc(ax1,ohlc,width=.4,colorup='g')
Which doesn't work and yields the error ValueError: ordinal must be >= 1
I also tried something similar that I found here: candlestick plot from pandas dataframe, replace index by dates
fig,ax1 = plt.subplots()
ax1.xaxis_date()
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%d-%m-%Y'))
ohlc = [mdates.date2num(df.index.astype(datetime.date)),df["open"].values,df['high'].values,df['low'].values,df['close'].values]
candlestick_ohlc(ax1,ohlc,width=.4,colorup='g')
Which yields another error message:
TypeError: dtype <class 'datetime.date'> not understood
I'm clearly doing something wrong, but I seriously can't figure out what.
I looked at the documentation about the candlestick_ohlc function of matplotlib.finance, and they say that:
time must be in float days format - see date2num
I assume my issue is that I didn't do the conversion properly, would anyone know what part of what I did is wrong, and why it doesn't yield the correct result?