एकल असतत स्लाइडर बनाने की समस्या को यहाँ हल किया गया है।

क्या मैं matplotlib स्लाइडर्स को अधिक असतत बना सकता हूं?

मैं कई अलग-अलग स्लाइडर बनाने में सक्षम होना चाहता हूं।

पायथन स्लाइडर_डेमो पृष्ठों में, (http://matplotlib.org/examples/widgets/slider_demo.html ), कई स्लाइडर को स्लाइडर_नाम.वैल्यू के माध्यम से एक्सेस किया जाता है, जहां मान अपडेट फ़ंक्शन द्वारा ली गई विशेषता है। असतत स्लाइडर निर्माण में, कोई व्यक्ति स्लाइडर_नाम.वैल्यू को कॉल नहीं कर सकता है, क्योंकि असतत स्लाइडर में कोई विशेषता 'मान' नहीं होती है। स्लाइडर_नाम.सेट_वैल (मान) को कॉल करने से अनंत पुनरावर्तन समस्या हो सकती है।

क्या किसी को पता है कि निर्माण से जुड़े कई अलग-अलग स्लाइडर कैसे बनाएं? अग्रिम में बहुत धन्यवाद।

0
Super 1 जुलाई 2016, 19:41

1 उत्तर

सबसे बढ़िया उत्तर

इस सवाल पर मेरे जवाब पर आधारित एकाधिक PageSliders का उपयोग कर सकते हैं। वे मूल Slider के मूल सिद्धांत को नहीं बदलते हैं, जैसे कि .val और set_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

1
Community 23 मई 2017, 15:17