我试图在1个字节上绘制逐位循环移位的值。我想有一个滑块让我改变原始输入值。我在matplotlib网站上使用滑块示例作为参考,但出于某种原因,即使我在运行脚本时传入0-255作为滑块范围,但范围始终为0-7。我猜不知道滑块是否被锁定到我的最大x值,但我不知道如何。如何让滑块让我选择完整的0-255范围?
另外,尽管我给了滑块的最小值/最大值,它会在前面插入一些填充值,使其低于0,然后在滑块中间随机绘制一条垂直线。我怎么摆脱它? (也是为了什么?目的对我来说并不明显)
滑块的图片最多只能达到7:
代码:
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()
答案 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")