2016-09-28 67 views
2

我想用matplotlib交互式繪製一個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) 

當繪製它看起來財產以後這樣的:

https://pythonprogramming.net/static/images/matplotlib/candlestick-ohlc-graphs-matplotlib-tutorial.png

我想要控制檯打印出點擊的點數,日期以及是開放的,高的低點還是接近點。到目前爲止,我有這樣的:

fig, ax1 = plt.subplots() 

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

此代碼然而跑和被點擊點的時候不顯示任何信息。當我看到互動matplotlib圖的例子,他們往往有情節函數的參數,如:

line, = ax.plot(rand(100), 'o', picker=5) 

然而,candlestick2_ohlc不採取「選擇器」 ARG。有關如何解決此問題的任何提示?

感謝

回答

1

您需要設置set_picker(True),以使選圖事件,或給點中的公差爲浮動(見http://matplotlib.org/api/artist_api.html#matplotlib.artist.Artist.set_picker)。

所以在你的情況下ax1.set_picker(True)如果你想挑選事件被觸發,只要mouseevent超過ax1

您可以啓用燭臺圖表元素上的拾取事件。我閱讀文檔並candlestick2_ohlc返回兩個對象的元組:LineCollectionPolyCollection。所以,你可以命名這些對象,並設置選擇器真正對他們

(lines,polys) = candlestick2_ohlc(ax1, ...) 
lines.set_picker(True) # collection of lines in the candlestick chart 
polys.set_picker(True) # collection of polygons in the candlestick chart 

事件的索引ind = event.ind[0]會告訴你哪些元素集合中包含的鼠標事件(event.ind返回索引列表,因爲鼠標事件可能涉及多個項目)。

在燭臺上觸發挑選事件後,您可以打印原始數據框中的數據。

這裏的一些工作的代碼

import matplotlib.pyplot as plt 
from matplotlib.collections import LineCollection, PolyCollection 
from matplotlib.text import Text 
from matplotlib.finance import candlestick2_ohlc 
import numpy as np 
import pandas as pd 

np.random.seed(0) 
dates = pd.date_range('20160101',periods=7) 
df = pd.DataFrame(np.reshape(1+np.random.random_sample(42)*0.1,(7,6)),index=dates,columns=["PX_BID","PX_ASK","PX_LAST","PX_OPEN","PX_HIGH","PX_LOW"]) 
df['PX_HIGH']+=.1 
df['PX_LOW']-=.1 

fig, ax1 = plt.subplots() 

ax1.set_title('click on points', picker=20) 
ax1.set_ylabel('ylabel', picker=20, bbox=dict(facecolor='red')) 

(lines,polys) = candlestick2_ohlc(ax1, df['PX_OPEN'],df['PX_HIGH'],df['PX_LOW'],df['PX_LAST'],width=0.4) 
lines.set_picker(True) 
polys.set_picker(True) 

def onpick1(event): 
    if isinstance(event.artist, (Text)): 
     text = event.artist 
     print 'You clicked on the title ("%s")' % text.get_text() 
    elif isinstance(event.artist, (LineCollection, PolyCollection)): 
     thisline = event.artist 
     mouseevent = event.mouseevent 
     ind = event.ind[0] 
     print 'You clicked on item %d' % ind 
     print 'Day: ' + df.index[ind].normalize().to_datetime().strftime('%Y-%m-%d') 
     for p in ['PX_OPEN','PX_OPEN','PX_HIGH','PX_LOW']: 
      print p + ':' + str(df[p][ind])  
     print('x=%d, y=%d, xdata=%f, ydata=%f' % 
      (mouseevent.x, mouseevent.y, mouseevent.xdata, mouseevent.ydata)) 



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

謝謝,但是這會導致錯誤: AttributeError的: 'AxesSubplot' 對象有沒有屬性 'get_xdata' 任何想法? –