2012-10-29 15 views
7

Sporządzam wykres świecowy z dwoma zestawami danych: [otwórz, wysoki, niski, zamknij] i głośność. Próbuję nakładki woluminów w dolnej części wykresu tak:Matplotlib - Nakładka objętości Finanse

finviz.com

Dzwonię volume_overlay3 ale zamiast barów wypełnia całą powierzchnię. Co ja robię źle?

volume_overlay3

Moja druga opcja jest użycie .bar(), która nie ma w górę iw dół kolorach, ale będzie działać, jeśli mogę dostać prawo skalę:

enter image description here

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 

candlestick(ax, candlesticks) 

ax2 = ax.twinx() 

volume_overlay3(ax2, quotes) 

ax2.xaxis_date() 

ax2.set_xlim(candlesticks[0][0], candlesticks[-1][0]) 

ax.yaxis.set_label_position("right") 
ax.yaxis.tick_right() 

ax2.yaxis.set_label_position("left") 
ax2.yaxis.tick_left() 
+0

W ogóle nie do ekonomii - jak określona jest funkcja up/down (myślę, że można nadać każdemu barowi kolor wybierając dwie wartości w zależności od reguły góra/dół ... np. przez zawiązanie sygnału z i [-1 1] jądrem lub czymś podobnym ... jeśli nie było tylko 'plt.hold (true)' – deinonychusaur

Odpowiedz

22

Volume_overlay3 nie działa dla mnie. Więc spróbowałem twojego pomysłu, aby dodać wykres słupkowy do wykresu świecowego.

Po utworzeniu osi podwójnej dla zmiany objętości tej osi (skróć ją) i zmodyfikuj zakres danych y świecy, aby uniknąć kolizji.

import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 
# from matplotlib.finance import candlestick 
# from matplotlib.finance import volume_overlay3 
# finance module is no longer part of matplotlib 
# see: https://github.com/matplotlib/mpl_finance 
from mpl_finance import candlestick_ochl as candlestick 
from mpl_finance import volume_overlay3 
from matplotlib.dates import num2date 
from matplotlib.dates import date2num 
import matplotlib.mlab as mlab 
import datetime 

datafile = 'data.csv' 
r = mlab.csv2rec(datafile, delimiter=';') 

# the dates in my example file-set are very sparse (and annoying) change the dates to be sequential 
for i in range(len(r)-1): 
    r['date'][i+1] = r['date'][i] + datetime.timedelta(days=1) 

candlesticks = zip(date2num(r['date']),r['open'],r['close'],r['max'],r['min'],r['volume']) 

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 

ax.set_ylabel('Quote ($)', size=20) 
candlestick(ax, candlesticks,width=1,colorup='g', colordown='r') 

# shift y-limits of the candlestick plot so that there is space at the bottom for the volume bar chart 
pad = 0.25 
yl = ax.get_ylim() 
ax.set_ylim(yl[0]-(yl[1]-yl[0])*pad,yl[1]) 

# create the second axis for the volume bar-plot 
ax2 = ax.twinx() 


# set the position of ax2 so that it is short (y2=0.32) but otherwise the same size as ax 
ax2.set_position(matplotlib.transforms.Bbox([[0.125,0.1],[0.9,0.32]])) 

# get data from candlesticks for a bar plot 
dates = [x[0] for x in candlesticks] 
dates = np.asarray(dates) 
volume = [x[5] for x in candlesticks] 
volume = np.asarray(volume) 

# make bar plots and color differently depending on up/down for the day 
pos = r['open']-r['close']<0 
neg = r['open']-r['close']>0 
ax2.bar(dates[pos],volume[pos],color='green',width=1,align='center') 
ax2.bar(dates[neg],volume[neg],color='red',width=1,align='center') 

#scale the x-axis tight 
ax2.set_xlim(min(dates),max(dates)) 
# the y-ticks for the bar were too dense, keep only every third one 
yticks = ax2.get_yticks() 
ax2.set_yticks(yticks[::3]) 

ax2.yaxis.set_label_position("right") 
ax2.set_ylabel('Volume', size=20) 

# format the x-ticks with a human-readable date. 
xt = ax.get_xticks() 
new_xticks = [datetime.date.isoformat(num2date(d)) for d in xt] 
ax.set_xticklabels(new_xticks,rotation=45, horizontalalignment='right') 

plt.ion() 
plt.show() 

plot

Data.csv znajduje się tutaj: http://pastebin.com/5dwzUM6e

+0

Dziękuję! To jest wspaniałe. jak dostosować zakres działki woluminu.To działa – nathancahill

+0

super jasne, pomocne komentarze na temat tego, co robią cyfry/fucntions i dlaczego - to było dokładnie to, czego potrzebowałem, dzięki! – dwanderson

0

Jeśli chcesz stos wykresy na górze siebie (tj wykreślić je na tej samej osi) używać:

plt.hold(True) 
1

Zobacz odpowiedź here. Najwyraźniej błąd i zostanie naprawiony.

Teraz należy przypisać zwróconą kolekcję z połączenia volume_overlay3 do zmiennej, a następnie dodać ją do wykresu.

vc = volume_overlay3(ax2, quotes) 
ax2.add_collection(vc) 
+0

Próbowałem tego, ale nie dostałem nakładka objętości przedstawiona w wybranej odpowiedzi. Czy otrzymałeś taką samą nakładkę objętości, jak w wybranej odpowiedzi? – phan