我有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小时有一个主要刻度(这样图表仍然可读)?
答案 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以获取更详细的格式选项,尤其是重新跳过间隔以避免重叠。