Итак, я пытаюсь вручную создать график свечей с помощью matplotlib, используя errorbar
для дневных цен максимумов и минимумов и Rectangle()
для скорректированных цен закрытия и открытия. Этот вопрос , казалось, имел все предпосылки для достижения этой цели.
Я попытался использовать все вышеперечисленное очень точно, но проблема нанесения чего-либо по оси x, равной datetime64[ns]
, не давала мне конца ошибкам, поэтому я дополнительно попытался включить совет здесь при построении графика на дату и время.
Это мой код, с извинениями за беспорядок:
import pandas as pd
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.collections import PatchCollection
from matplotlib.patches import Rectangle
def makeCandles(xdata,high,low,adj_close,adj_open,fc='r',ec='None',alpha=0.5):
## Converting datetimes to numerical format matplotlib can understand.
dates = mdates.date2num(xdata)
## Creating default objects
fig,ax = plt.subplots(1)
## Creating errorbar peaks based on high and low prices
avg = (high + low) / 2
err = [high - avg,low - avg]
ax.errorbar(dates,err,fmt='None',ecolor='k')
## Create list for all the error patches
errorboxes = []
## Loop over data points; create "body" of candlestick
## based on adjusted open and close prices
errors=np.vstack((adj_close,adj_open))
errors=errors.T
for xc,yc,ye in zip(dates,avg,errors):
rect = Rectangle((xc,yc-ye[0]),1,ye.sum())
errorboxes.append(rect)
## Create patch collection with specified colour/alpha
pc = PatchCollection(errorboxes,facecolor=fc,alpha=alpha,edgecolor=ec)
## Add collection to axes
ax.add_collection(pc)
plt.show()
С моими данными, похожими на

Это то, что я пытаюсь запустить, сначала получая таблицу цен от quandl,
import quandl as qd
api = '1uRGReHyAEgwYbzkPyG3'
qd.ApiConfig.api_key = api
data = qd.get_table('WIKI/PRICES', qopts = { 'columns': ['ticker', 'date', 'high','low','adj_open','adj_close'] }, \
ticker = ['AMZN', 'XOM'], date = { 'gte': '2014-01-01', 'lte': '2016-12-31' })
data.reset_index(inplace=True,drop=True)
makeCandles(data['date'],data['high'],data['low'],data['adj_open'],data['adj_close'])
Код выполняется без ошибок, но выводит пустой график. Итак, я прошу совета о том, как нанести эти прямоугольники на даты и время. Для ширины прямоугольников я просто положил равномерную "1", потому что. Я не знаю простого способа указать ширину даты и времени прямоугольника. Я был бы очень признателен за опытную помощь.
РЕДАКТИРОВАТЬ: Это сюжет, который я сейчас получаю, превратив мой xdata
в matplotlib mdates:

До того, как я преобразовал xdata
через mdates, с xdata
в качестве моей оси X везде, это была одна из ошибок, которые я продолжал получать:
