Note
Go to the end to download the full example code. or to run this example in your browser via Binder
Density Plot Example
This example looks at how to plot 2d density plots. The Plotter().plot_density function can be
used to plot any number of StateMutableSequence objects. StateMutableSequences are just a
container for a number of states - examples include tracks and ground truth paths. The examples
below show how to plot ground truth paths (as they’re easy to generate). The function can be used to
analyse large data sets.
Set the imports and set the start time
from datetime import datetime, timedelta
from matplotlib import animation
from stonesoup.types.groundtruth import GroundTruthPath, GroundTruthState
from stonesoup.models.transition.linear import CombinedLinearGaussianTransitionModel, \
ConstantVelocity
from stonesoup.plotter import Plotter
start_time = datetime.now()
Generate the State Sequences to Plot
In this example we will plot ground truth paths due to their ease of creation. The ground truths are created in the following function:
def generate_ground_truth_path(initial_state, num_steps=20, motion_model_noise=0.01):
transition_model = CombinedLinearGaussianTransitionModel(
[ConstantVelocity(motion_model_noise), ConstantVelocity(motion_model_noise)])
ground_truth = GroundTruthPath([GroundTruthState(initial_state, timestamp=start_time)])
for k in range(0, num_steps):
ground_truth.append(GroundTruthState(
transition_model.function(ground_truth[k], noise=True,
time_interval=timedelta(seconds=1)),
timestamp=start_time+timedelta(seconds=k+1)))
return ground_truth
Create one ground truth path starting at the origin (0, 0) and plot it:
n_time_steps = 20
truth = generate_ground_truth_path(initial_state=[0, 0, 0, 1], num_steps=n_time_steps)
plotter = Plotter()
plotter.plot_ground_truths(truth, [0, 2])

[<matplotlib.lines.Line2D object at 0x733d7b0edb20>, <matplotlib.legend.Legend object at 0x733d7b0ed9a0>]
Generate 100 ground truth paths and plot them all at once. This looks quite messy:
truths = [generate_ground_truth_path(initial_state=[0, 0, 0, 1],
num_steps=n_time_steps,
motion_model_noise=0.1)
for _ in range(100)]
plotter = Plotter()
plotter.plot_ground_truths(set(truths), [0, 2])

