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