2016-07-26 3 views
1

私は以下の燭台プロットを持っています。私はそれをスクロール可能にして、もっと詳細を見ることができるようにしたい。現在のプロットは長すぎて詳細を見ることができません。 私はここで、スクロール可能なラインプロットを作成するための例を発見した: Matplotlib: scrolling plotPythonでうろこ状のキャンデルスティックプロットを作成するには?

しかし、燭台を更新する折れ線グラフを更新するよりも、より複雑な方法と思われます。燭台プロットは線とパッチを返します。手伝ってくれますか?

from pandas.io.data import get_data_yahoo 
import matplotlib.pyplot as plt 
from matplotlib import dates as mdates 
from matplotlib import ticker as mticker 
from matplotlib.finance import candlestick_ohlc 
import datetime as dt 
symbol = "GOOG" 

data = get_data_yahoo(symbol, start = '2011-9-01', end = '2015-10-23') 
data.reset_index(inplace=True) 
data['Date']=mdates.date2num(data['Date'].astype(dt.date)) 
fig = plt.figure() 
ax1 = plt.subplot2grid((1,1),(0,0)) 
plt.title('How to make it scrollable') 
plt.ylabel('Price') 
ax1.xaxis.set_major_locator(mticker.MaxNLocator(6)) 
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) 

candlestick_ohlc(ax1,data.values,width=0.2) 

答えて

1

プロット全体をプロットし、スライダウィジェットを使用して軸領域を変更することができます。

pandas.io.dataライブラリがないため、データを再現できませんでした。したがって、the candlestick example from hereを変更し、スライダを追加しました。

import matplotlib.pyplot as plt 
import datetime 
from matplotlib.widgets import Slider 
from matplotlib.finance import quotes_historical_yahoo_ohlc, candlestick_ohlc 
from matplotlib.dates import DateFormatter, WeekdayLocator,\ 
    DayLocator, MONDAY 

# (Year, month, day) tuples suffice as args for quotes_historical_yahoo 
date1 = (2004, 2, 1) 
date2 = (2004, 4, 12) 

mondays = WeekdayLocator(MONDAY)  # major ticks on the mondays 
alldays = DayLocator()    # minor ticks on the days 
weekFormatter = DateFormatter('%b %d') # e.g., Jan 12 
dayFormatter = DateFormatter('%d')  # e.g., 12 

quotes = quotes_historical_yahoo_ohlc('INTC', date1, date2) 
if len(quotes) == 0: 
    raise SystemExit 

fig, ax = plt.subplots() 
fig.subplots_adjust(bottom=0.2) 
ax.xaxis.set_major_locator(mondays) 
ax.xaxis.set_minor_locator(alldays) 
ax.xaxis.set_major_formatter(weekFormatter) 
#ax.xaxis.set_minor_formatter(dayFormatter) 

#plot_day_summary(ax, quotes, ticksize=3) 
candlestick_ohlc(ax, quotes, width=0.6) 

ax.xaxis_date() 
ax.autoscale_view() 
plt.axis([datetime.date(*date1).toordinal(), datetime.date(*date1).toordinal()+10, 18.5, 22.5]) 
plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right') 


axcolor = 'lightgoldenrodyellow' 
axpos = plt.axes([0.2, 0.05, 0.65, 0.03], axisbg=axcolor) 


spos = Slider(axpos, 'Position', datetime.date(*date1).toordinal(), datetime.date(*date2).toordinal()) 

def update(val): 
    pos = spos.val 
    ax.axis([pos,pos+10, 18.5, 22.5]) 
    fig.canvas.draw_idle() 

spos.on_changed(update) 

plt.show() 

私は軸のサイズと位置の値をハードコーディングしました。コードに適合させるときは注意してください。

同様の考え方を実装して、必要に応じて垂直スクロールを追加することもできます。

+0

