2016-10-05 2 views
0

Я пытаюсь сделать график OHLC, построенный с помощью matplotlib интерактивного при нажатии пользователем на действительную точку. Данные хранятся в виде панд dataframe формыОбъект AxesSubplot 'не имеет атрибута' get_xdata 'ошибка при построении графика OHLC matplotlib

index  PX_BID PX_ASK PX_LAST PX_OPEN PX_HIGH PX_LOW 
2016-07-01 1.1136 1.1137 1.1136 1.1106 1.1169 1.1072 
2016-07-04 1.1154 1.1155 1.1154 1.1143 1.1160 1.1098 
2016-07-05 1.1076 1.1077 1.1076 1.1154 1.1186 1.1062 
2016-07-06 1.1100 1.1101 1.1100 1.1076 1.1112 1.1029 
2016-07-07 1.1062 1.1063 1.1063 1.1100 1.1107 1.1053 

Я черчения его с функцией свечной Matplotlib в:

candlestick2_ohlc(ax1, df['PX_OPEN'],df['PX_HIGH'],df['PX_LOW'],df['PX_LAST'],width=1) 

Когда график выглядит Somthing так:

Я хочу, чтобы консоль распечатала значение щелчка точки, дату и открытость, высокий уровень или закрытие. До сих пор у меня есть что-то вроде:

fig, ax1 = plt.subplots() 
ax1.set_picker(True) 
ax1.set_title('click on points', picker=True) 
ax1.set_ylabel('ylabel', picker=True, bbox=dict(facecolor='red')) 

line = candlestick2_ohlc(ax1, df['PX_OPEN'],df['PX_HIGH'],df['PX_LOW'],df['PX_LAST'],width=0.4) 

def onpick1(event): 
    if isinstance(event.artist, (lineCollection, barCollection)): 
     thisline = event.artist 
     xdata = thisline.get_xdata() 
     ydata = thisline.get_ydata() 
     ind = event.ind 
     #points = tuple(zip(xdata[ind], ydata[ind])) 
     #print('onpick points:', points) 
     print('X='+str(np.take(xdata, ind)[0])) # Print X point 
     print('Y='+str(np.take(ydata, ind)[0])) # Print Y point 

fig.canvas.mpl_connect('pick_event', onpick1) 
plt.show() 

Когда я запускаю этот график появляется, однако при нажатии в любом месте на графике он дает ошибку:

AttributeError: объект «AxesSubplot» не имеет атрибута «get_xdata». Не поддерживает ли candlestick2_ohlc это?

Кроме того, что такое тип экземпляра matplotlibs candlestick2_ohlc, поэтому я могу проверить, нажал ли пользователь на фактическую точку?

Например, для линейного графика можно использовать для проверки

isinstance(event.artist,Line2D) 

ответ

0

Прежде всего, candlestick2_ohlc, как представляется, создать и вернуть кортеж в matplotlib.collections.LineCollection, например, и matplotlib.collections.PolyCollection экземпляр.

Мы должны сделать каждый из этих экземпляров подбираемым, прежде чем мы сделаем что-нибудь еще.

Если взять эти экземпляры, как они вернулись из candlestick2_ohlc, это легко с помощью set_picker:

linecoll, polycoll = candlestick2_ohlc(ax1, df['PX_OPEN'],df['PX_HIGH'],df['PX_LOW'],df['PX_LAST'],width=0.4) 

linecoll.set_picker(True) 
polycoll.set_picker(True) 

Они то, что нам нужно проверить в onpick1 функции:

import matplotlib.collections as collections 

def onpick1(event): 

    # Check we have clicked on one of the collections created by candlestick2_ohlc 
    if isinstance(event.artist, (collections.LineCollection, collections.PolyCollection)): 

     thiscollection = event.artist 
     # Find which box or line we have clicked on 
     ind = event.ind[0] 

     # Find the vertices of the object 
     verts = thiscollection.get_paths()[ind].vertices 

     if isinstance(event.artist, collections.LineCollection): 
      print "Errorbar line dimensions" 
     elif isinstance(event.artist, collections.PolyCollection): 
      print "Box dimensions" 

     # Print the minimum and maximum extent of the object in x and y 
     print("X = {}, {}".format(verts[:, 0].min(), verts[:, 0].max())) 
     print("Y = {}, {}".format(verts[:, 1].min(), verts[:, 1].max())) 
Смежные вопросы