Repository: ManimCommunity/manim
File: manim/mobject/coordinate_systems.py (Python)

Code before:
            for x, y, z in zip(x_values, y_values, z_values)
        ]
        graph.set_points_as_corners(vertices)
        graph.z_index = -1
        line_graph["line_graph"] = graph

        if add_vertex_dots:
            vertex_dot_style = vertex_dot_style or {}
            vertex_dots = VGroup(
                *[
                    Dot(point=vertex, radius=vertex_dot_radius, **vertex_dot_style)
                    for vertex in vertices
                ]
            )
            line_graph["vertex_dots"] = vertex_dots

        return line_graph

    def origin_shift(self, axis_range):
        """Shifts graph mobjects to compensate when 0 is not on the axis.

        Parameters
        ----------
        axis_range : Union[:class:`list`, :class:`numpy.ndarray`]
            The range of the axis : `(x_min, x_max, x_step)`.
        """
        if axis_range[0] > 0:
            return axis_range[0]
        if axis_range[1] < 0:
            return axis_range[1]
        else:
            return 0


class ThreeDAxes(Axes):
    """A 3-dimensional set of axes.

    Parameters
    ----------
    x_range : Optional[Union[:class:`list`, :class:`numpy.ndarray`]]
        The :code:`[x_min, x_max, x_step]` values of the x-axis.
    y_range : Optional[Union[:class:`list`, :class:`numpy.ndarray`]]
        The :code:`[y_min, y_max, y_step]` values of the y-axis.
    z_range : Optional[Union[:class:`list`, :class:`numpy.ndarray`]]
        The :code:`[z_min, z_max, z_step]` values of the z-axis.
    x_length : Optional[:class:`float`]
        The length of the x-axis.
    y_length : Optional[:class:`float`]
        The length of the y-axis.
    z_length : Optional[:class:`float`]
        The length of the z-axis.

Review comment (suggestion):
Typing + some minor corrections. I believe `List` might have to be imported

```suggestion
    def origin_shift(self, axis_range:List[float]):
        """Shifts graph mobjects to compensate when 0 is not on the axis.

        Parameters
        ----------
        axis_range
            The range of the axis : ``(x_min, x_max, x_step)``.
        """
```

Code after:
            for x, y, z in zip(x_values, y_values, z_values)
        ]
        graph.set_points_as_corners(vertices)
        graph.z_index = -1
        line_graph["line_graph"] = graph

        if add_vertex_dots:
            vertex_dot_style = vertex_dot_style or {}
            vertex_dots = VGroup(
                *[
                    Dot(point=vertex, radius=vertex_dot_radius, **vertex_dot_style)
                    for vertex in vertices
                ]
            )
            line_graph["vertex_dots"] = vertex_dots

        return line_graph

    @staticmethod
    def origin_shift(axis_range: List[float]) -> float:
        """Determines how to shift graph mobjects to compensate when 0 is not on the axis.

        Parameters
        ----------
        axis_range
            The range of the axis : ``(x_min, x_max, x_step)``.
        """
        if axis_range[0] > 0:
            return axis_range[0]
        if axis_range[1] < 0:
            return axis_range[1]
        else:
            return 0


class ThreeDAxes(Axes):
    """A 3-dimensional set of axes.

    Parameters
    ----------
    x_range :
        The :code:`[x_min, x_max, x_step]` values of the x-axis.
    y_range :
        The :code:`[y_min, y_max, y_step]` values of the y-axis.
    z_range :
        The :code:`[z_min, z_max, z_step]` values of the z-axis.
    x_length : Optional[:class:`float`]
        The length of the x-axis.
    y_length : Optional[:class:`float`]
        The length of the y-axis.
    z_length : Optional[:class:`float`]