Search code examples
python-2.7matplotlibsubplotrandom-walk

Using SubPlots With LineCollection


I am trying to plot a random walk constrained to move about a lattice.

To implement this constraint I am using hstack to format the segments for LineCollection from the matplotlib module.

I want four random walks to start in four quadrants all on the same plot. As my code stands now, I get four individual plots.

How do I specify ploting all the data on the same plot? #multiple 2D random walks

    from matplotlib import collections  as mc
    import numpy as np
    import pylab as plt

    steps = 1000
    coar = np.empty([steps,2],int)
    #random walk start cooridiates
    n1=np.array([50,50],int)
    n2=np.array([-50,50],int)
    n3=np.array([-50,-50],int)
    n4=np.array([50,-50],int)
    na = [n1,n2,n3,n4]
    #colors of the four random walks
    clr = ['g','c','m','y']

    with open("raw_ran_576001.txt","r") as rf:
        for j in range(len(na)): 
            for t in range(0,steps):
                bin=rf.read(2)      #reads two bits to generate random step of walk
                if(bin=="00"):
                    na[j][0]+=1
                elif(bin=="11"):
                    na[j][0]-=1
                elif(bin=="01"):
                    na[j][1]+=1
                elif(bin=="10"):
                    na[j][1]-=1
                coar[t] = na[j] 
            coart = coar.reshape(-1,1,2)
            segments = np.hstack([coart[:-1],coart[1:]])
             # figure out how to add different random walks in different colors
             #to same plot
            coll = mc.LineCollection(segments,color=clr[j])
            fig, ax=plt.subplots()          #just a figure and one subplot
            ax.set_axis_bgcolor('black')
            ax.add_collection(coll)         #this must be where points are ploted
            ax.autoscale()
            t=0
    plt.show()

What am I overlooking

btw I am using random bits generated from a radioisotope hardware random number generator.


Solution

  • Fun problem. It was actually super simple - you just had to take the fig, ax=plt.subplots() command outside your loop.

    Your example didn't work for me because I don't have a copy of the file you're drawing from so I used numpy's random module to emulate it. I also used the plot command because it seemed a simpler way to do what you're looking for.

    # Import what you need
    import numpy as np
    import pylab as plt
    
    # Set the number of steps you're going to walk along
    steps = 1000
    
    # Set the random walk start coordinates
    # for each of four random walks
    n1=np.array([50,50],int)
    n2=np.array([-50,50],int)
    n3=np.array([-50,-50],int)
    n4=np.array([50,-50],int)
    na_list = [n1,n2,n3,n4]
    
    # Set the colors of the four random walks
    clr_list = ['g','c','m','y']
    
    # Create one figure with one subplot
    fig, ax=plt.subplots()
    # Set the background color to black
    ax.set_axis_bgcolor('black')
    
    # Loop through the different random walks
    for na, clr in zip(na_list, clr_list):
    
        # Create a list of coordinates
        # initiated by the start coordinates
        coar = np.ones([steps+1,2],int) * na
    
        # For each step figure out if you're 
        # going to walk right, left, up or down        
        for t in range(0,steps):
    
            # Set coar for the point after
            # this step (t+1) to be the point the
            # step starts at (t)
            coar[t+1] = coar[t]
    
            # Get a random number
            bin = np.random.randint(4)
    
            if(bin==0):
                # Step to the right (inc x by 1) 
                coar[t+1][0] = coar[t,0] + 1
            elif(bin==1):
                # Step to the left (dec x by 1) 
                coar[t+1][0] = coar[t,0] - 1
            elif(bin==2):
                # Step up (inc y by 1) 
                coar[t+1][1] = coar[t,1] + 1
            elif(bin==3):
                # Step down (dec y by 1) 
                coar[t+1][1] = coar[t,1] - 1
    
        # Plot these coordinates
        ax.plot(coar.T[0], coar.T[1], c=clr)
    
        # And show the starting point with a white triangle
        # just to make it clear where you started
        ax.scatter(coar[0,0], coar[0,1], marker='^', c='w', edgecolor='w', s=70, zorder=3)
    
    # Autoscale the axis
    ax.autoscale()
    # And show the plot
    plt.show()
    

    enter image description here