[<matplotlib.lines.Line2D object at 0x733d7b0ec6e0>, <matplotlib.lines.Line2D object at 0x733d7c456ae0>, <matplotlib.lines.Line2D object at 0x733d7c455c40>, <matplotlib.lines.Line2D object at 0x733d7c457a10>, <matplotlib.lines.Line2D object at 0x733d7c4563f0>, <matplotlib.lines.Line2D object at 0x733d7c454ec0>, <matplotlib.lines.Line2D object at 0x733d7c457260>, <matplotlib.lines.Line2D object at 0x733d7c455250>, <matplotlib.lines.Line2D object at 0x733d7c457590>, <matplotlib.lines.Line2D object at 0x733d7c4544a0>, <matplotlib.lines.Line2D object at 0x733d7c4544d0>, <matplotlib.lines.Line2D object at 0x733d7c455e20>, <matplotlib.lines.Line2D object at 0x733d7c455e80>, <matplotlib.lines.Line2D object at 0x733d81e38b00>, <matplotlib.lines.Line2D object at 0x733d81e3aea0>, <matplotlib.lines.Line2D object at 0x733d81e39970>, <matplotlib.lines.Line2D object at 0x733d81e399a0>, <matplotlib.lines.Line2D object at 0x733d81e38290>, <matplotlib.lines.Line2D object at 0x733d81e39a00>, <matplotlib.lines.Line2D object at 0x733d81e39f10>, <matplotlib.lines.Line2D object at 0x733d81e3a8d0>, <matplotlib.lines.Line2D object at 0x733d81e396d0>, <matplotlib.lines.Line2D object at 0x733d81e39c40>, <matplotlib.lines.Line2D object at 0x733d81e3a030>, <matplotlib.lines.Line2D object at 0x733d81e3a8a0>, <matplotlib.lines.Line2D object at 0x733d81e3b320>, <matplotlib.lines.Line2D object at 0x733d81e3b980>, <matplotlib.lines.Line2D object at 0x733d808fcf20>, <matplotlib.lines.Line2D object at 0x733d808fd880>, <matplotlib.lines.Line2D object at 0x733d808ff260>, <matplotlib.lines.Line2D object at 0x733d808fd3a0>, <matplotlib.lines.Line2D object at 0x733d808ffd10>, <matplotlib.lines.Line2D object at 0x733d808fe7b0>, <matplotlib.lines.Line2D object at 0x733d808fe240>, <matplotlib.lines.Line2D object at 0x733d808fc680>, <matplotlib.lines.Line2D object at 0x733d808feed0>, <matplotlib.lines.Line2D object at 0x733d808fd2b0>, <matplotlib.lines.Line2D object at 0x733d7ae89b20>, <matplotlib.lines.Line2D object at 0x733d7ae8b7a0>, <matplotlib.lines.Line2D object at 0x733d7ae8aae0>, <matplotlib.lines.Line2D object at 0x733d7ae8b740>, <matplotlib.lines.Line2D object at 0x733d7ae8ba70>, <matplotlib.lines.Line2D object at 0x733d7ae8b8c0>, <matplotlib.lines.Line2D object at 0x733d7ae89820>, <matplotlib.lines.Line2D object at 0x733d7ae89a30>, <matplotlib.lines.Line2D object at 0x733d7ae89b50>, <matplotlib.lines.Line2D object at 0x733d7ae88c50>, <matplotlib.lines.Line2D object at 0x733d7ae8af60>, <matplotlib.lines.Line2D object at 0x733d7ae8b110>, <matplotlib.lines.Line2D object at 0x733d7ae8b410>, <matplotlib.lines.Line2D object at 0x733d7ae8a0c0>, <matplotlib.lines.Line2D object at 0x733d7ae8bd70>, <matplotlib.lines.Line2D object at 0x733d7ae89e80>, <matplotlib.lines.Line2D object at 0x733d7ae88560>, <matplotlib.lines.Line2D object at 0x733d7ae8a810>, <matplotlib.lines.Line2D object at 0x733d7ae88f20>, <matplotlib.lines.Line2D object at 0x733d7ae897f0>, <matplotlib.lines.Line2D object at 0x733d7ae89e50>, <matplotlib.lines.Line2D object at 0x733d7ae8b590>, <matplotlib.lines.Line2D object at 0x733d7c443380>, <matplotlib.lines.Line2D object at 0x733d7c440980>, <matplotlib.lines.Line2D object at 0x733d7c442090>, <matplotlib.lines.Line2D object at 0x733d7c443740>, <matplotlib.lines.Line2D object at 0x733d7c440500>, <matplotlib.lines.Line2D object at 0x733d7c4434a0>, <matplotlib.lines.Line2D object at 0x733d7c4410a0>, <matplotlib.lines.Line2D object at 0x733d7c443590>, <matplotlib.lines.Line2D object at 0x733d7c4400b0>, <matplotlib.lines.Line2D object at 0x733d7c440830>, <matplotlib.lines.Line2D object at 0x733d7c4414f0>, <matplotlib.lines.Line2D object at 0x733d7c4414c0>, <matplotlib.lines.Line2D object at 0x733d7c442780>, <matplotlib.lines.Line2D object at 0x733d7c441c10>, <matplotlib.lines.Line2D object at 0x733d7c442e10>, <matplotlib.lines.Line2D object at 0x733d7c4429c0>, <matplotlib.lines.Line2D object at 0x733d7c443a10>, <matplotlib.lines.Line2D object at 0x733d7c443020>, <matplotlib.lines.Line2D object at 0x733d7c442cc0>, <matplotlib.lines.Line2D object at 0x733d7c4402c0>, <matplotlib.lines.Line2D object at 0x733d7c443320>, <matplotlib.lines.Line2D object at 0x733d7c44f380>, <matplotlib.lines.Line2D object at 0x733d7c44f1d0>, <matplotlib.lines.Line2D object at 0x733d7c44eea0>, <matplotlib.lines.Line2D object at 0x733d7c44fe30>, <matplotlib.lines.Line2D object at 0x733d7c44e060>, <matplotlib.lines.Line2D object at 0x733d7c44d550>, <matplotlib.lines.Line2D object at 0x733d7c44f050>, <matplotlib.lines.Line2D object at 0x733d7c44d340>, <matplotlib.lines.Line2D object at 0x733d7c44efc0>, <matplotlib.lines.Line2D object at 0x733d7c44f950>, <matplotlib.lines.Line2D object at 0x733d7c44f110>, <matplotlib.lines.Line2D object at 0x733d7c44d7c0>, <matplotlib.lines.Line2D object at 0x733d7c44d280>, <matplotlib.lines.Line2D object at 0x733d7c44f080>, <matplotlib.lines.Line2D object at 0x733d7c44d6d0>, <matplotlib.lines.Line2D object at 0x733d7c44d070>, <matplotlib.lines.Line2D object at 0x733d7c44d100>, <matplotlib.lines.Line2D object at 0x733d7c44c5c0>, <matplotlib.lines.Line2D object at 0x733d7c44cc20>, <matplotlib.lines.Line2D object at 0x733d7c44c110>, <matplotlib.legend.Legend object at 0x733d7b0837d0>]
Density Plot of All States
Plot a 2D density plot for all the states in the ground truths. This is a better visualisation because we can see a clear concentration of states around the origin where all the tracks start.
plotter = Plotter()
plotter.plot_density(truths, index=None)

Plot of the Last State of the Ground Truths
The function allows you to pick an index of the state sequence (ground truth in this example) to plot. In this example we’re only interested in the final state of the sequences. An index of ‘-1’ is the last state in the sequence. The resultant plot is much more spread out.
plotter = Plotter()
plotter.plot_density(truths, index=-1)

Plot each state over time
Plot the density at each time-step and see how the density plot evolves. Define an animation update function.
def update(i):
plotter.ax.clear()
plotter.plot_density(truths, index=i)
return plotter.ax
Finally, plot the densities over time.
plotter = Plotter()
animation.FuncAnimation(plotter.fig, update, frames=range(1, n_time_steps))
Total running time of the script: (0 minutes 14.349 seconds)