Python 带matplotlib的对数滑块

Python 带matplotlib的对数滑块,python,matplotlib,Python,Matplotlib,我刚刚在我的绘图中实现了一个滑块,效果非常好。(我用了这个例子:)现在我的问题是,是否可以使滑块对数。我的值介于0和1之间,我希望从0.01更改为0.02,依此类推,但也希望从0.01更改为0.5。这就是为什么我认为对数刻度会很好。此外,如果这是不可行的滑块然后你有其他想法如何实现这一点 您可以简单地np.log()滑块的值。但是,它旁边的标签可能不正确。您需要手动将滑块的valtext文本设置为日志值: def update(val): amp = np.log(slider.val)

我刚刚在我的绘图中实现了一个滑块,效果非常好。(我用了这个例子:)现在我的问题是,是否可以使滑块对数。我的值介于0和1之间,我希望从0.01更改为0.02,依此类推,但也希望从0.01更改为0.5。这就是为什么我认为对数刻度会很好。此外,如果这是不可行的滑块然后你有其他想法如何实现这一点

您可以简单地
np.log()
滑块的值。但是,它旁边的标签可能不正确。您需要手动将滑块的
valtext
文本设置为日志值:

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

我知道这已经有几年了,但我认为它仍然有用。 前面的答案简单明了,但可能是初始值显示不正确的问题,例如。 通过创建继承自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(所需的_值)