2012-10-19 44 views
1

我想繪製一個字節的按位循環移位的值。我想要一個滑塊讓我改變原來的輸入值。我在matplotlib站點上使用滑塊示例作爲參考,但由於某些原因,即使我在運行腳本時傳遞0-255作爲滑塊範圍,範圍始終爲0-7。我猜測,滑塊被鎖定到我的最大數量的x值,但我不知道如何。我如何讓滑塊讓我選擇完整的0-255範圍?爲什麼matplotlib的Slider只允許0-7的範圍?

此外,儘管最小/最大我給了滑塊它插入一些填充在前面低於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() 

回答

3

的問題是在最後一行plt.axis([-0.5, numrots-1 + 0.5, -2, maxval + 2])其作用於保持所述滑塊,而不是在軸的軸與數據。

我建議使用面向matplotlib的OO接口,而不是使用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() 
+0

doh!完全忘了我是如何混合OOP和狀態機界面的。 –

+0

我知道我可以調用軸來創建一個軸對象,因爲我爲滑塊做了這個操作,但是如何將它添加到繪圖?我已經嘗試了幾個變體,在plot對象上調用set_axes或者將它作爲axes關鍵字傳遞給構造函數,並且它們都使我的繪圖消失... –

+1

@JosephGarvin請參閱編輯 – tacaswell

1

很可能是因爲MAXVAL = 7在這條線

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

其實當我現在嘗試它... MAXVAL是255,所以也許那不是它... –

+0

沒錯這就是255,因爲當你指定-1到一個無符號數,你獲得最高的無符號數,這對於一個uint8是255. –