2016-07-26 10 views
1

У меня следующий подсвечник участок. Я хочу сделать его прокручиваемым, чтобы я мог видеть больше деталей. Нынешний сюжет слишком длинный, чтобы увидеть подробности. я нашел примеры для создания сюжетной линии прокручивать на здесь: Matplotlib: scrolling plotКак сделать прокручивающийся сюжет канделябра в Python?

Однако обновление светильника кажется гораздо сложнее, чем обновление строки диаграммы. Подсвечник возвращает линии и патчи. Вы можете помочь?

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

За то, что вы хотите, я бы рекомендовал использовать Plotly, что позволяет для интерактивной визуализации данных (в том числе прокрутки, масштабирования, панорамирования и т.д.), и имеет хороший Python API.

Вот два разных способа сделать это (в обоих случаях вам нужно будет pip install plotly)

  1. Использование сайта API Plotly (требует, чтобы вы 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 notebook). Вам не нужно подключаться к Интернету.

    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