import marimo as mo
Temporal Network Visualizations with Manim¶
Prerequisites¶
First, we need to set up our Python environment that has PyTorch, PyTorch Geometric and PathpyG installed. Depending on where you are executing this notebook, this might already be (partially) done. E.g. Google Colab has PyTorch installed by default so we only need to install the remaining dependencies. The DevContainer that is part of our GitHub Repository on the other hand already has all of the necessary dependencies installed.
In the following, we install the packages for usage in Google Colab using Jupyter magic commands. For other environments comment in or out the commands as necessary. For more details on how to install pathpyG especially if you want to install it with GPU-support, we refer to our documentation. Note that %%capture discards the full output of the cell to not clutter this tutorial with unnecessary installation details. If you want to print the output, you can comment %%capture out.
# %%capture
# # !pip install torch
# !pip install torch_geometric
# !pip install git+https://github.com/pathpy/pathpyG.git
Note that using the Manim-backend in PathpyG requires the installation of Manim. It will not be automatically installed with PathpyG due to its additional dependencies. We recommend using the installation instructions in the Manim documentation or our provided DevContainer.
Motivation and Learning Objectives¶
While you already learned how to visualise graphs with PathpyG in the interactive graph visualisation tutorial, those visualisations mostly considered static graphs.
In this tutorial, you will learn how to use the Manim backend in PathpyG to generate videos (.mp4) or animations (.gif) of temporal graphs.
Let's Get Started¶
We need to import PathpyG first:
import os
import tempfile
import pathpyG as pp
Next, we can create a temporal graph that we want to visualise:
t = pp.TemporalGraph.from_edge_list(
[
("a", "b", 1),
("b", "c", 5),
("c", "d", 9),
("d", "a", 9),
("a", "b", 10),
("b", "c", 10),
("a", "b", 8),
("b", "c", 13),
("c", "d", 17),
("d", "a", 19),
("a", "b", 20),
("b", "c", 18),
]
)
The plot function using Manim as backend allows to use a variety of customization options to visualize temporal graphs and outputs a video. Some examples are provided below, e.g. the node_size or the edge_size.
pp.plot(t, backend="manim", node_size=20, edge_size=10, edge_color="red", node_color="gray");
Animation 0: Create(LabeledDot), etc.: 0%| | 0/60 [00:00<?, ?it/s]
Animation 0: Create(LabeledDot), etc.: 30%|███ | 18/60 [00:00<00:00, 178.33it/s]
Animation 0: Create(LabeledDot), etc.: 60%|██████ | 36/60 [00:00<00:00, 163.29it/s]
Animation 0: Create(LabeledDot), etc.: 88%|████████▊ | 53/60 [00:00<00:00, 145.31it/s]
Animation 1: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 5: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 6: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 8: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 9: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 13: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 17: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 21: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 22: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 24: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 25: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 29: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 33: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 34: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 36: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 37: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 38: GrowArrow(Arrow), etc.: 0%| | 0/15 [00:00<?, ?it/s]
Animation 40: _MethodAnimation(Arrow), etc.: 0%| | 0/15 [00:00<?, ?it/s]
Animation 41: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 42: GrowArrow(Arrow), etc.: 0%| | 0/15 [00:00<?, ?it/s]
Animation 44: _MethodAnimation(Arrow), etc.: 0%| | 0/15 [00:00<?, ?it/s]
Animation 45: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 49: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 53: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 54: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 56: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 57: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 61: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 65: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 69: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 70: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 72: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 73: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 74: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 76: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 77: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 78: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 80: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 81: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 82: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 84: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 85: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 89: Uncreate(LabeledDot), etc.: 0%| | 0/60 [00:00<?, ?it/s]
Animation 89: Uncreate(LabeledDot), etc.: 22%|██▏ | 13/60 [00:00<00:00, 125.61it/s]
Animation 89: Uncreate(LabeledDot), etc.: 47%|████▋ | 28/60 [00:00<00:00, 136.89it/s]
Animation 89: Uncreate(LabeledDot), etc.: 75%|███████▌ | 45/60 [00:00<00:00, 151.22it/s]
The videos can be exported as .mp4 or .gif if you provide a filename to the plot function.
# Cell tags: skip-execution
with tempfile.TemporaryDirectory() as tmpdirname:
tmp_path = os.path.join(tmpdirname, "temporal_graph_manim.gif")
pp.plot(
t,
backend="manim",
node_size=20,
edge_size=4,
edge_color="red",
node_color="gray",
filename=tmp_path,
)
print(f"Animation saved to {tmp_path}")
print(f"Files in temp dir: {os.listdir(tmpdirname)}")
Animation 0: Create(LabeledDot), etc.: 0%| | 0/60 [00:00<?, ?it/s]
Animation 0: Create(LabeledDot), etc.: 43%|████▎ | 26/60 [00:00<00:00, 258.10it/s]
Animation 0: Create(LabeledDot), etc.: 87%|████████▋ | 52/60 [00:00<00:00, 247.21it/s]
Animation 1: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 5: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 6: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 8: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 9: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 13: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 17: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 21: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 22: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 24: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 25: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 29: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 33: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 34: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 36: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 37: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 38: GrowArrow(Arrow), etc.: 0%| | 0/15 [00:00<?, ?it/s]
Animation 40: _MethodAnimation(Arrow), etc.: 0%| | 0/15 [00:00<?, ?it/s]
Animation 41: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 42: GrowArrow(Arrow), etc.: 0%| | 0/15 [00:00<?, ?it/s]
Animation 44: _MethodAnimation(Arrow), etc.: 0%| | 0/15 [00:00<?, ?it/s]
Animation 45: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 49: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 53: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 54: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 56: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 57: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 61: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 65: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 69: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 70: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 72: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 73: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 74: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 76: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 77: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 78: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 80: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 81: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 82: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 84: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 85: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 89: Uncreate(LabeledDot), etc.: 0%| | 0/60 [00:00<?, ?it/s]
Animation 89: Uncreate(LabeledDot), etc.: 28%|██▊ | 17/60 [00:00<00:00, 164.66it/s]
Animation 89: Uncreate(LabeledDot), etc.: 57%|█████▋ | 34/60 [00:00<00:00, 167.10it/s]
Animation 89: Uncreate(LabeledDot), etc.: 85%|████████▌ | 51/60 [00:00<00:00, 166.36it/s]
Animation saved to /tmp/tmpfbezr8tt/temporal_graph_manim.gif Files in temp dir: ['temporal_graph_manim.gif']
Dynamic Customisations and Layout¶
Since we use manim to animate temporal networks, we can also use dynamic customisations that change over time. For example, we can change the node_size or edge_size over time.
To change those properties dynamically, we can provide a dictionary that maps node/source-target id and the time step to the desired property value.
Additionally, we can use dynamic layouts that are based on sliding windows. For example, we can use a ForceAtlas2 layout that is computed based on a sliding window of the last 3 time steps. This allows us to have a layout that changes over time but is still stable enough to be visually appealing.
The following shows an example where all of the customisations described above are used:
# Cell tags: skip-execution
pp.plot(
t,
backend="manim",
layout_window_size=[3, 1],
layout="fa2",
node_size=12,
edge_color={("b", "c", 10): "green"},
node_color={("a", 3): "yellow", ("a", 0): "green", ("b", 3): "black"},
);
Animation 0: Create(LabeledDot), etc.: 0%| | 0/60 [00:00<?, ?it/s]
Animation 0: Create(LabeledDot), etc.: 38%|███▊ | 23/60 [00:00<00:00, 224.96it/s]
Animation 0: Create(LabeledDot), etc.: 80%|████████ | 48/60 [00:00<00:00, 235.86it/s]
Animation 1: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 3: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 3: Transform(LabeledDot), etc.: 62%|██████▏ | 18/29 [00:00<00:00, 172.90it/s]
Animation 5: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 6: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 7: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 7: Transform(LabeledDot), etc.: 52%|█████▏ | 15/29 [00:00<00:00, 146.05it/s]
Animation 8: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 9: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 11: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 11: Transform(LabeledDot), etc.: 55%|█████▌ | 16/29 [00:00<00:00, 142.20it/s]
Animation 13: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 15: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 15: Transform(LabeledDot), etc.: 55%|█████▌ | 16/29 [00:00<00:00, 146.15it/s]
Animation 17: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 19: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 19: Transform(LabeledDot), etc.: 55%|█████▌ | 16/29 [00:00<00:00, 158.00it/s]
Animation 21: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 22: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 23: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 23: Transform(LabeledDot), etc.: 55%|█████▌ | 16/29 [00:00<00:00, 154.78it/s]
Animation 24: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 25: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 27: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 27: Transform(LabeledDot), etc.: 59%|█████▊ | 17/29 [00:00<00:00, 164.24it/s]
Animation 29: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 31: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 31: Transform(LabeledDot), etc.: 55%|█████▌ | 16/29 [00:00<00:00, 157.51it/s]
Animation 33: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 34: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 35: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 35: Transform(LabeledDot), etc.: 55%|█████▌ | 16/29 [00:00<00:00, 152.35it/s]
Animation 36: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 37: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 38: GrowArrow(Arrow), etc.: 0%| | 0/15 [00:00<?, ?it/s]
Animation 39: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 39: Transform(LabeledDot), etc.: 55%|█████▌ | 16/29 [00:00<00:00, 159.95it/s]
Animation 40: _MethodAnimation(Arrow), etc.: 0%| | 0/15 [00:00<?, ?it/s]
Animation 41: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 42: GrowArrow(Arrow), etc.: 0%| | 0/15 [00:00<?, ?it/s]
Animation 43: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 43: Transform(LabeledDot), etc.: 55%|█████▌ | 16/29 [00:00<00:00, 153.94it/s]
Animation 44: _MethodAnimation(Arrow), etc.: 0%| | 0/15 [00:00<?, ?it/s]
Animation 45: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 47: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 47: Transform(LabeledDot), etc.: 59%|█████▊ | 17/29 [00:00<00:00, 161.93it/s]
Animation 49: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 51: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 51: Transform(LabeledDot), etc.: 48%|████▊ | 14/29 [00:00<00:00, 131.69it/s]
Animation 53: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 54: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 55: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 55: Transform(LabeledDot), etc.: 55%|█████▌ | 16/29 [00:00<00:00, 158.41it/s]
Animation 56: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 57: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 59: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 59: Transform(LabeledDot), etc.: 59%|█████▊ | 17/29 [00:00<00:00, 163.55it/s]
Animation 61: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 63: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 63: Transform(LabeledDot), etc.: 62%|██████▏ | 18/29 [00:00<00:00, 170.23it/s]
Animation 65: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 67: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 67: Transform(LabeledDot), etc.: 55%|█████▌ | 16/29 [00:00<00:00, 158.95it/s]
Animation 69: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 70: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 71: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 71: Transform(LabeledDot), etc.: 55%|█████▌ | 16/29 [00:00<00:00, 155.48it/s]
Animation 72: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 73: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 74: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 75: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 75: Transform(LabeledDot), etc.: 55%|█████▌ | 16/29 [00:00<00:00, 157.07it/s]
Animation 76: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 77: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 78: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 79: Transform(LabeledDot), etc.: 0%| | 0/29 [00:00<?, ?it/s]
Animation 79: Transform(LabeledDot), etc.: 55%|█████▌ | 16/29 [00:00<00:00, 154.11it/s]
Animation 80: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 81: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 82: GrowArrow(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 84: _MethodAnimation(Arrow): 0%| | 0/15 [00:00<?, ?it/s]
Animation 85: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 89: Uncreate(LabeledDot), etc.: 0%| | 0/60 [00:00<?, ?it/s]
Animation 89: Uncreate(LabeledDot), etc.: 27%|██▋ | 16/60 [00:00<00:00, 150.10it/s]
Animation 89: Uncreate(LabeledDot), etc.: 53%|█████▎ | 32/60 [00:00<00:00, 155.33it/s]
Animation 89: Uncreate(LabeledDot), etc.: 82%|████████▏ | 49/60 [00:00<00:00, 160.60it/s]
Real-World Example¶
As a final example, we show how to visualise a real-world temporal graph with Manim. We use Netschleuder Online Repository (see our tutorial Graph Learning in Netzschleuder Data for more information) to obtain a temporal interaction graph between baboons and color the types of interactions in different colors.
g = pp.io.read_netzschleuder_graph('sp_baboons', 'observational', time_attr='time')
The timestamps are provided in seconds since epoch (converted from unix time). We first convert them to a more human-readable format (12-hour intervals since the first interaction):
g.data.time -= g.data.time.min()
g.data.time = g.data.time // (60 * 60 * 12) # convert to 12 hours intervals
The dataset contains different types of interactions between the baboons. We can use this information to color the edges based on the interaction type:
colors = []
for category in g.data["edge_category"]:
match category:
case "Affiliative":
colors.append("red")
case "Agonistic":
colors.append("green")
case "Other":
colors.append("grey")
# Cell tags: skip-execution
pp.plot(
g,
backend="manim",
layout_window_size=12, # six days
layout="kk",
edge_color=colors,
edge_size=2.5,
delta=500, # Each time step is 500 ms
);
Animation 0: Create(LabeledDot), etc.: 0%| | 0/60 [00:00<?, ?it/s]
Animation 0: Create(LabeledDot), etc.: 23%|██▎ | 14/60 [00:00<00:00, 136.97it/s]
Animation 0: Create(LabeledDot), etc.: 47%|████▋ | 28/60 [00:00<00:00, 125.80it/s]
Animation 0: Create(LabeledDot), etc.: 68%|██████▊ | 41/60 [00:00<00:00, 114.15it/s]
Animation 0: Create(LabeledDot), etc.: 88%|████████▊ | 53/60 [00:00<00:00, 103.02it/s]
Animation 1: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 2: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 3: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 3: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 56.54it/s]
Animation 3: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 54.32it/s]
Animation 4: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 5: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 6: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 7: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 7: Transform(LabeledDot), etc.: 50%|█████ | 7/14 [00:00<00:00, 66.73it/s]
Animation 7: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 65.42it/s]
Animation 8: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 9: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 10: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 11: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 11: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 50.49it/s]
Animation 11: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 48.45it/s]
Animation 12: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 13: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 15: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 15: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 51.05it/s]
Animation 15: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 55.62it/s]
Animation 17: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 19: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 19: Transform(LabeledDot), etc.: 36%|███▌ | 5/14 [00:00<00:00, 48.73it/s]
Animation 19: Transform(LabeledDot), etc.: 79%|███████▊ | 11/14 [00:00<00:00, 49.44it/s]
Animation 21: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 23: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 23: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 52.79it/s]
Animation 23: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 54.95it/s]
Animation 25: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 27: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 27: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 54.83it/s]
Animation 27: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 55.51it/s]
Animation 29: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 30: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 31: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 31: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 51.33it/s]
Animation 31: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 53.15it/s]
Animation 32: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 33: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 34: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 35: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 35: Transform(LabeledDot), etc.: 36%|███▌ | 5/14 [00:00<00:00, 40.92it/s]
Animation 35: Transform(LabeledDot), etc.: 71%|███████▏ | 10/14 [00:00<00:00, 40.07it/s]
Animation 36: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 37: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 38: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 39: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 39: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 37.82it/s]
Animation 39: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 40.90it/s]
Animation 39: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 41.24it/s]
Animation 40: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 41: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 42: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 43: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 43: Transform(LabeledDot), etc.: 36%|███▌ | 5/14 [00:00<00:00, 40.86it/s]
Animation 43: Transform(LabeledDot), etc.: 71%|███████▏ | 10/14 [00:00<00:00, 38.54it/s]
Animation 43: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 36.96it/s]
Animation 44: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 45: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 46: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 47: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 47: Transform(LabeledDot), etc.: 36%|███▌ | 5/14 [00:00<00:00, 39.94it/s]
Animation 47: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 39.35it/s]
Animation 47: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 41.37it/s]
Animation 48: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 49: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 50: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 51: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 51: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 39.10it/s]
Animation 51: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 39.31it/s]
Animation 51: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 39.20it/s]
Animation 52: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 53: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 55: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 55: Transform(LabeledDot), etc.: 36%|███▌ | 5/14 [00:00<00:00, 42.63it/s]
Animation 55: Transform(LabeledDot), etc.: 71%|███████▏ | 10/14 [00:00<00:00, 42.17it/s]
Animation 57: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 58: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 59: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 59: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 36.04it/s]
Animation 59: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 35.64it/s]
Animation 59: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 35.70it/s]
Animation 60: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 61: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 62: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 63: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 63: Transform(LabeledDot), etc.: 36%|███▌ | 5/14 [00:00<00:00, 40.05it/s]
Animation 63: Transform(LabeledDot), etc.: 71%|███████▏ | 10/14 [00:00<00:00, 39.85it/s]
Animation 63: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 39.50it/s]
Animation 64: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 65: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 66: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 67: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 67: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 31.93it/s]
Animation 67: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 31.79it/s]
Animation 67: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 31.76it/s]
Animation 68: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 69: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 71: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 71: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 36.42it/s]
Animation 71: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 36.26it/s]
Animation 71: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 36.30it/s]
Animation 73: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 75: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 75: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 26.80it/s]
Animation 75: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 27.06it/s]
Animation 75: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 27.23it/s]
Animation 75: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 27.55it/s]
Animation 77: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 79: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 79: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 33.09it/s]
Animation 79: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 32.43it/s]
Animation 79: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 32.21it/s]
Animation 81: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 83: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 83: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 31.14it/s]
Animation 83: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 31.39it/s]
Animation 83: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 31.58it/s]
Animation 85: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 86: GrowArrow(Arrow): 0%| | 0/8 [00:00<?, ?it/s]
Animation 87: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 87: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 34.06it/s]
Animation 87: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 33.74it/s]
Animation 87: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 33.46it/s]
Animation 88: _MethodAnimation(Arrow): 0%| | 0/8 [00:00<?, ?it/s]
Animation 89: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 90: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 91: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 91: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 28.72it/s]
Animation 91: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 28.64it/s]
Animation 91: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 28.54it/s]
Animation 91: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 28.26it/s]
Animation 92: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 93: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 95: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 95: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 31.84it/s]
Animation 95: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 31.59it/s]
Animation 95: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 31.50it/s]
Animation 97: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 98: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 99: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 99: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 20.49it/s]
Animation 99: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 20.41it/s]
Animation 99: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 20.46it/s]
Animation 99: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 20.21it/s]
Animation 100: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 101: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 102: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 103: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 103: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 26.64it/s]
Animation 103: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 26.26it/s]
Animation 103: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 26.27it/s]
Animation 103: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 26.20it/s]
Animation 104: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 105: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 106: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 107: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 107: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 24.80it/s]
Animation 107: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 24.60it/s]
Animation 107: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 24.51it/s]
Animation 107: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 24.26it/s]
Animation 108: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 109: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 110: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 111: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 111: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 25.32it/s]
Animation 111: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 25.07it/s]
Animation 111: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 24.86it/s]
Animation 111: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 24.77it/s]
Animation 112: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 113: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 114: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 115: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 115: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 24.97it/s]
Animation 115: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 24.86it/s]
Animation 115: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 24.59it/s]
Animation 115: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 24.47it/s]
Animation 116: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 117: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 119: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 119: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 24.33it/s]
Animation 119: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 24.01it/s]
Animation 119: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 23.98it/s]
Animation 119: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 23.93it/s]
Animation 121: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 122: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 123: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 123: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 21.73it/s]
Animation 123: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 22.21it/s]
Animation 123: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 22.33it/s]
Animation 123: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 22.16it/s]
Animation 124: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 125: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 127: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 127: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 24.65it/s]
Animation 127: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 24.44it/s]
Animation 127: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 24.39it/s]
Animation 127: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 24.36it/s]
Animation 129: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 131: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 131: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 24.32it/s]
Animation 131: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 24.19it/s]
Animation 131: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 24.04it/s]
Animation 131: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 23.90it/s]
Animation 133: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 135: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 135: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 24.74it/s]
Animation 135: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 24.37it/s]
Animation 135: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 24.01it/s]
Animation 135: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 23.74it/s]
Animation 137: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 139: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 139: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 23.37it/s]
Animation 139: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 23.27it/s]
Animation 139: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 23.01it/s]
Animation 139: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 22.98it/s]
Animation 141: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 142: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 143: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 143: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 22.89it/s]
Animation 143: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 22.32it/s]
Animation 143: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 22.11it/s]
Animation 143: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 21.75it/s]
Animation 144: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 145: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 146: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 147: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 147: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 22.54it/s]
Animation 147: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 22.13it/s]
Animation 147: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 22.01it/s]
Animation 147: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 21.86it/s]
Animation 148: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 149: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 150: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 151: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 151: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 22.04it/s]
Animation 151: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 21.91it/s]
Animation 151: Transform(LabeledDot), etc.: 64%|██████▍ | 9/14 [00:00<00:00, 21.70it/s]
Animation 151: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 21.56it/s]
Animation 152: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 153: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 154: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 155: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 155: Transform(LabeledDot), etc.: 14%|█▍ | 2/14 [00:00<00:00, 19.48it/s]
Animation 155: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 19.05it/s]
Animation 155: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 19.38it/s]
Animation 155: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 19.55it/s]
Animation 155: Transform(LabeledDot), etc.: 71%|███████▏ | 10/14 [00:00<00:00, 19.43it/s]
Animation 155: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 19.31it/s]
Animation 155: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 19.28it/s]
Animation 156: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 157: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 158: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 159: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 159: Transform(LabeledDot), etc.: 14%|█▍ | 2/14 [00:00<00:00, 19.24it/s]
Animation 159: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 19.05it/s]
Animation 159: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 19.09it/s]
Animation 159: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 19.10it/s]
Animation 159: Transform(LabeledDot), etc.: 71%|███████▏ | 10/14 [00:00<00:00, 18.97it/s]
Animation 159: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 18.92it/s]
Animation 159: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 18.94it/s]
Animation 160: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 161: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 161: Transform(Text('Time: 0')): 100%|██████████| 2/2 [00:00<00:00, 19.21it/s]
Animation 162: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 163: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 163: Transform(LabeledDot), etc.: 14%|█▍ | 2/14 [00:00<00:00, 18.79it/s]
Animation 163: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 18.51it/s]
Animation 163: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 18.51it/s]
Animation 163: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 18.05it/s]
Animation 163: Transform(LabeledDot), etc.: 71%|███████▏ | 10/14 [00:00<00:00, 18.04it/s]
Animation 163: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 17.96it/s]
Animation 163: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 18.06it/s]
Animation 164: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 165: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 166: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 167: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 167: Transform(LabeledDot), etc.: 14%|█▍ | 2/14 [00:00<00:00, 19.96it/s]
Animation 167: Transform(LabeledDot), etc.: 36%|███▌ | 5/14 [00:00<00:00, 20.08it/s]
Animation 167: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 20.06it/s]
Animation 167: Transform(LabeledDot), etc.: 79%|███████▊ | 11/14 [00:00<00:00, 19.81it/s]
Animation 167: Transform(LabeledDot), etc.: 93%|█████████▎| 13/14 [00:00<00:00, 19.82it/s]
Animation 168: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 169: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 170: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 171: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 171: Transform(LabeledDot), etc.: 14%|█▍ | 2/14 [00:00<00:00, 14.97it/s]
Animation 171: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 15.23it/s]
Animation 171: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 15.51it/s]
Animation 171: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 15.71it/s]
Animation 171: Transform(LabeledDot), etc.: 71%|███████▏ | 10/14 [00:00<00:00, 15.81it/s]
Animation 171: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 15.91it/s]
Animation 171: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 16.02it/s]
Animation 172: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 173: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 175: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 175: Transform(LabeledDot), etc.: 21%|██▏ | 3/14 [00:00<00:00, 20.03it/s]
Animation 175: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 19.86it/s]
Animation 175: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 19.70it/s]
Animation 175: Transform(LabeledDot), etc.: 71%|███████▏ | 10/14 [00:00<00:00, 19.59it/s]
Animation 175: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 19.51it/s]
Animation 175: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 19.34it/s]
Animation 177: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 178: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 179: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 179: Transform(LabeledDot), etc.: 14%|█▍ | 2/14 [00:00<00:00, 18.07it/s]
Animation 179: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 17.89it/s]
Animation 179: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 17.71it/s]
Animation 179: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 17.30it/s]
Animation 179: Transform(LabeledDot), etc.: 71%|███████▏ | 10/14 [00:00<00:00, 16.80it/s]
Animation 179: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 16.64it/s]
Animation 179: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 16.64it/s]
Animation 180: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 181: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 183: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 183: Transform(LabeledDot), etc.: 14%|█▍ | 2/14 [00:00<00:00, 19.00it/s]
Animation 183: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 18.60it/s]
Animation 183: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 18.64it/s]
Animation 183: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 18.50it/s]
Animation 183: Transform(LabeledDot), etc.: 71%|███████▏ | 10/14 [00:00<00:00, 18.37it/s]
Animation 183: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 18.20it/s]
Animation 183: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 17.63it/s]
Animation 185: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 187: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 187: Transform(LabeledDot), etc.: 14%|█▍ | 2/14 [00:00<00:00, 17.76it/s]
Animation 187: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 17.55it/s]
Animation 187: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 17.47it/s]
Animation 187: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 17.32it/s]
Animation 187: Transform(LabeledDot), etc.: 71%|███████▏ | 10/14 [00:00<00:00, 12.02it/s]
Animation 187: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 13.49it/s]
Animation 187: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 14.60it/s]
Animation 189: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 189: Transform(Text('Time: 0')): 100%|██████████| 2/2 [00:00<00:00, 19.38it/s]
Animation 191: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 191: Transform(LabeledDot), etc.: 14%|█▍ | 2/14 [00:00<00:00, 19.31it/s]
Animation 191: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 18.70it/s]
Animation 191: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 18.58it/s]
Animation 191: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 18.57it/s]
Animation 191: Transform(LabeledDot), etc.: 71%|███████▏ | 10/14 [00:00<00:00, 18.62it/s]
Animation 191: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 18.47it/s]
Animation 191: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 18.38it/s]
Animation 193: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 195: Transform(LabeledDot), etc.: 0%| | 0/14 [00:00<?, ?it/s]
Animation 195: Transform(LabeledDot), etc.: 14%|█▍ | 2/14 [00:00<00:00, 14.34it/s]
Animation 195: Transform(LabeledDot), etc.: 29%|██▊ | 4/14 [00:00<00:00, 14.35it/s]
Animation 195: Transform(LabeledDot), etc.: 43%|████▎ | 6/14 [00:00<00:00, 14.33it/s]
Animation 195: Transform(LabeledDot), etc.: 57%|█████▋ | 8/14 [00:00<00:00, 14.57it/s]
Animation 195: Transform(LabeledDot), etc.: 71%|███████▏ | 10/14 [00:00<00:00, 14.93it/s]
Animation 195: Transform(LabeledDot), etc.: 86%|████████▌ | 12/14 [00:00<00:00, 14.97it/s]
Animation 195: Transform(LabeledDot), etc.: 100%|██████████| 14/14 [00:00<00:00, 15.36it/s]
Animation 197: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 197: Transform(Text('Time: 0')): 100%|██████████| 2/2 [00:00<00:00, 18.21it/s]
Animation 201: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 202: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 204: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 205: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 205: Transform(Text('Time: 0')): 100%|██████████| 2/2 [00:00<00:00, 19.49it/s]
Animation 209: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 209: Transform(Text('Time: 0')): 100%|██████████| 2/2 [00:00<00:00, 19.48it/s]
Animation 210: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 212: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 213: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 213: Transform(Text('Time: 0')): 100%|██████████| 2/2 [00:00<00:00, 17.65it/s]
Animation 214: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 216: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 217: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 217: Transform(Text('Time: 0')): 100%|██████████| 2/2 [00:00<00:00, 15.68it/s]
Animation 218: GrowArrow(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 218: GrowArrow(Arrow), etc.: 100%|██████████| 8/8 [00:00<00:00, 66.73it/s]
Animation 220: _MethodAnimation(Arrow), etc.: 0%| | 0/8 [00:00<?, ?it/s]
Animation 221: Transform(Text('Time: 0')): 0%| | 0/2 [00:00<?, ?it/s]
Animation 221: Transform(Text('Time: 0')): 100%|██████████| 2/2 [00:00<00:00, 18.52it/s]
Animation 225: Uncreate(LabeledDot), etc.: 0%| | 0/60 [00:00<?, ?it/s]
Animation 225: Uncreate(LabeledDot), etc.: 3%|▎ | 2/60 [00:00<00:03, 16.87it/s]
Animation 225: Uncreate(LabeledDot), etc.: 7%|▋ | 4/60 [00:00<00:03, 16.63it/s]
Animation 225: Uncreate(LabeledDot), etc.: 10%|█ | 6/60 [00:00<00:03, 16.42it/s]
Animation 225: Uncreate(LabeledDot), etc.: 13%|█▎ | 8/60 [00:00<00:03, 15.87it/s]
Animation 225: Uncreate(LabeledDot), etc.: 17%|█▋ | 10/60 [00:00<00:03, 15.36it/s]
Animation 225: Uncreate(LabeledDot), etc.: 20%|██ | 12/60 [00:00<00:03, 15.01it/s]
Animation 225: Uncreate(LabeledDot), etc.: 23%|██▎ | 14/60 [00:00<00:03, 14.75it/s]
Animation 225: Uncreate(LabeledDot), etc.: 27%|██▋ | 16/60 [00:01<00:02, 14.71it/s]
Animation 225: Uncreate(LabeledDot), etc.: 30%|███ | 18/60 [00:01<00:02, 14.74it/s]
Animation 225: Uncreate(LabeledDot), etc.: 33%|███▎ | 20/60 [00:01<00:02, 14.83it/s]
Animation 225: Uncreate(LabeledDot), etc.: 37%|███▋ | 22/60 [00:01<00:02, 14.93it/s]
Animation 225: Uncreate(LabeledDot), etc.: 40%|████ | 24/60 [00:01<00:02, 15.12it/s]
Animation 225: Uncreate(LabeledDot), etc.: 43%|████▎ | 26/60 [00:01<00:02, 15.28it/s]
Animation 225: Uncreate(LabeledDot), etc.: 47%|████▋ | 28/60 [00:01<00:02, 15.41it/s]
Animation 225: Uncreate(LabeledDot), etc.: 50%|█████ | 30/60 [00:01<00:01, 15.44it/s]
Animation 225: Uncreate(LabeledDot), etc.: 53%|█████▎ | 32/60 [00:02<00:01, 15.50it/s]
Animation 225: Uncreate(LabeledDot), etc.: 57%|█████▋ | 34/60 [00:02<00:01, 15.56it/s]
Animation 225: Uncreate(LabeledDot), etc.: 60%|██████ | 36/60 [00:02<00:01, 15.58it/s]
Animation 225: Uncreate(LabeledDot), etc.: 63%|██████▎ | 38/60 [00:02<00:01, 15.56it/s]
Animation 225: Uncreate(LabeledDot), etc.: 67%|██████▋ | 40/60 [00:02<00:01, 15.29it/s]
Animation 225: Uncreate(LabeledDot), etc.: 70%|███████ | 42/60 [00:02<00:01, 14.80it/s]
Animation 225: Uncreate(LabeledDot), etc.: 73%|███████▎ | 44/60 [00:02<00:01, 13.50it/s]
Animation 225: Uncreate(LabeledDot), etc.: 77%|███████▋ | 46/60 [00:03<00:01, 12.70it/s]
Animation 225: Uncreate(LabeledDot), etc.: 80%|████████ | 48/60 [00:03<00:00, 12.28it/s]
Animation 225: Uncreate(LabeledDot), etc.: 83%|████████▎ | 50/60 [00:03<00:00, 12.21it/s]
Animation 225: Uncreate(LabeledDot), etc.: 87%|████████▋ | 52/60 [00:03<00:00, 12.31it/s]
Animation 225: Uncreate(LabeledDot), etc.: 90%|█████████ | 54/60 [00:03<00:00, 12.49it/s]
Animation 225: Uncreate(LabeledDot), etc.: 93%|█████████▎| 56/60 [00:03<00:00, 12.58it/s]
Animation 225: Uncreate(LabeledDot), etc.: 97%|█████████▋| 58/60 [00:04<00:00, 12.79it/s]
Animation 225: Uncreate(LabeledDot), etc.: 100%|██████████| 60/60 [00:04<00:00, 12.91it/s]