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