2016-03-13 69 views
0

我想使用onclick方法來選擇我的matplotlib圖上的一系列數據。但事情是,我不能這樣做,並更新情節。我有一些想法來做到這一點,其中之一是將我添加新圖片後跳轉到新索引的地塊列表......但大多數情況下,我希望能夠存儲點擊信息( event.xdata)兩次,以在該部分的圖形下面着色 - 但對於初學者來說,無論我點擊哪個點,它都將成爲繪製點的成就。但我認爲有一個比plt.draw()onclick函數中更好的解決方案?matplotlib onclick事件重複

import numpy as np 
import matplotlib.pyplot as plt 
from itertools import islice 

class ReadFile(): 
    def __init__(self, filename): 
     self._filename = filename 

    def read_switching(self): 
     return np.genfromtxt(self._filename, unpack=True, usecols={0}, delimiter=',') 

def onclick(event): 
    global ix, iy 
    ix, iy = event.xdata, event.ydata 
    global coords 
    coords.append((ix, iy)) 
    print(coords) 
    fig.canvas.mpl_disconnect(cid) 
    return coords 

coords = []  
filename = 'test.csv' 
fig = plt.figure() 
ax = fig.add_subplot(111) 
values = (ReadFile(filename).read_switching()) 
steps = np.arange(1, len(values)+1)*2 
graph_1, = ax.plot(steps, values, label='original curve') 
cid = fig.canvas.mpl_connect('button_press_event', onclick) 
print(coords) 
graph_2, = ax.plot(coords, marker='o') 
plt.show() 

例如我有以下功能(圖),我想點擊兩個座標和曲線下顏色的區域,大概有plt.draw()Example function

回答

1

問題是,您正在斷開回調中的on_click事件。相反,您需要更新graph_2對象的xdataydata。然後強制重繪數字

import numpy as np 
import matplotlib.pyplot as plt 


fig = plt.figure() 
ax = fig.add_subplot(111) 

# Plot some random data 
values = np.random.rand(4,1); 
graph_1, = ax.plot(values, label='original curve') 
graph_2, = ax.plot([], marker='o') 

# Keep track of x/y coordinates 
xcoords = [] 
ycoords = [] 

def onclick(event): 
    xcoords.append(event.xdata) 
    ycoords.append(event.ydata) 

    # Update plotted coordinates 
    graph_2.set_xdata(xcoords) 
    graph_2.set_ydata(ycoords) 

    # Refresh the plot 
    fig.canvas.draw() 

cid = fig.canvas.mpl_connect('button_press_event', onclick) 
plt.show() 
+0

這是一個很大的幫助,但我仍然不明白如何從函數調用中取回x和y座標?我想存儲點擊座標並在其他功能中使用它們。我知道,我可以在相同的功能中使用它們。 – xtlc

+0

@xtlc'xcoords'和'ycoords'是全局變量,所以它們應該可以被所有其他函數訪問 – Suever

+0

對不起,我自己解釋不好:當我點擊時,我可以使用函數中的座標,但是發生在功能停止。例如,如果我想從「def onclick(event)」打印外部座標,該怎麼辦?這就是爲什麼我想要「像一個循環」的原因。 – xtlc