2017-02-10 8 views
1

matplotlibに燭台チャートをプロットすると、プロットは週末に見苦しいギャップを残します。これは、週末に市場が閉鎖されたためにデータが破損したために発生します。週末のギャップをどのように取り除くことができますか?Matplotlibローソク足チャートの週末を削除するには?

以下は、プロットにギャップが存在することを示す簡単な例です。

import matplotlib.pyplot as plt 
from matplotlib.finance import quotes_historical_yahoo_ohlc, candlestick_ohlc 

date1, date2 = [(2006, 6, 1), (2006, 8, 1)] 
quotes_mpl = quotes_historical_yahoo_ohlc('INTC', date1, date2) 

fig, ax = plt.subplots() 
candlestick_ohlc(ax, quotes_mpl) 
ax.xaxis_date() 
plt.xticks(rotation=45) 

週末のギャップは緑色の矢印で示されています。

enter image description here

答えて

2

残念ながら、どちらも私の知識にmatplotlibpandasは平日のみのデータをプロットするの組み込みの方法があります。しかし、this matplotlib exampleに示されているように、カスタムティックの書式設定は、人為的に週末を一種のハッピーな方法でスキップすることができます。

主なアイデアは、データを順番に(間隙がないように)再インデクシングし、それが必然であることがわかっている日付の範囲に従ってxticksを手動で設定することです。 matplotlibの燭台の図表はちょっと特殊な*なので、単純に上の例にリンクされているわけではありません。その代わりに、以下のヘルパー関数を書いて、不足しているデータをスキップして管理しやすくしました。

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
from matplotlib.finance import quotes_historical_yahoo_ohlc, candlestick_ohlc 


def weekday_candlestick(ohlc_data, ax, fmt='%b %d', freq=7, **kwargs): 
    """ Wrapper function for matplotlib.finance.candlestick_ohlc 
     that artificially spaces data to avoid gaps from weekends """ 

    # Convert data to numpy array 
    ohlc_data_arr = np.array(ohlc_data) 
    ohlc_data_arr2 = np.hstack(
     [np.arange(ohlc_data_arr[:,0].size)[:,np.newaxis], ohlc_data_arr[:,1:]]) 
    ndays = ohlc_data_arr2[:,0] # array([0, 1, 2, ... n-2, n-1, n]) 

    # Convert matplotlib date numbers to strings based on `fmt` 
    dates = mdates.num2date(ohlc_data_arr[:,0]) 
    date_strings = [] 
    for date in dates: 
     date_strings.append(date.strftime(fmt)) 

    # Plot candlestick chart 
    candlestick_ohlc(ax, ohlc_data_arr2, **kwargs) 

    # Format x axis 
    ax.set_xticks(ndays[::freq]) 
    ax.set_xticklabels(date_strings[::freq], rotation=45, ha='right') 
    ax.set_xlim(ndays.min(), ndays.max()) 

    plt.show() 

上記の機能の使用例をいくつか紹介します。

# Get data using quotes_historical_yahoo_ohlc 
date1, date2 = [(2006, 6, 1), (2006, 8, 1)] 
date3, date4 = [(2006, 5, 15), (2008, 4, 1)] 
data_1 = quotes_historical_yahoo_ohlc('INTC', date1, date2) 
data_2 = quotes_historical_yahoo_ohlc('INTC', date3, date4) 

# Create figure with 2 axes 
fig, axes = plt.subplots(ncols=2, figsize=(14, 6)) 

weekday_candlestick(data_1, ax=axes[0], fmt='%b %d', freq=3, width=0.5) 
weekday_candlestick(data_2, ax=axes[1], fmt='%b %d %Y', freq=30) 

# Set the plot titles 
axes[0].set_title('Shorter Range Stock Prices') 
axes[1].set_title('Longer Range Stock Prices') 

実行すると、以下のプロット(週末の空きがない)が生成されます。

enter image description here

*これは、タプルのリストを取る - 時間を、オープンハイ、ロー、そして近い値、かなりユニークです。

関連する問題