带matplotlib的对数滑块

时间:2016-10-10 14:37:58

标签: python matplotlib

我刚刚在我的情节中实现了一个滑块,效果很好。 (我使用了这个例子:http://matplotlib.org/examples/widgets/slider_demo.html)现在我的问题是,是否可以使滑块成为对数。我的值介于0和1之间,我希望从0.01到0.02等进行更改,但也需要从0.01到0.5进行更改。这就是为什么我认为对数刻度会很好。此外,如果这对滑块不可行,那么您是否有其他想法如何实现?

2 个答案:

答案 0 :(得分:3)

您只需np.log()滑块的值即可。然而,它旁边的标签将是不正确的。您需要手动将滑块的valtext文本设置为日志值:

def update(val):
    amp = np.log(slider.val)
    slider.valtext.set_text(amp)

答案 1 :(得分:2)

我知道已经有几年了,但我认为它仍然有用。 先前的答案很简单明了,但是可能会出现例如初始值未正确显示的问题。 您可以通过创建一个继承自matplotlib滑块的新类来直接创建日志滑块,并编辑设置该值的函数,如下所示:

from matplotlib.widgets import Slider


class Sliderlog(Slider):

"""Logarithmic slider.

    Takes in every method and function of the matplotlib's slider.

    Set slider to *val* visually so the slider still is lineat but display 10**val next to the slider.

    Return 10**val to the update function (func)"""

    def set_val(self, val):

        xy = self.poly.xy
        if self.orientation == 'vertical':
            xy[1] = 0, val
            xy[2] = 1, val
        else:
            xy[2] = val, 1
            xy[3] = val, 0
        self.poly.xy = xy
        self.valtext.set_text(self.valfmt % 10**val)   # Modified to display 10**val instead of val
        if self.drawon:
            self.ax.figure.canvas.draw_idle()
        self.val = val
        if not self.eventson:
            return
        for cid, func in self.observers.items():
                func(10**val)

使用它的方式与使用滑块的方式相同,但不是调用方式:

    Slider(ax, label, valmin, valmax, valinit=0.5, valfmt='%1.2f', closedmin=True, closedmax=True, slidermin=None, slidermax=None, dragging=True, valstep=None, orientation='horizontal')

只需致电:

    Sliderlog(ax, label, valmin, valmax, valinit=0.5, valfmt='%1.2f', closedmin=True, closedmax=True, slidermin=None, slidermax=None, dragging=True, valstep=None, orientation='horizontal',

请注意,如果要使用10 ^ 3作为初始值,则必须传递valinit = 3而不是10 ** 3。 valmax和valmin相同。如果您无法轻松输入log10(desired_value),则可以使用它。