Внутридневные свечные графики с использованием Matplotlib - PullRequest
17 голосов
/ 13 марта 2012

У меня были некоторые трудности с финансовым графиком Matplotlib. Кажется, что их подсвечники лучше всего работают с дневными данными, и мне трудно заставить их работать с внутридневными (каждые 5 минут, с 9:30 до 16:00) данными.

Я вставил образец данных в pastebin. Верхняя часть - это то, что я получаю из базы данных, а нижняя часть содержит дату, отформатированную в порядковый номер с плавающей запятой для использования в Matplotlib.

Ссылка на образец данных

Когда я рисую свои диаграммы, в них огромные промежутки, оси отстойные, и масштаб одинаково ужасен. http://imgur.com/y7O8A

Enter image description here

Как сделать из этих данных хороший читаемый график? Моя конечная цель - получить график, который удаленно выглядит следующим образом:

Enter image description here

http://i.imgur.com/EnrTW.jpg

Точки данных могут быть с различными приращениями от 5 минут до 30 минут.


Я также сделал Pandas-фрейм данных, но я не уверен, что у панд есть функция подсвечника.

1 Ответ

47 голосов
/ 15 марта 2012

Если я правильно понимаю, одна из ваших главных проблем - разрыв между ежедневными данными. Чтобы избавиться от них, одним из методов является искусственное «равномерное распределение» ваших данных (но, конечно, вы потеряете все временные данные в течение дня).

В любом случае, поступая таким образом, вы сможете получить диаграмму, похожую на ту, которую вы предложили в качестве примера.

Код комментария и полученный график приведены ниже.

import numpy as np
import matplotlib.pyplot as plt
import datetime

from matplotlib.finance import candlestick
from matplotlib.dates import num2date

# data in a text file, 5 columns: time, opening, close, high, low
# note that I'm using the time you formated into an ordinal float
data = np.loadtxt('finance-data.txt', delimiter=',')

# determine number of days and create a list of those days
ndays = np.unique(np.trunc(data[:,0]), return_index=True)
xdays =  []
for n in np.arange(len(ndays[0])):
    xdays.append(datetime.date.isoformat(num2date(data[ndays[1],0][n])))

# creation of new data by replacing the time array with equally spaced values.
# this will allow to remove the gap between the days, when plotting the data
data2 = np.hstack([np.arange(data[:,0].size)[:, np.newaxis], data[:,1:]])

# plot the data
fig = plt.figure(figsize=(10, 5))
ax = fig.add_axes([0.1, 0.2, 0.85, 0.7])
    # customization of the axis
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.tick_params(axis='both', direction='out', width=2, length=8,
               labelsize=12, pad=8)
ax.spines['left'].set_linewidth(2)
ax.spines['bottom'].set_linewidth(2)
    # set the ticks of the x axis only when starting a new day
ax.set_xticks(data2[ndays[1],0])
ax.set_xticklabels(xdays, rotation=45, horizontalalignment='right')

ax.set_ylabel('Quote ($)', size=20)
ax.set_ylim([177, 196])

candlestick(ax, data2, width=0.5, colorup='g', colordown='r')

plt.show()

graph

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...