Я пытался использовать код, аналогичный решению, опубликованному ChrisB в другом вопросе stackoverflow ( Matplotlib: нарисуйте область выделения в форме прямоугольника с помощью мыши ), чтобы позволить пользователювыберите область домена графика, нажав / перетащив их мышью.Я сделал тестовый код, который отлично работает, но когда я включаю его в свой основной код, функциональность прекращается.Методы on_click и on_release, похоже, никогда не будут вызваны.Ниже приведен мой код класса regionSelecter.
class regionSelecter(object):
def __init__(self):
self.ax = plt.gca()
self.rect = Rectangle((0,0), 0, 0, fill=False)
self.x0 = None
self.y0 = self.ax.get_ylim()[0]
self.x1 = None
self.y1 = self.ax.get_ylim()[1]
self.ax.add_patch(self.rect)
self.ax.figure.canvas.mpl_connect('button_press_event', self.on_press)
self.ax.figure.canvas.mpl_connect('button_release_event', self.on_release)
def on_press(self, event):
print('press')
self.x0 = event.xdata
def on_release(self, event):
print('release')
self.x1 = event.xdata
self.rect.set_width(self.x1 - self.x0)
self.rect.set_height(self.y1 - self.y0)
self.rect.set_xy((self.x0, self.y0))
self.ax.figure.canvas.draw()
print(self.x0)
print(self.y0)
print(self.x1)
print(self.y1)
Вот мой тестовый код
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Rectangle
xdata = np.linspace(0,9*np.pi, num=100)
ydata = np.sin(xdata)
ax = plt.subplots()[1]
bar = ax.bar(xdata, ydata)
rs = regionSelecter()
plt.show()
И, наконец, мой основной код
"""
creates spectrum plot
"""
def specPlot(rng, index):
global df
spec = df.iloc[index, (df.shape[1] - rng):] # Get spectrum
ax = plt.subplots()[1]
ax.bar(range(rng), spec, width=4) # Plot spectrum
s=regionSelecter()
plt.show()
df - это pandas dataframe, spec - это фрагмент этого фрейма данных, который содержит ряд чисел, а rng - длина этого ряда.Почему мой класс regionSelecter действует по-разному в моем основном коде и в моем тестовом коде?