5

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

DeiDei
  • 10,205
  • 6
  • 55
  • 80
acekuber
  • 101
  • 1
  • 2
  • 7
  • if my reply below helped you achieve what you needed, would appreciate if you accepted my answer.. – cJc Jul 11 '18 at 12:26

3 Answers3

8

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.

cJc
  • 813
  • 1
  • 11
  • 33
3

Simple df:

Assuming a simple df like this

Using plotly:

import plotly.figure_factory
fig = plotly.figure_factory.create_candlestick(df.open, df.high, df.low, df.close, dates=df.ts)
fig.show()

will automatically parse the ts column to be displayed correctly on x.

gies0r
  • 4,723
  • 4
  • 39
  • 50
2

Clunky workaround here, derived from other post (if i can find again, will reference). Using a pandas df, plot by index and then reference xaxis tick labels to date strings for display. Am new to python / matplotlib, and this this solution is not so flexible, but it works basically. Also using a pd index for plotting removes the blank 'weekend' daily spaces on market price data. Matplotlib xaxis index as dates

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

%matplotlib notebook # for Jupyter

# Format m/d/Y,Open,High,Low,Close,Adj Close,Volume
# csv data does not include NaN, or 'weekend' lines, 
# only dates from which prices are recorded
DJIA = pd.read_csv('yourFILE.csv') #Format m/d/Y,Open,High,
    Low,Close,Adj Close,Volume

print(DJIA.head())

fg, ax1 = plt.subplots()

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

ax1.set_xticks(np.arange(len(DJIA)))
ax1.set_xticklabels(DJIA['Date'], fontsize=6, rotation=-90)

plt.show()
MarkD
  • 395
  • 3
  • 14