如何使用for循环从二进制数生成相应十进制数的动画方波

时间:2015-02-17 17:34:50

标签: python numpy matplotlib

我使用以下代码生成方波格式[例如:从0到5]使用for循环。我能够打印相应的二进制值但不能动态绘制方波。除此之外,我无法在绘图窗口中动态调整x轴的大小。我在Matplotlib动画部分找不到任何合适的代码。任何人都可以帮助我吗?

import numpy as np
import matplotlib.pyplot as plt

limit=int(raw_input('Enter the value of limit:'))

for x in range(0,limit):
    y=bin(x)[2:]
    data = [int(i) for i in y]
    print data
    xs = np.repeat(range(len(data)),2)
    ys = np.repeat(data, 2)
    xs = xs[1:]
    ys = ys[:-1]
    plt.plot(xs, ys)
    plt.xlim(0,len(data)+0.5)
    plt.ylim(-2, 2)
    plt.grid()
    plt.show()
    #plt.hold(True)
    #plt.pause(0.5)
    plt.clf()

1 个答案:

答案 0 :(得分:1)

你提出的问题非常模糊,所以我要去看看你想要的是用你想要的是使用相同的数字绘制一系列相等长度的二进制代码两者之间有一些延迟。

所以,这里有两个问题:

  1. 生成适当的二进制代码

  2. 先后绘制这些代码

  3. 1。生成适当的二进制代码

    根据我可以合理猜测,你想要绘制相同长度的二进制代码。因此,您必须对代码进行零填充,以使它们的长度相同。一种方法是使用python内置的zfill函数。

    e.g。

    bin(1).zfill(4)

    如果你想保持x轴范围不变,你还必须知道要绘制的最大二进制字符串的长度。既然你不清楚你是否想要不断长度的字符串,我就把它留在这里。

    2。连续绘制这些代码

    在matplotlib中创建动画有几种不同的方法。我发现手动更新数据比动画API目前更灵活,更少错误,所以我将在这里做。我还删除了一些我不清楚的代码部分。

    这是一个简单的实现:

    import matplotlib.pyplot as plt
    import numpy as np
    
    # Enable interactive plotting
    plt.ion()
    
    # Create a figure and axis for plotting on
    fig = plt.figure()
    ax = fig.add_subplot(111)
    
    # Add the line 'artist' to the plotting axis
    # use 'steps' to plot binary codes
    line = plt.Line2D((),(),drawstyle='steps-pre')
    ax.add_line(line)
    
    # Apply any static formatting to the axis
    ax.grid()
    ax.set_ylim(-2, 2)
    # ...
    
    try:
        limit = int(raw_input('Enter the value of limit:'))
        codelength = int(np.ceil(np.log2(limit)))+1 # see note*
        ax.set_xlim(0,codelength)
        for x in range(0,limit):
            # create your fake data
            y = bin(x)[2:].zfill(codelength)
            data = [int(i) for i in y]
            print data
            xs = range(len(data))
    
            line.set_data(xs,data)  # Update line data
            fig.canvas.draw()       # Ask to redraw the figure
    
            # Do a *required* pause to allow figure to redraw
            plt.pause(2)            # delay in seconds between frames
    except KeyboardInterrupt:   # allow user to escape with Ctrl+c
        pass
    finally:                    # Always clean up!
        plt.close(fig)
        plt.ioff()
        del ax,fig
    

    结果

    binary code plot

    *注意:我将二进制代码填充了一个额外的零,以使绘图看起来正确。