72043 # Logarithmic slider with matplotlib

<h3>Question</h3>

I just implemented a slider in my plot which works great. (I used this example: http://matplotlib.org/examples/widgets/slider_demo.html) Now my question is if it is possible to make the slider logarithmic. My values range between 0 and 1 and I want to make changes from 0.01 to 0.02 and so on but also from 0.01 to 0.5. That is why I think a logarithmic scale would be nice. Also if this isn't doable with a slider do you then have other ideas how to implement this?

You can simply `np.log()` the value of the slider. However then the label next to it would be incorrect. You need to manually set the text of `valtext` of the slider to the log-value:

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

I know it's been few years but I think it still is useful. The previous answer is simple and straightforward but can be a problem with the inital values not correctly displayed for example. You can directly create a log slider by creating a new class inheriting from the matplotlib slider and edit the function that set the value like so :

```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 = 0, val xy = 1, val else: xy = val, 1 xy = 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) ```

You use it the same way you use the slider but instead of call :

``` 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') ```

Just call :

``` 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', ```

Be careful, if you want to have 10^3 as initial value you have to pass in valinit=3 not 10**3. Same for valmax and valmin. You can use log10(desired_value) if you can not easily type it.