0

I am stuck with a small piece of code using matplotlib in python and would like some help. I am trying to animate two box cars in python using matplotlib package in python but I cannot get animate function to update the x-coordinates of both the cars simultaneously.

An minimal working example is given below:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib.animation as animation

# Complete length of trajectory 
maxL = 2000

# Initial positions and velocities of lead and host cars
xl = 30
vl = 5

xh = 0
vh = 5

# Step size 
dt = 0.1 

lead = np.matrix([[xl,vl]])
host = np.matrix([[xh,vh]])

while xl < maxL:
    xl = xl + vl*dt
    lead = np.concatenate((lead,[[xl,vl]]), axis = 0)
    xh = xh + vh*dt
    host = np.concatenate((host,[[xh,vh]]), axis = 0)

road_width = 3;
fig1 = plt.figure(1)
ax = fig1.add_subplot(111)
rect_l = patches.Rectangle(
         (lead[0,0], road_width/2),   # (x,y)
         10,          # width
         1,          # height
         facecolor = "red", # remove background
         )
rect_h = patches.Rectangle(
          (host[0,0], road_width/2),   # (x,y)
          10,          # width
          1,          # height
          facecolor = "blue", # remove background
          )

ax.add_patch(rect_l)
ax.add_patch(rect_h)

def init():
    plt.plot([0,maxL],[road_width,road_width],'k-')
    plt.plot([0,maxL],[-road_width,-road_width],'k-')
    plt.plot([0,maxL],[0,0],'k--')
    return []

#### This works #####
def animate(x1):
    rect_l.set_x(x1)
    return rect_l,


plt.axis([0, maxL, -10, 10])
plt.xlabel('time (s)')
plt.ylabel('road')
plt.title('Car simulation')
ani = animation.FuncAnimation(fig1, animate, lead[:,0], init_func = init, interval=0.1, blit=False)

plt.show()

But I want something like below. Python crashes on running this code.

def animate(x1,x2):
    rect_l.set_x(x1)
    rect_h.set_x(x2)
    return rect_l,rect_h,


plt.axis([0, maxL, -10, 10])
plt.xlabel('time (s)')
plt.ylabel('road')
plt.title('Car simulation')
ani = animation.FuncAnimation(fig1, animate, (lead[:,0],host[:,0]), init_func = init, interval=0.1, blit=False)

plt.show()

1 Answer 1

1

Instead of the value to use for plotting, you can provide the number of frames to the frames argument.

ani = animation.FuncAnimation(fig1, animate, frames=len(lead) )

This is equivalent of using the range between 0 and len(lead) and will call the animation with the integer number of the currect frame. You can use this number to select the appropriate value from both, the lead and the host array inside the animation function.

def animate(i):
    x1 = lead[i,0]
    x2 = host[i,0]
    rect_l.set_x(x1)
    rect_h.set_x(x2)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.