2015-07-14 7 views
1

Я часто вижу это в контексте matplotlib и open-high-low-close, но мне интересно, добавить ли вы объемный оверлей внутри рамки pandas. Окончательный график мы хотели бы быть рядом с первым здесь: (Matplotlib - Finance volume overlay)Volume Overlay with Pandas

Say мы имеем 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» , 'roll_10', 'rolling_60'], внизу внизу графика отображается ежедневный объем? Я могу сделать second_y, чтобы получить объем справа, но, честно говоря, это выглядит ужасно. Нужно, чтобы он был традиционным баром в нижней части диаграммы.

ответ

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) 
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') 

enter image description here

+0

Эй, похоже, это не работает для меня (http://i.imgur.com/PldujAI.png). Обычно я использую стиль «ggplot», может ли это быть причиной? Я только изменил альфа объемного сюжета, и ничего больше. – user1610719

+0

Если я вытащил doublex() и второй график, нормальный график (roll_XX) отображается нормально, но, кажется, исчезает, когда я добавляю второй график. – user1610719

+0

@ user1610719 это не должно быть проблемой ggplot. похоже, что ничего не построено на ax = ax. можете ли вы дважды проверить свой код и опубликовать полный код, чтобы воспроизвести эту ошибку? –