如何获得Pandas的盘中价格 - 成交量图?

时间:2016-05-13 14:34:45

标签: python numpy pandas matplotlib machine-learning

我有DataFrame,其中包含日内的价格/数量数据:

time                  price    volume   
2015-04-15 10:10:00   10       500    
2015-04-15 10:20:00   15       100    
2015-04-15 10:30:00   20       70
2015-04-15 10:30:00   etc      etc

我需要获得一个标准价格 - 成交量图表,其中顶部图表包含价格(常规行),底部图表包含成交量(条形图)。

当然,两个图表应该共享同一个轴。

到目前为止,我已提出:

plt.figure(figsize=(20,15))          

ax1=plt.subplot2grid((2,2),(0,0),colspan=2)
ax2=plt.subplot2grid((2,2),(1,0),colspan=2)

ax2.xaxis.set_major_locator(HourLocator(interval=3))
ax2.xaxis.set_major_formatter(DateFormatter('%H:%M'))

data.ix['2015-10-01': '2015-10-02','price'].plot(ax=ax1)
data.ix['2015-10-01': '2015-10-02','volume'].plot(ax=ax2, kind='bar')

但是我为条形图获得了超密集的刻度标签(图表无法使用)。

如何指定每小时有一个小刻度,每3小时有一个主要刻度(这样图表仍然可读)?

1 个答案:

答案 0 :(得分:5)

pandas.plot.bar()DateTimeIndex存在一些挑战,例如here。以下内容:

import matplotlib as mpl
import matplotlib.pyplot as plt

plt.style.use('ggplot')
import pandas as pd
import numpy as np
from datetime import datetime

n = 100
idx = pd.date_range(start=datetime(2016, 1, 1, 10), freq='10Min', periods=n)
data = pd.DataFrame(data={'price': np.cumsum([0.0001] * n + np.random.random(n)),
                          'volume': np.random.randint(low=100, high=10000, size=n)}, index=idx)

fig, ax = plt.subplots(nrows=2, sharex=True, figsize=(15,8))

ax[0].plot(data.index, data.price)
ax[1].bar(data.index, data.volume, width=1/(5*len(data.index)))

xfmt = mpl.dates.DateFormatter('%H:%M')
ax[1].xaxis.set_major_locator(mpl.dates.HourLocator(interval=3))
ax[1].xaxis.set_major_formatter(xfmt)

ax[1].xaxis.set_minor_locator(mpl.dates.HourLocator(interval=1))
ax[1].xaxis.set_minor_formatter(xfmt)

ax[1].get_xaxis().set_tick_params(which='major', pad=25)

fig.autofmt_xdate()
plt.show()

产生以下结果。请注意,回退到matplotlib需要对width中的ax[1].bar()参数进行一些调整。对于minorticks,您可能需要查看here以获取更详细的格式选项,尤其是重新跳过间隔以避免重叠。

enter image description here