2015-09-23 3 views
1

Основываясь на примерах this и that, я пытаюсь добавить ползунки к фигуре динамически (в функции объекта, который отображается).matplotlib - добавление ползунков к фигуре динамически

Ползунки создаются и добавляются внутри цикла for, и новая функция update() создается каждый раз.

Проблемы: ползунки не реагируют на любые входы мыши!

Любая идея, как решить эту проблему?

graph

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib.widgets import Slider 

class Plotter: 
    def __init__(self): 
     self.fig, self.ax = plt.subplots() 

    def plot(self, obj): 
     self.obj = obj 
     self.l = plt.plot(obj.t,obj.series()) 
     vars = obj.get_variables() 
     plt.subplots_adjust(bottom=0.03*(len(vars)+2)) 
     for i,var in enumerate(vars): 
      self.add_slider(i*0.03, var[0], var[1], var[2]) 
     plt.show() 

    def add_slider(self, pos, name, min, max): 
     ax = plt.axes([0.1, 0.02+pos, 0.8, 0.02], axisbg='lightgoldenrodyellow') 
     slider = Slider(ax, name, min, max, valinit=getattr(self.obj, name)) 
     def update(val): 
      setattr(self.obj, name, val) 
      self.l.set_ydata(self.obj.series()) 
      self.fig.canvas.draw_idle() 
     slider.on_changed(update) 

class SinFunction: 
    def __init__(self): 
     self.freq = 1.0 
     self.amp = 0.5 
     self.t = np.arange(0.0, 1.0, 0.001) 

    def series(self): 
     return self.amp*np.sin(2*np.pi*self.freq*self.t) 

    def get_variables(self): 
     return [ 
      ('freq', 0.1, 10), 
      ('amp', 0.1, 1) 
     ] 

Plotter().plot(SinFunction()) 

ответ

1

В plot способе Plotter класса вы получения всех серии сюжета таким образом self.l = plt.plot(obj.t,obj.series()) так в self.l у вас есть список объектов, а не сам объект. У вас может быть несколько строк.

В способе add_slider вы должны изменить линию self.l.set_ydata(self.obj.series()) на номер self.l[0].set_ydata(self.obj.series()), чтобы использовать способ объекта. В этом случае есть только один объект в self.l, но у вас может быть больше. Пожалуйста, учтите это.

Кроме того, чтобы слайдеры работали соответственно (см. Комментарии ниже), кажется, что они должны быть в том же объеме. Для того, чтобы иметь ползунки в том же объеме, вы можете создать sliders attribute

Окончательный код должен быть:

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib.widgets import Slider 

class Plotter: 
    def __init__(self): 
     self.fig, self.ax = plt.subplots() 

    def plot(self, obj): 
     self.obj = obj 
     self.l = plt.plot(obj.t,obj.series()) 
     _vars = obj.get_variables() 
     plt.subplots_adjust(bottom=0.03*(len(_vars)+2)) 
     self.sliders = [] 
     for i,var in enumerate(_vars): 
      self.add_slider(i*0.03, var[0], var[1], var[2]) 
     plt.show() 

    def add_slider(self, pos, name, min, max): 
     ax = plt.axes([0.1, 0.02+pos, 0.8, 0.02], axisbg='lightgoldenrodyellow') 
     slider = Slider(ax, name, min, max, valinit=getattr(self.obj, name)) 
     self.sliders.append(slider) 
     def update(val): 
      setattr(self.obj, name, val) 
      self.l[0].set_ydata(self.obj.series()) 
      self.fig.canvas.draw_idle() 
     slider.on_changed(update) 

class SinFunction: 
    def __init__(self): 
     self.freq = 1.0 
     self.amp = 0.5 
     self.t = np.arange(0.0, 1.0, 0.001) 

    def series(self): 
     return self.amp*np.sin(2*np.pi*self.freq*self.t) 

    def get_variables(self): 
     return [ 
      ('freq', 0.1, 10), 
      ('amp', 0.1, 1) 
     ] 

k = Plotter() 
k.plot(SinFunction()) 

Эта версия работает для меня на Python 2 и Python 3.

PD: Я видел различное поведение на Python 2 по сравнению с Python 3. Я не знаю, связано ли это с Python или с Matplotlib ... ¿?

+0

Спасибо! Однако это не устраняет исходную проблему (невосприимчивые слайдеры). Есть подсказки? –

+0

Он работает для меня. Пожалуйста, не могли бы вы рассказать мне, как вы используете код, какие ошибки вы получаете, версии библиотек, ...? – kikocorreoso

+0

Я использую Python 2.7, matplotlib 1.4.3, и я запускаю скрипт из ноутбука IPython. –

Смежные вопросы