Return N-dimensional square's limits

    ## Arguments
    # 'coords': list of coordinates of poins to be plotted
    # 'margin': margin to be added from boundaries of the square.
    - 'margin' can be negative if one wants to reduce the square size.

    ## Example
    if 'coords' was given as [x,y,z],

    then the resulting square's limits are given by:

    (xlim, ylim, zlim)

    where,

    xlim == (x_mid - max_width, x_mid + max_width)
    ylim == (y_mid - max_width, y_mid + max_width)
    zlim == (z_mid - max_width, z_mid + max_width)

    x_mid = 0.5 * (min(x) + max(x)) (and so on)

    max_width = max([x_width, y_width, z_width])

    where x_width = 0.5 * (max(x) - min(x)) (and so on)

def get_square_axes_limits(coords, margin=0.05):
    """Return N-dimensional square's limits

    ## Arguments
    # 'coords': list of coordinates of poins to be plotted
    # 'margin': margin to be added from boundaries of the square.
    - 'margin' can be negative if one wants to reduce the square size.

    ## Example
    if 'coords' was given as [x,y,z],

    then the resulting square's limits are given by:

    (xlim, ylim, zlim)

    where,

    xlim == (x_mid - max_width, x_mid + max_width)
    ylim == (y_mid - max_width, y_mid + max_width)
    zlim == (z_mid - max_width, z_mid + max_width)

    x_mid = 0.5 * (min(x) + max(x)) (and so on)

    max_width = max([x_width, y_width, z_width])

    where x_width = 0.5 * (max(x) - min(x)) (and so on)
    """
    #coords = [x,y,z]
    try: coords = [np.array(coord) for coord in coords]
    except: raise Exception("Failed to convert elements of 'coords' into numpy.array")
    lims = [(coord.min(), coord.max()) for coord in coords]
    mids = [0.5 * (lim[0] + lim[1]) for lim in lims]
    widths = [0.5 * (lim[1] - lim[0]) for lim in lims]
    max_width = max(widths)
    max_width += max_width * margin
    ax_lims = tuple((mid - max_width, mid + max_width) for mid in mids)
    #xlim, ylim, zlim = ax_lims
    return ax_lims