Had a little time to set something up. I think this illustrates what you're trying to do. Obviously, you can add text and other niceties to this.
All of this was done inside of the designer (no third party software).
The crux of it is using the animateMotion element on an SVG to move it along a path. Note that it must be an element.
Other notes that are of interest. The "Large Circles" are filled with the var(--containerRoot)
color., this makes them appear "transparent" but still hides the animated circles when the "go into" the large circles.
The curved paths were created using a Quadratic Bezier Curve, I didn't take the time to make them exactly what was shown in the example, you may have better luck with a Cubic Bezier. Either way it is important that you use the same path for drawing as you do for the animation path (other wise it will look weird (of course you don't have to also draw the path in which case it wont matter).
Finally, order in tree of elements inside of the SVG matters. Top most elements are drawn first, and as you add elements they are drawn on top of those already drawn. So if for instance you swapped the "Large Circles" with the "Animated Circles" the animated circles would not be hidden behind the large ones.
View JSON
{
"custom": {},
"params": {},
"props": {
"defaultSize": {
"height": 762,
"width": 1055
}
},
"root": {
"children": [
{
"meta": {
"name": "blank"
},
"position": {
"height": 723,
"width": 1019,
"x": 16,
"y": 15
},
"props": {
"elements": [
{
"elements": [
{
"stroke": {
"paint": "#008AB0",
"width": 0.125
},
"type": "line",
"x1": 7.125,
"x2": 42.75,
"y1": 25,
"y2": 25
},
{
"stroke": {
"paint": "#D64091",
"width": 0.125
},
"type": "line",
"x1": 25,
"x2": 25,
"y1": 15.125,
"y2": 34.875
},
{
"stroke": {
"paint": "#438E00",
"width": 0.125
},
"type": "line",
"x1": 2,
"x2": 2,
"y1": 15.125,
"y2": 19.875
},
{
"stroke": {
"paint": "#DC779C",
"width": 0.125
},
"type": "line",
"x1": 48,
"x2": 48,
"y1": 15.125,
"y2": 19.875
},
{
"stroke": {
"paint": "#4B9FC8",
"width": 0.125
},
"type": "line",
"x1": 48,
"x2": 48,
"y1": 30.2,
"y2": 34.875
},
{
"d": "M27.25,14.5 Q28,24 43,23.5",
"fill": "none",
"stroke": {
"paint": "#FF9803",
"width": 0.125
},
"type": "path"
},
{
"d": "M27.25,35.5 Q28,27 43,26.5",
"fill": "none",
"stroke": {
"paint": "#3AB1B3",
"width": 0.125
},
"type": "path"
},
{
"d": "M22.75,35.5 Q22,27 6.8,26.5",
"fill": "none",
"stroke": {
"paint": "#9A0FFF",
"width": 0.125
},
"type": "path"
},
{
"d": "M22.75,14.5 Q22,24 6.8,23.5",
"fill": "none",
"stroke": {
"paint": "#9A0FFF",
"width": 0.125
},
"type": "path"
}
],
"id": "Lines",
"type": "group"
},
{
"elements": [
{
"elements": [
{
"dur": "3s",
"path": "M2,13.125 L2,21.875",
"repeatCount": "indefinite",
"type": "animateMotion"
}
],
"fill": {
"paint": "#438E00"
},
"r": 0.625,
"type": "circle"
},
{
"elements": [
{
"dur": "2s",
"path": "M48,21.875 L48,13.125",
"repeatCount": "indefinite",
"type": "animateMotion"
}
],
"fill": {
"paint": "#DC779C"
},
"r": 0.625,
"type": "circle"
},
{
"elements": [
{
"dur": "2s",
"path": "M48,29.875 L48,39.125",
"repeatCount": "indefinite",
"type": "animateMotion"
}
],
"fill": {
"paint": "#4B9FC8"
},
"r": 0.625,
"type": "circle"
},
{
"elements": [
{
"dur": "3s",
"keyPoints": "0;0.75;1",
"keyTimes": "0;0.375;1",
"path": "M22.75,14.5 Q22,24 6.8,23.5",
"repeatCount": "indefinite",
"type": "animateMotion"
}
],
"fill": {
"paint": "#9A0FFF"
},
"r": 0.625,
"type": "circle"
},
{
"elements": [
{
"dur": "3s",
"keyPoints": "0;0.75;0.995;1",
"keyTimes": "0;0.375;0.675;1",
"path": "M27.25,14.5 Q28,24 45,23.5",
"repeatCount": "indefinite",
"type": "animateMotion"
}
],
"fill": {
"paint": "#FF9803"
},
"r": 0.625,
"type": "circle"
},
{
"elements": [
{
"dur": "5s",
"path": "M5,25 L48,25",
"repeatCount": "indefinite",
"type": "animateMotion"
}
],
"fill": {
"paint": "#008AB0"
},
"r": 0.625,
"type": "circle"
},
{
"elements": [
{
"dur": "3s",
"keyPoints": "0;0.575;1",
"keyTimes": "0;0.375;1",
"path": "M27.25,35.5 Q28,27 43,26.5",
"repeatCount": "indefinite",
"type": "animateMotion"
}
],
"fill": {
"paint": "#3AB1B3"
},
"r": 0.625,
"type": "circle"
}
],
"id": "animatedCircles",
"type": "group"
},
{
"elements": [
{
"cx": 2,
"cy": 10,
"fill": {
"paint": "var(--containerRoot)"
},
"r": 5,
"stroke": {
"paint": "#438E00",
"width": 0.25
},
"type": "circle"
},
{
"cx": 2,
"cy": 25,
"fill": {
"paint": "var(--containerRoot)"
},
"r": 5,
"stroke": {
"paint": "#008AB0",
"width": 0.25
},
"type": "circle"
},
{
"cx": 25,
"cy": 10,
"fill": {
"paint": "var(--containerRoot)"
},
"r": 5,
"stroke": {
"paint": "#FF9803",
"width": 0.25
},
"type": "circle"
},
{
"cx": 48,
"cy": 10,
"fill": {
"paint": "var(--containerRoot)"
},
"r": 5,
"stroke": {
"paint": "#DC779C",
"width": 0.25
},
"type": "circle"
},
{
"cx": 25,
"cy": 40,
"fill": {
"paint": "var(--containerRoot)"
},
"r": 5,
"stroke": {
"paint": "#D64091",
"width": 0.25
},
"type": "circle"
},
{
"cx": 48,
"cy": 40,
"fill": {
"paint": "var(--containerRoot)"
},
"r": 5,
"stroke": {
"paint": "#4B9FC8",
"width": 0.25
},
"type": "circle"
},
{
"cx": 48,
"cy": 25,
"fill": {
"paint": "var(--containerRoot)"
},
"r": 5,
"stroke": {
"paint": "#438E00",
"width": 0.5
},
"type": "circle"
}
],
"id": "LargeCircles",
"type": "group"
}
],
"viewBox": "0 0 50 50"
},
"type": "ia.shapes.svg"
}
],
"meta": {
"name": "root"
},
"type": "ia.container.coord"
}
}