Note
Go to the end to download the full example code.
Plot speed traces with corner annotations¶
Plot the speed over the course of a lap and add annotations to mark corners.
import matplotlib.pyplot as plt
import fastf1.plotting
# Enable Matplotlib patches for plotting timedelta values and load
# FastF1's dark color scheme
fastf1.plotting.setup_mpl(mpl_timedelta_support=True, misc_mpl_mods=False,
color_scheme='fastf1')
# load a session and its telemetry data
session = fastf1.get_session(2021, 'Spanish Grand Prix', 'Q')
session.load()
First, we select the fastest lap and get the car telemetry data for this lap.
fastest_lap = session.laps.pick_fastest()
car_data = fastest_lap.get_car_data().add_distance()
Next, load the circuit info that includes the information about the location of the corners.
circuit_info = session.get_circuit_info()
Finally, we create a plot and plot the speed trace as well as the corner markers.
team_color = fastf1.plotting.get_team_color(fastest_lap['Team'],
session=session)
fig, ax = plt.subplots()
ax.plot(car_data['Distance'], car_data['Speed'],
color=team_color, label=fastest_lap['Driver'])
# Draw vertical dotted lines at each corner that range from slightly below the
# minimum speed to slightly above the maximum speed.
v_min = car_data['Speed'].min()
v_max = car_data['Speed'].max()
ax.vlines(x=circuit_info.corners['Distance'], ymin=v_min-20, ymax=v_max+20,
linestyles='dotted', colors='grey')
# Plot the corner number just below each vertical line.
# For corners that are very close together, the text may overlap. A more
# complicated approach would be necessary to reliably prevent this.
for _, corner in circuit_info.corners.iterrows():
txt = f"{corner['Number']}{corner['Letter']}"
ax.text(corner['Distance'], v_min-30, txt,
va='center_baseline', ha='center', size='small')
ax.set_xlabel('Distance in m')
ax.set_ylabel('Speed in km/h')
ax.legend()
# Manually adjust the y-axis limits to include the corner numbers, because
# Matplotlib does not automatically account for text that was manually added.
ax.set_ylim([v_min - 40, v_max + 20])
plt.show()
Total running time of the script: (0 minutes 2.212 seconds)