ありがとう!なぜあなたは '*'をそこに置いて、なぜ私たちが必要なのかをspos = Slider(axpos、 'Position'、datetime.date(* date1).toordinal()、datetime.date(* date2).toordinal '.tordinal()'?それは 'update'関数に関連していますか? – Lisa

+0

私は助けてうれしいです。 *演算子は、タプル 'date1'と' date2'をコンストラクタ 'datetime.date'の引数に展開します。ここで確認してください。https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists 。そして 'Slider'ウィジェットは数字だけを管理することができます。datetime.dateオブジェクトを扱うことはできません.toordinal()メソッドは、日付をエポックから秒数に変換します。これは便利です。データがプロットされます。あなたのバージョンのmatplotlibに応じて、この番号をスライダの右に見ることができます。 –

+0

また、 'Slider'ドキュメンテーションをチェックして、引数の順序を見ることができます。http://matplotlib.org/1.3.1/api/widgets_api.html#matplotlib.widgets.Slider –

1

何をしたい、私は(スクロール、ズーム、パン、などを含む)、インタラクティブなデータ可視化を可能にし、素敵なPythonのAPIを持っているPlotlyを、使用することをお勧めしたいため。ここで

はPlotlyウェブサイトのAPIを使用してそれを行うには、2つの異なる方法(両方のケースでは、あなたがpip install plotlyにする必要があります)

  1. はあなたcreate an account hereユーザー名とAPIキーを取得することが必要です(です。あなたは」プロットを作成するには、インターネットに接続する必要があるでしょう。)

    from pandas.io.data import get_data_yahoo 
    import matplotlib.pyplot as plt 
    from matplotlib import dates as mdates 
    from matplotlib import ticker as mticker 
    from matplotlib.finance import candlestick_ohlc 
    import datetime as dt 
    # Imports for Plotly 
    import plotly.plotly as py 
    import plotly.tools as tls 
    from plotly.tools import FigureFactory as FF 
    
    # Put your credentials here 
    tls.set_credentials_file(username='YourUserName', api_key='YourAPIKey') 
    
    # Getting the data 
    symbol = "GOOG" 
    data = get_data_yahoo(symbol, start = '2011-9-01', end = '2015-10-23') 
    data.reset_index(inplace=True) 
    # Not needed anymore, we'll use the string-formatted dates. 
    #data['Date']=mdates.date2num(data['Date'].astype(dt.date)) 
    
    # Creating the Plotly Figure 
    fig = FF.create_candlestick(data.Open, data.High, data.Low, data.Close, dates=data.Date) 
    lay = fig.layout 
    
    # Formatting the ticks. 
    lay.xaxis.nticks = 6 
    lay.xaxis.tickformat = "%Y-%m-%d" 
    
    # Removing the hover annotations Plotly adds by default, but this is optional. 
    lay.hovermode = False 
    
    # A nice title... 
    lay.title = "See, I made it scrollable :)" 
    py.iplot(fig) 
    
  2. Plotlyのオフラインモードを使用します。私はあなたがJupyter(IPythonノートブック)を使用していると仮定します。あなたはインターネットに接続する必要はありません。

    from pandas.io.data import get_data_yahoo 
    import matplotlib.pyplot as plt 
    from matplotlib import dates as mdates 
    from matplotlib import ticker as mticker 
    from matplotlib.finance import candlestick_ohlc 
    import datetime as dt 
    
    # Imports for Plotly 
    from plotly.offline import download_plotlyjs, init_notebook_mode, iplot 
    import plotly.tools as tls 
    from plotly.tools import FigureFactory as FF 
    
    init_notebook_mode() # Inject Plotly.js into the notebook 
    
    # Getting the data 
    symbol = "GOOG" 
    data = get_data_yahoo(symbol, start = '2011-9-01', end = '2015-10-23') 
    data.reset_index(inplace=True) 
    # Not needed anymore, we'll use the string-formatted dates. 
    #data['Date']=mdates.date2num(data['Date'].astype(dt.date)) 
    
    # Creating the Plotly Figure 
    fig = FF.create_candlestick(data.Open, data.High, data.Low, data.Close, dates=data.Date) 
    lay = fig.layout 
    
    # Formatting the ticks. 
    lay.xaxis.nticks = 6 
    lay.xaxis.tickformat = "%Y-%m-%d" 
    
    # Removing the hover annotations Plotly adds by default, but this is optional. 
    lay.hovermode = False 
    
    # A nice title... 
    lay.title = "See, I made it scrollable :)" 
    iplot(fig) 
    

結果、ズームの前に...

Before

...そして特定の領域にズームした後。

After

あなたが他の質問がある場合は、私に知らせてください。答えがあなたに合ってくれることを願っています!

+0

ありがとうございました。あなたは私がズームインするのに役立ちますが、私はチャートをスクロールしたいと思います:最初のウィンドウには、データを拡大しないで詳細を見るのに十分な短いデータが表示されます。データ、私はスクロールして見ることができます。どのようにそれを行う上の任意のヒント?もう一度ありがとう、あなたにコーヒーを買ってもらいたい。あなたの好きなコーヒーの場所は何ですか?@Andreq – Lisa

+0

私はあなたが正確に尋ねていることは分かりません:あなたはマウスホイールを使って水平にスクロールすることを意味しますか?そのような場合は、どうやったら簡単にできないのか分かりません。コーヒーについては、ありがとうございます。しかし、私はかなりの外部補償がSOのルールに反すると確信しています:)。一方、答えが満足できるものであれば、それを承認することを忘れないでください:)。 – Andreq

+0

ありがとうございます。はい、私はそれを水平にスクロールしたいです。受け入れられた答えを確認してください。助けてくれてありがとう! – Lisa

関連する問題