candlestick plot from pandas dataframe, replace index by dates

acekuber picture acekuber · May 28, 2018 · Viewed 10.2k times · Source

This code gives plot of candlesticks with moving averages but the x-axis is in index, I need the x-axis in dates. What changes are required?

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_finance import candlestick2_ohlc

#date format in data-> dd-mm-yyyy
nif = pd.read_csv('data.csv')   


#nif['Date'] = pd.to_datetime(nif['Date'], format='%d-%m-%Y', utc=True)

mavg = nif['Close'].ewm(span=50).mean()
mavg1 = nif['Close'].ewm(span=13).mean()

fg, ax1 = plt.subplots()

cl = candlestick2_ohlc(ax=ax1,opens=nif['Open'],highs=nif['High'],lows=nif['Low'],closes=nif['Close'],width=0.4, colorup='#77d879', colordown='#db3f3f')

mavg.plot(ax=ax1,label='50_ema')
mavg1.plot(color='k',ax=ax1, label='13_ema')

plt.legend(loc=4)
plt.subplots_adjust(left=0.09, bottom=0.20, right=0.94, top=0.90, wspace=0.2, hspace=0)
plt.show()

Output:

enter image description here

Answer

cJc picture cJc · May 28, 2018

I also had a lot of "fun" with this in the past... Here is one way of doing it using mdates:

import pandas as pd
import pandas_datareader.data as web
import datetime as dt
import matplotlib.pyplot as plt
from matplotlib.finance import candlestick_ohlc
import matplotlib.dates as mdates

ticker = 'MCD'
start = dt.date(2014, 1, 1)

#Gathering the data
data = web.DataReader(ticker, 'yahoo', start)


#Calc moving average
data['MA10'] = data['Adj Close'].rolling(window=10).mean()
data['MA60'] = data['Adj Close'].rolling(window=60).mean()
data.reset_index(inplace=True)
data['Date']=mdates.date2num(data['Date'].astype(dt.date))

#Plot candlestick chart
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = fig.add_subplot(111)
ax3 = fig.add_subplot(111)
ax1.xaxis_date()
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%d-%m-%Y'))
ax2.plot(data.Date, data['MA10'], label='MA_10')
ax3.plot(data.Date, data['MA60'], label='MA_60')
plt.ylabel("Price")
plt.title(ticker)
ax1.grid(True)
plt.legend(loc='best')
plt.xticks(rotation=45)
candlestick_ohlc(ax1, data.values, width=0.6, colorup='g', colordown='r')
plt.show()

Output:

enter image description here

Hope this helps.