为什么matplotlib的Slider只允许0-7的范围?

时间:2012-10-19 19:13:09

标签: python plot matplotlib bit-manipulation

我试图在1个字节上绘制逐位循环移位的值。我想有一个滑块让我改变原始输入值。我在matplotlib网站上使用滑块示例作为参考,但出于某种原因,即使我在运行脚本时传入0-255作为滑块范围,但范围始终为0-7。我猜不知道滑块是否被锁定到我的最大x值,但我不知道如何。如何让滑块让我选择完整的0-255范围?

另外,尽管我给了滑块的最小值/最大值,它会在前面插入一些填充值,使其低于0,然后在滑块中间随机绘制一条垂直线。我怎么摆脱它? (也是为了什么?目的对我来说并不明显)

滑块的图片最多只能达到7: enter image description here

代码:

import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

from numpy import uint8
from numpy import uint16
from numpy import uint32
from numpy import uint64

def sizeof(x):
    return [uint8, uint16, uint32, uint64].index(x) + 1

def rot(x, i):
    return type(x)((x >> i) | (x << (sizeof(type(x))*8 - i))) 

def plotShifts(x):
    origType = type(x)
    maxval = type(x)(-1)

    numrots = sizeof(type(x)) * 8
    vals = [rot(x, i) for i in range(numrots)]

    print vals

    l, = plt.plot(range(numrots), vals, 'ro')

    axcolor = 'lightgoldenrodyellow'
    inputax = plt.axes([0.15, 0.05, 0.65, 0.03], axisbg=axcolor)
    inputsl = Slider(inputax, 'Input', 0, maxval, valinit=0, valfmt="%d")

    def update(x):
        vals = [rot(origType(x), i) for i in range(numrots)]
        l.set_ydata(vals)
        plt.draw()
    inputsl.on_changed(update)

    plt.axis([-0.5, numrots-1 + 0.5, -2, maxval + 2])

plotShifts(uint8(1))
plt.show()

2 个答案:

答案 0 :(得分:3)

问题出在最后一行plt.axis([-0.5, numrots-1 + 0.5, -2, maxval + 2]),它作用于保持滑块的轴,而不是带有数据的轴。

我建议使用OO接口matplotlib而不是pyplot接口来进行任何编程。 pyplot接口适用于交互式内容,但它有很多隐藏状态。

由于回调的工作方式,您还需要返回对slider对象的引用。

import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

from numpy import uint8
from numpy import uint16
from numpy import uint32
from numpy import uint64

def sizeof(x):
    return 2 ** [uint8, uint16, uint32, uint64].index(x)

def rot(x, i):
    return type(x)((x >> i) | (x << (sizeof(type(x))*8 - i))) 

def plotShifts(x):
    fig = plt.figure() # make a new figure
    ax = fig.add_axes([0.15, 0.2, 0.65, 0.7]) # add data axes
    origType = type(x)
    maxval = type(x)(-1)

    numrots = sizeof(type(x)) * 8
    vals = [rot(x, type(x)(i)) for i in range(numrots)]

    print vals
    print maxval
    l, = ax.plot(range(numrots), vals, 'ro') # plot to data axes

    axcolor = 'lightgoldenrodyellow'
    inputax = fig.add_axes([0.15, 0.05, 0.65, 0.03], axisbg=axcolor)
    inputsl = Slider(inputax, 'Input', 0, maxval, valinit=0, valfmt="%d")

    def update(x):
        vals = [rot(origType(x), origType(i)) for i in range(numrots)]
        l.set_ydata(vals)
        plt.draw()
    inputsl.on_changed(update)

    ax.set_ylim([-2,maxval +2]) # set ylim on data axes
    ax.set_xlim([-.5,numrots-1+.05]) # set xlim on data axes


    return inputsl

sldr = plotShifts(uint8(1))
plt.show()

答案 1 :(得分:1)

很可能是因为此行中的maxval = 7

inputsl = Slider(inputax, 'Input', 0, maxval, valinit=0, valfmt="%d")