2016-07-01 11 views
0

ここでは、単一のディスクリートスライダを作成する問題を解決しました。複数のスライダ、pythonのディスクリートスライダ

Can I make matplotlib sliders more discrete?

私は、複数の離散スライダーを作成できるようにしたいと思います。

python slider_demoページ(http://matplotlib.org/examples/widgets/slider_demo.html)では、slider_name.valueから複数のスライダにアクセスします。ここで、valueはupdate関数によって取得される属性です。離散スライダの構築では、スライダ名.valueを呼び出すことはできません。離散スライダには属性 'value'がありません。 slider_name.set_val(value)を呼び出すと、無限の再帰問題が発生します。

リンクされた構造から複数のディスクリートスライダーを作成する方法を知っている人はいますか?事前に多くの感謝。

答えて

1

this questionの私の答えに基づいて、PageSliderを複数使用することができます。元のSliderの基本原則を変更していないので、.valset_valがまだ利用可能です。

import matplotlib.widgets 
import matplotlib.patches 
import mpl_toolkits.axes_grid1 

class PageSlider(matplotlib.widgets.Slider): 

    def __init__(self, ax, label, numpages = 10, valinit=0, valfmt='%1d', 
       closedmin=True, closedmax=True, 
       dragging=True, **kwargs): 

     self.facecolor=kwargs.get('facecolor',"w") 
     self.activecolor = kwargs.pop('activecolor',"b") 
     self.fontsize = kwargs.pop('fontsize', 10) 
     self.numpages = numpages 

     super(PageSlider, self).__init__(ax, label, 0, numpages, 
          valinit=valinit, valfmt=valfmt, **kwargs) 

     self.poly.set_visible(False) 
     self.vline.set_visible(False) 
     self.pageRects = [] 
     for i in range(numpages): 
      facecolor = self.activecolor if i==valinit else self.facecolor 
      r = matplotlib.patches.Rectangle((float(i)/numpages, 0), 1./numpages, 1, 
           transform=ax.transAxes, facecolor=facecolor) 
      ax.add_artist(r) 
      self.pageRects.append(r) 
      ax.text(float(i)/numpages+0.5/numpages, 0.5, str(i+1), 
        ha="center", va="center", transform=ax.transAxes, 
        fontsize=self.fontsize) 
     self.valtext.set_visible(False) 

     divider = mpl_toolkits.axes_grid1.make_axes_locatable(ax) 
     bax = divider.append_axes("right", size="5%", pad=0.05) 
     fax = divider.append_axes("right", size="5%", pad=0.05) 
     self.button_back = matplotlib.widgets.Button(bax, label=ur'$\u25C0$', 
         color=self.facecolor, hovercolor=self.activecolor) 
     self.button_forward = matplotlib.widgets.Button(fax, label=ur'$\u25B6$', 
         color=self.facecolor, hovercolor=self.activecolor) 
     self.button_back.label.set_fontsize(self.fontsize) 
     self.button_forward.label.set_fontsize(self.fontsize) 
     self.button_back.on_clicked(self.backward) 
     self.button_forward.on_clicked(self.forward) 

    def _update(self, event): 
     super(PageSlider, self)._update(event) 
     i = int(self.val) 
     if i >=self.valmax: 
      return 
     self._colorize(i) 

    def _colorize(self, i): 
     for j in range(self.numpages): 
      self.pageRects[j].set_facecolor(self.facecolor) 
     self.pageRects[i].set_facecolor(self.activecolor) 

    def forward(self, event): 
     current_i = int(self.val) 
     i = current_i+1 
     if (i < self.valmin) or (i >= self.valmax): 
      return 
     self.set_val(i) 
     self._colorize(i) 

    def backward(self, event): 
     current_i = int(self.val) 
     i = current_i-1 
     if (i < self.valmin) or (i >= self.valmax): 
      return 
     self.set_val(i) 
     self._colorize(i) 


if __name__ == "__main__": 
    import numpy as np 
    from matplotlib import pyplot as plt 


    num_pages = 15 
    data = np.random.rand(9, 9, num_pages) 

    fig, ax = plt.subplots() 
    fig.subplots_adjust(bottom=0.22) 

    im = ax.imshow(data[:, :, 0], cmap='viridis', interpolation='nearest', origin="lower") 

    ax_slider = fig.add_axes([0.1, 0.07, 0.8, 0.04]) 
    ax_slider2 = fig.add_axes([0.1, 0.02, 0.8, 0.04]) 
    slider = PageSlider(ax_slider, 'Page', num_pages, activecolor="orange") 
    slider2 = PageSlider(ax_slider2, 'Size', data.shape[0], valinit=8, activecolor="yellow") 

    def update(val): 
     i = int(slider.val) 
     j = int(slider2.val) 
     im.set_data(data[:j+1,:j+1,i]) 
     im.set_extent([-0.5,j+0.5,-0.5,j+0.5]) 
     fig.canvas.draw() 


    slider.on_changed(update) 
    slider2.on_changed(update) 

    plt.show() 

enter image description here

関連する問題