1

ビットごとの循環シフトの値を 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()
4

2 に答える 2

3

plt.axis([-0.5, numrots-1 + 0.5, -2, maxval + 2])問題は、データを含む軸ではなく、スライダーを保持する軸に作用する 最後の行にあります。

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()
于 2012-10-19T19:41:03.120 に答える
1

most likely because maxval =7 in this line

inputsl = Slider(inputax, 'Input', 0, maxval, valinit=0, valfmt="%d")
于 2012-10-19T19:20:39.640 に答える