docs: def plot(q: np.ndarray, bodies: List[str], plot_colors: Dict[str, str],
           sim_name: str, fname: Optional[str] = None):
      """
      Plot the planetary orbits.  Plot size limited to box of 10 AU around the sun.
      q is a Nx3B array.  t indexes time points.  3B columns are (x, y, z) for the bodies in order.
      """
      # Get N and number of dims
      N, dims = q.shape
  
      # Slices for 
      x_slice = slice(0, dims, 3)
      y_slice = slice(1, dims, 3)
      # Convert all distances from meters to astronomical units (AU)
      plot_x = q[:, x_slice] / au2m
      plot_y = q[:, y_slice] / au2m
      
      # Set up chart title and scale
      fig, ax = plt.subplots(figsize=[12,12])
      ax.set_title(f'Inner Planetary Orbits in 2018; Weekly from {sim_name}')
      ax.set_xlabel('x in J2000.0 Frame; Astronomical Units (au)')
      ax.set_ylabel('y in J2000.0 Frame; Astronomical Units (au)')
      # Scale and tick size
      a = 5.0
      da = 1.0
      ticks = np.arange(-a, a+da, da)
      # Set limits and ticks
      ax.set_xlim(-a, a)
      ax.set_ylim(-a, a)
      ax.set_xticks(ticks)
      ax.set_yticks(ticks)
  
      # Set marker sizes proportional to size of bodies
      radius_earth = radius_tbl['earth']
      markersize_earth = 4.0
      markersize_tbl = {body : cbrt(radius_tbl[body] / radius_earth) * markersize_earth for body in bodies}
      
      # Plot the orbit of each body
      for k, body in enumerate(bodies):
          ax.plot(plot_x[:, k], plot_y[:, k], label=body, color=plot_colors[body], 
                  linewidth=0, markersize = markersize_tbl[body], marker='o')
      
      # Legend and grid
      fig.legend(loc=7, bbox_to_anchor=(0.85, 0.5))
      # ax.legend()
      ax.grid()
  
      # Save plot if a filename was provided
      if fname is not None:
          fig.savefig(fname, bbox_inches='tight')
  
      # Display plot
      plt.show()