2016-04-25 8 views
3

Ich versuche, ein Candlestick-Diagramm mit Matplotlib mit Daten, die ich für einen REST-API-Aufruf erhalte, zu plotten. Da der Aufruf jedoch ein eindeutiges Zugriffstoken verwendet, habe ich für diese Frage Beispieldaten heruntergeladen und in einen CSV geladen. Here is a pastebin link zu, wie die Beispieldaten aussehen. Um die Daten in Python zu verarbeiten, verwende ich Pandas, um Datenrahmen zu erstellen. Hier ist, was mein Code wie folgt aussieht:Matplotlib Candlestick (Intraday) Diagramm ist ein großer Blob

import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.ticker as mticker 
import matplotlib.dates as mdates 
from matplotlib.finance import candlestick_ohlc 
from datetime import date 

""" Pandas """ 
historic_df = pd.read_csv("sample_data.csv") 

dates = pd.to_datetime(historic_df['time'], format="%Y-%m-%dT%H:%M:%S.%fZ") 
openp = historic_df['openAsk'] 
highp = historic_df['highAsk'] 
lowp = historic_df['lowAsk'] 
closep = historic_df['closeAsk'] 

""" Matplotlib """ 
ax1 = plt.subplot2grid((1,1), (0,0)) 
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S')) 

x = 0 
ohlc = [] 

while x < len(dates): 
    d = mdates.date2num(dates[x]) 
    append_me = d, openp.values[x], highp.values[x], lowp.values[x], closep.values[x] 
    ohlc.append(append_me) 
    x += 1 

candlestick_ohlc(ax1, ohlc, width=0.4, colorup='#77d879', colordown='#db3f3f') 
plt.show() 

Und hier ist das, was meine Ausgabe wie folgt aussieht:

enter image description here

können Sie Art die vertikalen Linien für den Leuchter des ausmachen, aber die Bars scheint wirklich weit. Irgendwelche Ideen, wie ich das lösen kann? Vielen Dank.

+0

funktioniert auf einigen Yahoo-Daten (unter Verwendung von Tagesdaten), bitte posten Sie Ihre aktuellen Daten. Alles, was ich getan habe, war, diese Zeile hier zu ändern: 'dates = pd.to_datetime (historic_df ['time'])' und es sieht gut aus. Aus irgendeinem Grund sieht es so aus, als würden Sie versuchen, mehrere Tage mit jeder Stunde auf einem Diagramm darzustellen, was die Überlappung erklären würde ... – Matt

+0

Ich habe in meinem Post einen Link zum [pastebin] eingefügt (http: // pastebin .com/3Z26y9dA) mit den Daten, die zum Zeichnen des Diagramms verwendet wurden. Nicht sicher, ob es einen Unterschied macht, aber meine Daten im Intraday, so dass jeder Eintrag kein anderer Tag ist, sondern eher 5-10 Sekunden auseinander liegt. – ng150716

Antwort

4

einfach Ihre Breite auf der Karte ändern, und es wird in Ordnung sein:

candlestick_ohlc(ax1, ohlc, width=0.001, colorup='#77d879', colordown='#db3f3f')

Getestet Ihre Daten mit und es sieht gut aus.

+0

Ja, das war's, kann ich die Breite automatisch anpassen, wenn ich täglich oder weniger granulare Daten einlade? – ng150716

+0

A pr in mpl machen die Standardbreite intelligenter würde wahrscheinlich akzeptiert werden. – tacaswell

+0

Tut mir leid, ich bin ein wenig zu spät, aber können Sie näher erläutern, was Sie mit pr meinen? – ng150716

1

Es scheint die undokumentierte width Argument zu candlestick_ohlc ist der Schlüssel. Multiplizieren Sie es mit dem Bruchteil eines Tages zwischen jedem Ihrer Datenpunkte. Da Ihre Daten in winzigen Schritten vorliegen, sollten Sie Folgendes tun:

candlestick_ohlc(ax, tuples, width=.6/(24*60), colorup='g', alpha =.4); 

Verwenden Sie zum Automatisieren den Unterschied zwischen Daten aufeinanderfolgender Datenpunkte. Zum Beispiel:

width=0.6/(mdates.date2num(dates[1])-mdates.date2num(dates[0])) 

Hinweis Dies erweist sich als ein FAQ zu sein, obwohl die Links nicht offensichtlich sind. Siehe:

Verwandte Themen