Skip to content

plotting

cosmica.dynamics.plotting

__all__ module-attribute

__all__ = ['visualize_multi_orbital_plane_constellation']

visualize_multi_orbital_plane_constellation

visualize_multi_orbital_plane_constellation(
    constellation: MultiOrbitalPlaneConstellation[
        CircularSatelliteOrbit
    ],
    propagation_result: Mapping[
        ConstellationSatellite, SatelliteOrbitState
    ],
    time_index: int = 0,
) -> None
Source code in src/cosmica/dynamics/plotting.py
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
def visualize_multi_orbital_plane_constellation(
    constellation: MultiOrbitalPlaneConstellation[CircularSatelliteOrbit],
    propagation_result: Mapping[ConstellationSatellite, SatelliteOrbitState],
    time_index: int = 0,
) -> None:
    fig = plt.figure()
    ax: Axes3D = fig.add_subplot(111, projection="3d")

    cmap = mpl.colormaps["tab20"]

    # Plot the Earth
    ax.plot_surface(*_ms(0, 0, 0, EARTH_RADIUS), color="blue", alpha=0.2)

    # Plot the orbit trajectory of the first satellite in each orbital plane
    for i, plane_id in enumerate(constellation.plane_ids):
        satellite = constellation.plane_id_to_satellites[plane_id][0]
        ax.plot(
            propagation_result[satellite].position_eci[:, 0],
            propagation_result[satellite].position_eci[:, 1],
            propagation_result[satellite].position_eci[:, 2],
            color=cmap(i),
            linewidth=0.5,
            label=f"Plane {plane_id}",
        )
        for satellite in constellation.satellites:
            # Plot the position of each satellite at the `time_index`
            ax.plot(
                propagation_result[satellite].position_eci[time_index, 0],
                propagation_result[satellite].position_eci[time_index, 1],
                propagation_result[satellite].position_eci[time_index, 2],
                "ro",
                markersize=2,
            )

    # Set plot labels and aspect ratio
    ax.set_xlabel("X (km)")
    ax.set_ylabel("Y (km)")
    ax.set_zlabel("Z (km)")
    ax.set_box_aspect([1, 1, 1])

    ax.legend()

    plt.show()