我经常在matplotlib和open-high-low-close的上下文中看到这一点,但我想知道你是否可以在pandas框架中添加一个卷叠加。我们想要的最终图表将接近第一个:(Matplotlib - Finance volume overlay)
假设我们有一个像这样的DataFrame:
num rolling_30 rolling_10 rolling_60 Volume
Date
2015-06-23 0.000219 0.000149 0.000168 0.000183 2
2015-06-25 0.000489 0.000162 0.000200 0.000188 3
2015-07-01 0.000164 0.000163 0.000190 0.000186 1
2015-07-02 0.000190 0.000166 0.000190 0.000187 1
2015-07-03 0.000269 0.000171 0.000198 0.000180 1
2015-07-04 0.000935 0.000196 0.000282 0.000193 2
2015-07-08 0.000154 0.000196 0.000288 0.000188 1
2015-07-11 0.000274 0.000202 0.000305 0.000190 1
2015-07-13 0.000872 0.000228 0.000380 0.000201 9
我们怎样才能获得[' num'' rolling_30',' rolling_10'' rolling_60']折线图列出每日交易量的图表?我可以做一个secondary_y来获得正确的音量,但老实说这看起来很糟糕。需要它是图表底部的传统音量条形图。
答案 0 :(得分:1)
基本思想是使用.twinx
创建辅助y轴。以下是一个简短的样本。从图中可以看出左边的y轴是用于价格和移动平均线,而右边的y轴是用于体积的。
import pandas as pd
import matplotlib.pyplot as plt
# your data
# ============================
print(df)
num rolling_30 rolling_10, rolling_60 Volume
Date
2015-06-23 0.0002 0.0001 0.0002 0.0002 2
2015-06-25 0.0005 0.0002 0.0002 0.0002 3
2015-07-01 0.0002 0.0002 0.0002 0.0002 1
2015-07-02 0.0002 0.0002 0.0002 0.0002 1
2015-07-03 0.0003 0.0002 0.0002 0.0002 1
2015-07-04 0.0009 0.0002 0.0003 0.0002 2
2015-07-08 0.0002 0.0002 0.0003 0.0002 1
2015-07-11 0.0003 0.0002 0.0003 0.0002 1
2015-07-13 0.0009 0.0002 0.0004 0.0002 9
# plotting
# ===========================
fig, ax = plt.subplots(figsize=(10,8))
df.drop('Volume', axis=1).plot(ax=ax)
ax.legend(loc='best')
ax2 = ax.twinx()
df['Volume'].plot(kind='bar', ax=ax2, color='g', alpha=0.1)
ax2.set_ylim([0, ax2.get_ylim()[1] * 10])
ax2.legend(loc='best')
答案 1 :(得分:1)
因此,虽然Jianxun的答案可能完全正确,但它不适用于我的系统。我在Pandas .17和最新的matplotlib。我也在使用Macbook。基本上,如果我尝试与两个图形(线条和条形图)共享一个X轴,第一个实例化的图形就会消失。
我能想到解决这个问题的最好方法就是在一个(子图)上做两个图并隐藏顶图的X轴。这是我做的:
fig = plt.figure(figsize=(10,6))
ax1 = plt.subplot2grid((3,3), (0,0), colspan=3, rowspan=2)
ax2 = plt.subplot2grid((3,3), (2,0), colspan=3)
ax2.yaxis.tick_right()
ax1.axes.get_xaxis().set_visible(False)
fig.subplots_adjust(hspace=0)
pct.drop('Volume', axis=1).plot(ax=ax1)
pct['Volume'].plot(kind='bar',ax=ax2, rot=75, legend=True)
#Set-up the X axis to not show so many labels
n = 6
ticks = ax2.xaxis.get_ticklocs()
ticklabels = [l.get_text() for l in ax2.xaxis.get_ticklabels()]
ax2.xaxis.set_ticks(ticks[::n])
ax2.xaxis.set_ticklabels(ticklabels[::n])
plt.gcf().subplots_adjust(bottom=0.15)