matplotlib: создание двух (сложенных) подграфиков с ОБЩЕЙ осью X, но ОТДЕЛЬНЫМИ значениями оси Y

Я использую 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's 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()

Мне удалось отобразить два графика с помощью приведенного выше кода, однако с нижним графиком есть две проблемы:

  1. Он ПОЛНОСТЬЮ ПЕРЕЗАПИСЫВАЕТ нижнюю часть первого (верхнего) графика — почти так же, как если бы второй график рисовал на том же «холсте», что и первый сюжет - я не понимаю, где и почему это происходит.

  2. Он ЗАПИСЫВАЕТ существующую ось X своим собственным индексом, значения оси X (даты) должны быть ОБЩЕ между двумя графиками.

Что я делаю неправильно в своем коде? Может ли кто-нибудь определить, что заставляет второй (нижний) график перезаписывать первый (верхний) график - и как я могу это исправить?

Вот скриншот графика, созданного кодом выше:

faulty plot

[[Редактировать]]

После изменения кода, предложенного hwlau, это новый график.Он лучше первого тем, что два графика разделены, однако остаются следующие проблемы:

  1. Ось X должна быть ОБЩЕЙ для двух графиков (т.е. ось X должна отображаться только для 2-го [нижнего] графика)

  2. Значения Y для 2-го графика, кажется, сформированы неправильно

partly correct plot

Я думаю, что эти проблемы должны быть довольно легко решены, однако, мой matplotlib fu не очень хорош на данный момент, так как я только недавно начал программировать с matplotlib. Любая помощь будет высоко ценится.

13
задан Homunculus Reticulli 4 April 2012 в 21:48
поделиться