Я использую matplotlib 1.2.x и Python 2.6.5 на Ubuntu 10.0.4. Я пытаюсь создать единый сюжет, состоящий из верхнего сюжета и нижнего участка.
Ось X - это дата временного ряда. Верхний график содержит график подсвечника данных, а нижний график должен состоять из графика штрихового типа - со своей собственной осью Y (также слева - такой же, как и верхний график). Эти два графика НЕ должны переполняться.
Вот фрагмент того, что я сделал до сих пор.
datafile = r'/var/tmp/trz12.csv'
r = mlab.csv2rec(datafile, delimiter=',', names=('dt', 'op', 'hi', 'lo', 'cl', 'vol', 'oi'))
mask = (r["dt"] >= datetime.date(startdate)) & (r["dt"] <= datetime.date(enddate))
selected = r[mask]
plotdata = zip(date2num(selected['dt']), selected['op'], selected['cl'], selected['hi'], selected['lo'], selected['vol'], selected['oi'])
# Setup charting
mondays = WeekdayLocator(MONDAY) # major ticks on the mondays
alldays = DayLocator() # minor ticks on the days
weekFormatter = DateFormatter('%b %d') # Eg, Jan 12
dayFormatter = DateFormatter('%d') # Eg, 12
monthFormatter = DateFormatter('%b %y')
# every Nth month
months = MonthLocator(range(1,13), bymonthday=1, interval=1)
fig = pylab.figure()
fig.subplots_adjust(bottom=0.1)
ax = fig.add_subplot(111)
ax.xaxis.set_major_locator(months)#mondays
ax.xaxis.set_major_formatter(monthFormatter) #weekFormatter
ax.format_xdata = mdates.DateFormatter('%Y-%m-%d')
ax.format_ydata = price
ax.grid(True)
candlestick(ax, plotdata, width=0.5, colorup='g', colordown='r', alpha=0.85)
ax.xaxis_date()
ax.autoscale_view()
pylab.setp( pylab.gca().get_xticklabels(), rotation=45, horizontalalignment='right')
# Add volume data
# Note: the code below OVERWRITES the bottom part of the first plot
# it should be plotted UNDERNEATH the first plot - but somehow, that not happening
fig.subplots_adjust(hspace=0.15)
ay = fig.add_subplot(212)
volumes = [ x[-2] for x in plotdata]
ay.bar(range(len(plotdata)), volumes, 0.05)
pylab.show()
Мне удалось отобразить два графика, используя вышеприведенный код, однако есть две проблемы с нижним графиком:
-
ПОЛНОСТЬЮ ПЕРЕЗАПИСИТ нижнюю часть первого (верхнего) сюжета - почти как если бы второй сюжет рисовал на одном и том же "холсте" в качестве первого сюжета - я не вижу, где/почему это происходит.
-
Он ПЕРЕЗАПИСИВАЕТ существующую ось Х с собственным индексом, значения X-оси (даты) должны быть ОБНАРУЕМЫ между двумя графиками.
Что я делаю неправильно в своем коде?. Может ли кто-то определить, что вызывает второй (нижний) график, чтобы перезаписать первый (верхний) график - и как я могу это исправить?
Вот скриншот сюжета, созданного кодом выше:
[[Edit]]
После изменения кода, предложенного hwlau, это новый график. Это лучше, чем первое из того, что два графика являются отдельными, однако остаются следующие проблемы:
-
Ось X должна быть расширена двумя графиками (то есть ось X должна отображаться только для 2-го [нижнего] графика)
-
Значения Y для 2-го графика кажутся неверно сформированными
Я думаю, что эти проблемы должны быть довольно легко разрешены, но мой matplotlib fu на данный момент невелик, так как я только недавно начал программировать с помощью matplotlib. любая помощь будет высоко оценена.