replace matplotlib with Plotly in plot_dataframe.py

This commit is contained in:
Janne Sinivirta 2018-01-28 11:12:14 +02:00
parent 9090715ae5
commit ffb60fe8b9

View File

@ -3,14 +3,16 @@
import sys import sys
import logging import logging
import argparse import argparse
import os
import matplotlib
# matplotlib.use("Qt5Agg")
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
from pandas import DataFrame from pandas import DataFrame
import talib.abstract as ta import talib.abstract as ta
import plotly
from plotly import tools
from plotly.offline import plot
import plotly.graph_objs as go
import freqtrade.vendor.qtpylib.indicators as qtpylib import freqtrade.vendor.qtpylib.indicators as qtpylib
from freqtrade import exchange, analyze from freqtrade import exchange, analyze
from freqtrade.misc import common_args_parser from freqtrade.misc import common_args_parser
@ -36,8 +38,7 @@ def plot_analyzed_dataframe(args) -> None:
:param pair: pair as str :param pair: pair as str
:return: None :return: None
""" """
pair = args.pair pair = args.pair.replace('-', '_')
pairs = [pair]
timerange = misc.parse_timerange(args.timerange) timerange = misc.parse_timerange(args.timerange)
# Init strategy # Init strategy
@ -52,7 +53,7 @@ def plot_analyzed_dataframe(args) -> None:
exchange._API = exchange.Bittrex({'key': '', 'secret': ''}) exchange._API = exchange.Bittrex({'key': '', 'secret': ''})
tickers[pair] = exchange.get_ticker_history(pair, tick_interval) tickers[pair] = exchange.get_ticker_history(pair, tick_interval)
else: else:
tickers = optimize.load_data(args.datadir, pairs=pairs, tickers = optimize.load_data(args.datadir, pairs=[pair],
ticker_interval=tick_interval, ticker_interval=tick_interval,
refresh_pairs=False, refresh_pairs=False,
timerange=timerange) timerange=timerange)
@ -62,38 +63,84 @@ def plot_analyzed_dataframe(args) -> None:
dataframe = analyze.populate_sell_trend(dataframe) dataframe = analyze.populate_sell_trend(dataframe)
dates = misc.datesarray_to_datetimearray(dataframe['date']) dates = misc.datesarray_to_datetimearray(dataframe['date'])
# Two subplots sharing x axis if (len(dataframe.index) > 750):
fig, (ax1, ax2, ax3) = plt.subplots(3, sharex=True) logger.warn('Ticker contained more than 750 candles, clipping.')
fig.suptitle(pair + " " + str(tick_interval), fontsize=14, fontweight='bold') df = dataframe.tail(750)
ax1.plot(dates, dataframe['close'], label='close') candles = go.Candlestick(x=df.date,
# ax1.plot(dates, dataframe['sell'], 'ro', label='sell') open=df.open,
ax1.plot(dates, dataframe['sma'], '--', label='SMA') high=df.high,
ax1.plot(dates, dataframe['tema'], ':', label='TEMA') low=df.low,
ax1.plot(dates, dataframe['blower'], '-.', label='BB low') close=df.close,
ax1.plot(dates, dataframe['close'] * dataframe['buy'], 'bo', label='buy') name='Price')
ax1.plot(dates, dataframe['close'] * dataframe['sell'], 'ro', label='sell')
ax1.legend() df_buy = df[df['buy'] == 1]
buys = go.Scattergl(
x=df_buy.date,
y=df_buy.close,
mode='markers',
name='buy',
marker=dict(symbol='x-dot')
)
df_sell = df[df['sell'] == 1]
sells = go.Scattergl(
x=df_sell.date,
y=df_sell.close,
mode='markers',
name='sell',
marker=dict(symbol='diamond')
)
ax2.plot(dates, dataframe['adx'], label='ADX') bb_lower = go.Scatter(
ax2.plot(dates, dataframe['mfi'], label='MFI') x=df.date,
# ax2.plot(dates, [25] * len(dataframe.index.values)) y=df.bb_lowerband,
ax2.legend() name='BB lower',
line={'color': "transparent"},
)
bb_upper = go.Scatter(
x=df.date,
y=df.bb_upperband,
name='BB upper',
fill="tonexty",
fillcolor="rgba(0,176,246,0.2)",
line={'color': "transparent"},
)
ax3.plot(dates, dataframe['fastk'], label='k') macd = go.Scattergl(
ax3.plot(dates, dataframe['fastd'], label='d') x=df['date'],
ax3.plot(dates, [20] * len(dataframe.index.values)) y=df['macd'],
ax3.legend() name='MACD'
xfmt = mdates.DateFormatter('%d-%m-%y %H:%M') # Dont let matplotlib autoformat date )
ax3.xaxis.set_major_formatter(xfmt) macdsignal = go.Scattergl(
x=df['date'],
y=df['macdsignal'],
name='MACD signal'
)
volume = go.Bar(
x=df['date'],
y=df['volume'],
name='Volume'
)
fig = tools.make_subplots(rows=3, cols=1, shared_xaxes=True, row_width=[1, 1, 4])
fig.append_trace(candles, 1, 1)
fig.append_trace(bb_lower, 1, 1)
fig.append_trace(bb_upper, 1, 1)
fig.append_trace(buys, 1, 1)
fig.append_trace(sells, 1, 1)
fig.append_trace(volume, 2, 1)
fig.append_trace(macd, 3, 1)
fig.append_trace(macdsignal, 3, 1)
fig['layout'].update(title=args.pair)
fig['layout']['yaxis1'].update(title='Price')
fig['layout']['yaxis2'].update(title='Volume')
fig['layout']['yaxis3'].update(title='MACD')
plot(fig, filename='freqtrade-plot.html')
# Fine-tune figure; make subplots close to each other and hide x ticks for
# all but bottom plot.
fig.subplots_adjust(hspace=0)
fig.autofmt_xdate() # Rotate the dates
plt.setp([a.get_xticklabels() for a in fig.axes[:-1]], visible=False)
plt.show()
if __name__ == '__main__': if __name__ == '__main__':
args = plot_parse_args(sys.argv[1:]) args = plot_parse_args(sys.argv[1:])