Repository: einsteinpy/einsteinpy

Issue:
Add geodesics module for better integration with plotting
🐞 **Problem**

The plotting works on passing individual r, v vectors for plots and is geometry dependent. While it should not be.
🎯 **Goal**

<!--- Why is this change important to you? How would you use it? -->
<!--- How can it benefit other users? -->

💡 **Possible solutions**

<!--- Not obligatory, but suggest an idea for implementing addition or change -->

📋  **Steps to solve the problem**

 * Comment below about what you've started working on.
 * Add, commit, push your changes
 * Submit a pull request and add this in comments - `Addresses #<put issue number here>`
 * Ask for a review in comments section of pull request
 * Celebrate your contribution to this project 🎉


Discussion:
pep8speaks: Hello @shreyasbapat! Thanks for opening this PR. We checked the lines you've touched for [PEP 8](https://www.python.org/dev/peps/pep-0008) issues, and found:



* In the file [`src/einsteinpy/geodesic.py`](https://github.com/einsteinpy/einsteinpy/blob/e144d87779d2aa67352ac081a72acdfddeb37ece/src/einsteinpy/geodesic.py):

> [Line 3:1](https://github.com/einsteinpy/einsteinpy/blob/e144d87779d2aa67352ac081a72acdfddeb37ece/src/einsteinpy/geodesic.py#L3): [E302](https://duckduckgo.com/?q=pep8%20E302) expected 2 blank lines, found 1
> [Line 7:81](https://github.com/einsteinpy/einsteinpy/blob/e144d87779d2aa67352ac081a72acdfddeb37ece/src/einsteinpy/geodesic.py#L7): [E501](https://duckduckgo.com/?q=pep8%20E501) line too long (96 > 80 characters)
> [Line 15:81](https://github.com/einsteinpy/einsteinpy/blob/e144d87779d2aa67352ac081a72acdfddeb37ece/src/einsteinpy/geodesic.py#L15): [E501](https://duckduckgo.com/?q=pep8%20E501) line too long (159 > 80 characters)
> [Line 22:32](https://github.com/einsteinpy/einsteinpy/blob/e144d87779d2aa67352ac081a72acdfddeb37ece/src/einsteinpy/geodesic.py#L22): [W292](https://duckduckgo.com/?q=pep8%20W292) no newline at end of file










shreyasbapat: cc @Varunvaruns9 

Patch:
diff --git a/.gitignore b/.gitignore
index 306c866..a9f548a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -68,3 +68,7 @@ pip-wheel-metadata
 
 # default pytest cache directory
 */.pytest_cache
+.pytest_cache/
+
+#Tox
+.tox
diff --git a/docs/source/api/bodies.rst b/docs/source/api/bodies.rst
new file mode 100644
index 0000000..5655ebe
--- /dev/null
+++ b/docs/source/api/bodies.rst
@@ -0,0 +1,5 @@
+Bodies module
+=============
+
+.. automodule:: einsteinpy.bodies
+    :members:
diff --git a/docs/source/api/geodesic.rst b/docs/source/api/geodesic.rst
new file mode 100644
index 0000000..7f17cc9
--- /dev/null
+++ b/docs/source/api/geodesic.rst
@@ -0,0 +1,5 @@
+Geodesic module
+===============
+
+.. automodule:: einsteinpy.geodesic
+    :members:
diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst
index 6e6986e..21c20cf 100644
--- a/docs/source/api/index.rst
+++ b/docs/source/api/index.rst
@@ -26,3 +26,5 @@ know the API of the classes and methods. If you find anything missing, please op
     coordinates/coordinates_index
     constant
     units
+    bodies
+    geodesic
diff --git a/docs/source/api/plotting/geodesics_scatter.rst b/docs/source/api/plotting/geodesics/geodesics_scatter.rst
similarity index 93%
rename from docs/source/api/plotting/geodesics_scatter.rst
rename to docs/source/api/plotting/geodesics/geodesics_scatter.rst
index f18bdcd..41aec18 100644
--- a/docs/source/api/plotting/geodesics_scatter.rst
+++ b/docs/source/api/plotting/geodesics/geodesics_scatter.rst
@@ -28,5 +28,5 @@ Color
 
 This module contains the methods for static geodesic plotting using scatter plots.
 
-.. automodule:: einsteinpy.plotting.geodesics_scatter
+.. automodule:: einsteinpy.plotting.geodesics.geodesics_scatter
     :members:
diff --git a/docs/source/api/plotting/geodesics_static.rst b/docs/source/api/plotting/geodesics/geodesics_static.rst
similarity index 97%
rename from docs/source/api/plotting/geodesics_static.rst
rename to docs/source/api/plotting/geodesics/geodesics_static.rst
index a8418b7..2aa92d1 100644
--- a/docs/source/api/plotting/geodesics_static.rst
+++ b/docs/source/api/plotting/geodesics/geodesics_static.rst
@@ -3,7 +3,7 @@ Static Geodesic Plotting
 
 This module contains the methods for static geodesic plotting.
 
-.. automodule:: einsteinpy.plotting.geodesics_static
+.. automodule:: einsteinpy.plotting.geodesics.geodesics_static
     :members:
 
 Auto and Manual scaling
diff --git a/docs/source/api/plotting/plotting_index.rst b/docs/source/api/plotting/plotting_index.rst
index c327644..ba4686e 100644
--- a/docs/source/api/plotting/plotting_index.rst
+++ b/docs/source/api/plotting/plotting_index.rst
@@ -7,5 +7,5 @@ This module contains the basic classes for static and interactive
 .. toctree::
     :maxdepth: 2
 
-    geodesics_static
-    geodesics_scatter
+    geodesics/geodesics_static
+    geodesics/geodesics_scatter
diff --git a/docs/source/examples/Auto_and_Manual_scaling_of_attractor_radius_with_Color.ipynb b/docs/source/examples/Auto_and_Manual_scaling_of_attractor_radius_with_Color.ipynb
index cca0471..e662f7d 100644
--- a/docs/source/examples/Auto_and_Manual_scaling_of_attractor_radius_with_Color.ipynb
+++ b/docs/source/examples/Auto_and_Manual_scaling_of_attractor_radius_with_Color.ipynb
@@ -4,7 +4,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "# _Static Geodesic Plotter class_\n",
+    "## _Static Geodesic Plotter class_\n",
     "\n",
     "### Importing the required modules"
    ]
@@ -218,7 +218,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "# _Scatter Geodesic Plotter class_"
+    "## _Scatter Geodesic Plotter class_"
    ]
   },
   {
diff --git a/src/einsteinpy/bodies.py b/src/einsteinpy/bodies.py
index 35bd721..d2bb5b8 100644
--- a/src/einsteinpy/bodies.py
+++ b/src/einsteinpy/bodies.py
@@ -29,18 +29,18 @@ class Body:
     @u.quantity_input(mass=u.kg, R=u.km)
     def __init__(
         self,
-        identifier,
+        name="Generic Body",
         mass=0 * u.kg,
         R=0 * u.km,
         differential=None,
-        a=0,
+        a=0 * u.m,
         q=0 * u.C,
         parent=None,
     ):
         """
         Parameters
         ----------
-        id : str
+        name : str
             Name/ID of the body
         mass : ~astropy.units.kg
             Mass of the body
@@ -68,17 +68,18 @@ class Body:
         self.R = R
         self.q = q
         self.mass = mass
-        self.identifier = identifier
+        self.name = name
+        self.coordinates = differential
         self.parent = parent
 
 
 class _Sun(Body):
     def __init__(self):
         parent = None
-        identifier = "Sun"
+        name = "Sun"
         R = constant.R_sun
         mass = constant.Solar_Mass
-        super(_Sun, self).__init__(identifier=identifier, mass=mass, R=R, parent=parent)
+        super(_Sun, self).__init__(name=name, mass=mass, R=R, parent=parent)
 
 
 Sun = _Sun()
@@ -87,12 +88,10 @@ Sun = _Sun()
 class _Earth(Body):
     def __init__(self):
         parent = Sun
-        identifier = "Earth"
+        name = "Earth"
         R = 6731 * u.km
         mass = 5.97219e24 * u.kg
-        super(_Earth, self).__init__(
-            identifier=identifier, mass=mass, R=R, parent=parent
-        )
+        super(_Earth, self).__init__(name=name, mass=mass, R=R, parent=parent)
 
 
 Earth = _Earth()
diff --git a/src/einsteinpy/coordinates/core.py b/src/einsteinpy/coordinates/core.py
index 1f575ff..8e3bceb 100644
--- a/src/einsteinpy/coordinates/core.py
+++ b/src/einsteinpy/coordinates/core.py
@@ -211,12 +211,13 @@ class BoyerLindquist:
         theta : ~astropy.units.quantity.Quantity
         phi : ~astropy.units.quantity.Quantity
         a : ~astropy.units.quantity.Quantity
-        
+
         """
         self.r = r
         self.theta = theta
         self.phi = phi
         self.a = a
+        self.system = "BoyerLindquist"
 
     def __repr__(self):
         return "Boyer-Lindquist r: {}, theta: {}, phi: {} | a: {}".format(
diff --git a/src/einsteinpy/geodesic.py b/src/einsteinpy/geodesic.py
new file mode 100644
index 0000000..976b531
--- /dev/null
+++ b/src/einsteinpy/geodesic.py
@@ -0,0 +1,31 @@
+from einsteinpy.metric import Schwarzschild
+
+
+class Geodesic:
+    """
+    Class for defining geodesics of different geometries.
+    """
+
+    def __init__(self, body, time, end_lambda, step_size=1e-3, metric=Schwarzschild):
+        """
+        Parameters
+        ----------
+
+        """
+        self.body = body
+        self.attractor = body.parent
+        self.metric = metric.from_coords(
+            coords=self.body.coordinates,
+            M=self.attractor.mass,
+            q=self.body.q,
+            Q=self.attractor.q,
+            time=time,
+            a=self.attractor.a,
+        )
+        self._trajectory = self.metric.calculate_trajectory(
+            end_lambda=end_lambda, OdeMethodKwargs={"stepsize": step_size}
+        )[1]
+
+    @property
+    def trajectory(self):
+        return self._trajectory
diff --git a/src/einsteinpy/metric/kerr.py b/src/einsteinpy/metric/kerr.py
index ca90a2b..8a99e3d 100644
--- a/src/einsteinpy/metric/kerr.py
+++ b/src/einsteinpy/metric/kerr.py
@@ -35,32 +35,11 @@ class Kerr:
         )
         self.scr = schwarzschild_radius(M)
 
-    @classmethod
-    @u.quantity_input(time=u.s, M=u.kg)
-    def from_BL(cls, coords, M, time=0 * u.s):
-        """
-        Constructor
-        Initialize from Boyer-Lindquist Coordinates
-
-        Parameters
-        ----------
-        coords : ~einsteinpy.coordinates.velocity.BoyerLindquistDifferential
-            Initial positions and velocities of particle in BL Coordinates, and spin factor of massive body.
-        M : ~astropy.units.quantity.Quantity
-            Mass of the body
-        time : ~astropy.units.quantity.Quantity
-            Time of start, defaults to 0 seconds.
-
-        """
-        cls.input_coord_system = "Boyer-Lindquist"
-        return cls(coords, M, time)
-
     @classmethod
     @u.quantity_input(time=u.s, M=u.kg, a=u.m)
-    def from_cartesian(cls, coords, M, a, time=0 * u.s):
+    def from_coords(cls, coords, M, q=None, Q=None, time=0 * u.s, a=0 * u.m):
         """
         Constructor
-        Initialize from Cartesian Coordinates
 
         Parameters
         ----------
@@ -74,9 +53,13 @@ class Kerr:
             Time of start, defaults to 0 seconds.
 
         """
-        cls.input_coord_system = "Cartesian"
-        bl_coords = coords.bl_differential(a)
-        return cls(bl_coords, M, time)
+        if coords.system == "Cartesian":
+            bl_coords = coords.bl_differential(a)
+            return cls(bl_coords, M, time)
+        if coords.system == "Spherical":
+            bl_coords = coords.bl_differential(a)
+            return cls(bl_coords, M, time)
+        return cls(coords, M, time)
 
     def f_vec(self, ld, vec):
         chl = kerr_utils.christoffels(vec[1], vec[2], self.M.value, self.a.value)
diff --git a/src/einsteinpy/metric/kerrnewman.py b/src/einsteinpy/metric/kerrnewman.py
index 4364727..b4968c6 100644
--- a/src/einsteinpy/metric/kerrnewman.py
+++ b/src/einsteinpy/metric/kerrnewman.py
@@ -41,11 +41,10 @@ class KerrNewman:
         self.scr = schwarzschild_radius(M)
 
     @classmethod
-    @u.quantity_input(q=u.C / u.kg, time=u.s, M=u.kg, Q=u.C)
-    def from_BL(cls, coords, q, M, Q, time=0 * u.s):
+    @u.quantity_input(q=u.C / u.kg, time=u.s, M=u.kg, Q=u.C, a=u.m)
+    def from_coords(cls, coords, M, q, Q, time=0 * u.s, a=0 * u.m):
         """
         Constructor.
-        Initialize from Boyer-Lindquist Coordinates.
 
         Parameters
         ----------
@@ -57,39 +56,19 @@ class KerrNewman:
             Mass of the massive body
         Q : ~astropy.units.quantity.Quantity
             Charge on the massive body
-        time : ~astropy.units.quantity.Quantity
-            Time of start, defaults to 0 seconds.
-
-        """
-        cls.input_coord_system = "Boyer-Lindquist"
-        return cls(coords, q, M, Q, time)
-
-    @classmethod
-    @u.quantity_input(q=u.C / u.kg, time=u.s, M=u.kg, Q=u.C, a=u.m)
-    def from_cartesian(cls, coords, q, M, a, Q, time=0 * u.s):
-        """
-        Constructor.
-        Initialize from Cartesian Coordinates.
-
-        Parameters
-        ----------
-        coords : ~einsteinpy.coordinates.velocity.CartesianDifferential
-            Initial positions and velocities of particle in Cartesian Coordinates.
-        q : ~astropy.units.quantity.Quantity
-            Charge per unit mass of test particle
-        M : ~astropy.units.quantity.Quantity
-            Mass of the massive body
         a : ~astropy.units.quantity.Quantity
             Spin factor of the massive body(Angular Momentum per unit mass per speed of light)
-        Q : ~astropy.units.quantity.Quantity
-            Charge on the massive body
         time : ~astropy.units.quantity.Quantity
             Time of start, defaults to 0 seconds.
 
         """
-        cls.input_coord_system = "Cartesian"
-        bl_coords = coords.bl_differential(a)
-        return cls(bl_coords, q, M, Q, time)
+        if coords.system == "Cartesian":
+            bl_coords = coords.bl_differential(a)
+            return cls(bl_coords, q, M, Q, time)
+        if coords.system == "Spherical":
+            bl_coords = coords.bl_differential(a)
+            return cls(bl_coords, q, M, Q, time)
+        return cls(coords, q, M, Q, time)
 
     def f_vec(self, ld, vec):
         chl = kerrnewman_utils.christoffels(
diff --git a/src/einsteinpy/metric/schwarzschild.py b/src/einsteinpy/metric/schwarzschild.py
index 022850f..4b617b1 100644
--- a/src/einsteinpy/metric/schwarzschild.py
+++ b/src/einsteinpy/metric/schwarzschild.py
@@ -33,26 +33,8 @@ class Schwarzschild:
         self.scr = schwarzschild_radius(M)
 
     @classmethod
-    @u.quantity_input(time=u.s, M=u.kg)
-    def from_spherical(cls, coords, M, time=0 * u.s):
-        """
-        Constructor
-
-        Parameters
-        ----------
-        coords : ~einsteinpy.coordinates.velocity.SphericalDifferential
-            Object having both initial positions and velocities of particle in Spherical Coordinates
-        M : ~astropy.units.quantity.Quantity
-            Mass of the body
-        time : ~astropy.units.quantity.Quantity
-            Time of start, defaults to 0 seconds.
-
-        """
-        return cls(coords, M, time)
-
-    @classmethod
-    @u.quantity_input(time=u.s, M=u.kg)
-    def from_cartesian(cls, coords, M, time=0 * u.s):
+    @u.quantity_input(time=u.s, M=u.kg, a=u.m)
+    def from_coords(cls, coords, M, q=None, Q=None, time=0 * u.s, a=0 * u.m):
         """
         Constructor
 
@@ -66,6 +48,8 @@ class Schwarzschild:
             Time of start, defaults to 0 seconds.
 
         """
+        if coords.system == "Spherical":
+            return cls(coords, M, time)
         sph_coords = coords.spherical_differential()
         return cls(sph_coords, M, time)
 
diff --git a/src/einsteinpy/plotting/__init__.py b/src/einsteinpy/plotting/__init__.py
index da1c41c..e201248 100644
--- a/src/einsteinpy/plotting/__init__.py
+++ b/src/einsteinpy/plotting/__init__.py
@@ -1,2 +1,2 @@
-from .geodesics_scatter import ScatterGeodesicPlotter
-from .geodesics_static import StaticGeodesicPlotter
+from einsteinpy.plotting.geodesics.geodesics_scatter import ScatterGeodesicPlotter
+from einsteinpy.plotting.geodesics.geodesics_static import StaticGeodesicPlotter
diff --git a/src/einsteinpy/plotting/geodesics/__init__.py b/src/einsteinpy/plotting/geodesics/__init__.py
new file mode 100644
index 0000000..e201248
--- /dev/null
+++ b/src/einsteinpy/plotting/geodesics/__init__.py
@@ -0,0 +1,2 @@
+from einsteinpy.plotting.geodesics.geodesics_scatter import ScatterGeodesicPlotter
+from einsteinpy.plotting.geodesics.geodesics_static import StaticGeodesicPlotter
diff --git a/src/einsteinpy/plotting/geodesics_scatter.py b/src/einsteinpy/plotting/geodesics/geodesics_scatter.py
similarity index 73%
rename from src/einsteinpy/plotting/geodesics_scatter.py
rename to src/einsteinpy/plotting/geodesics/geodesics_scatter.py
index 3937d7a..e568bc9 100644
--- a/src/einsteinpy/plotting/geodesics_scatter.py
+++ b/src/einsteinpy/plotting/geodesics/geodesics_scatter.py
@@ -3,6 +3,8 @@ import matplotlib.pyplot as plt
 import numpy as np
 from matplotlib.animation import FuncAnimation
 
+from einsteinpy.bodies import Body
+from einsteinpy.geodesic import Geodesic
 from einsteinpy.metric import Schwarzschild
 
 
@@ -11,16 +13,12 @@ class ScatterGeodesicPlotter:
     Class for plotting static matplotlib plots.
     """
 
-    def __init__(
-        self, mass, time=0 * u.s, attractor_color="black", cmap_color="Oranges"
-    ):
+    def __init__(self, time=0 * u.s, attractor_color="black", cmap_color="Oranges"):
         """
         Constructor.
 
         Parameters
         ----------
-        mass : ~astropy.units.quantity.Quantity
-            Mass of the body
         time : ~astropy.units.quantity.Quantity
             Time of start, defaults to 0 seconds.
         attractor_color : string, optional
@@ -29,7 +27,6 @@ class ScatterGeodesicPlotter:
             Color used in function plot.
 
         """
-        self.mass = mass
         self.time = time
         self._attractor_present = False
         self.attractor_color = attractor_color
@@ -39,7 +36,7 @@ class ScatterGeodesicPlotter:
         self._attractor_present = True
         plt.scatter(0, 0, color=self.attractor_color)
 
-    def plot(self, coords, end_lambda=10, step_size=1e-3):
+    def plot(self, geodesic):
         """
 
         Parameters
@@ -52,12 +49,9 @@ class ScatterGeodesicPlotter:
             Step size for the ODE.
 
         """
+        self.mass = geodesic.attractor.mass
 
-        swc = Schwarzschild.from_spherical(coords, self.mass, self.time)
-
-        vals = swc.calculate_trajectory(
-            end_lambda=end_lambda, OdeMethodKwargs={"stepsize": step_size}
-        )[1]
+        vals = geodesic.trajectory
 
         time = vals[:, 0]
         r = vals[:, 1]
@@ -73,28 +67,20 @@ class ScatterGeodesicPlotter:
         if not self._attractor_present:
             self._plot_attractor()
 
-    def animate(self, coords, end_lambda=10, step_size=1e-3, interval=50):
+    def animate(self, geodesic, interval=50):
         """
         Function to generate animated plots of geodesics.
 
         Parameters
         ----------
-        coords : ~einsteinpy.coordinates.velocity.SphericalDifferential
-            Position and velocity components of particle in Spherical Coordinates.
-        end_lambda : float, optional
-            Lambda where iteartions will stop.
-        step_size : float, optional
-            Step size for the ODE.
+        geodesic : ~einsteinpy.geodesic.Geodesic
+            Geodesic of the body
         interval : int, optional
             Control the time between frames. Add time in milliseconds.
 
         """
 
-        swc = Schwarzschild.from_spherical(coords, self.mass, self.time)
-
-        vals = swc.calculate_trajectory(
-            end_lambda=end_lambda, OdeMethodKwargs={"stepsize": step_size}
-        )[1]
+        vals = geodesic.trajectory
 
         time = vals[:, 0]
         r = vals[:, 1]
diff --git a/src/einsteinpy/plotting/geodesics_static.py b/src/einsteinpy/plotting/geodesics/geodesics_static.py
similarity index 63%
rename from src/einsteinpy/plotting/geodesics_static.py
rename to src/einsteinpy/plotting/geodesics/geodesics_static.py
index 9840574..d4ddde0 100644
--- a/src/einsteinpy/plotting/geodesics_static.py
+++ b/src/einsteinpy/plotting/geodesics/geodesics_static.py
@@ -1,5 +1,4 @@
 import random
-import sys
 
 import astropy.units as u
 import matplotlib as mpl
@@ -7,7 +6,6 @@ import matplotlib.pyplot as plt
 import numpy as np
 from matplotlib.animation import FuncAnimation
 
-from einsteinpy.metric import Schwarzschild
 from einsteinpy.utils import schwarzschild_radius
 
 
@@ -18,19 +16,16 @@ class StaticGeodesicPlotter:
 
     def __init__(
         self,
-        mass,
         time=0 * u.s,
         ax=None,
         attractor_radius_scale=-1.0,
         attractor_color="#ffcc00",
     ):
         """
-        Constructor. 
+        Constructor.
 
         Parameters
         ----------
-        mass : ~astropy.units.quantity.Quantity
-            Mass of the body
         time : ~astropy.units.quantity.Quantity
             Time of start, defaults to 0 seconds.
         attractor_radius_scale : float, optional
@@ -43,7 +38,6 @@ class StaticGeodesicPlotter:
         if not self.ax:
             self.fig, self.ax = plt.subplots(figsize=(6, 6))
         self.time = time
-        self.mass = mass
         self._attractor_present = False
         self.attractor_color = attractor_color
         self.attractor_radius_scale = attractor_radius_scale
@@ -51,26 +45,18 @@ class StaticGeodesicPlotter:
         self.__yarr = np.array([])
         self.get_curr_plot_radius = 0
 
-    def plot_trajectory(self, coords, end_lambda, step_size, color):
+    def plot_trajectory(self, geodesic, color, only_points=False):
         """
 
         Parameters
         ----------
-        coords : ~einsteinpy.coordinates.velocity.SphericalDifferential
-            Initial position and velocity of particle in Spherical coordinates.
-        end_lambda : float, optional
-            Lambda where iteartions will stop.
-        step_size : float, optional
-            Step size for the ODE.
+        geodesic : ~einsteinpy.geodesic.Geodesic
+            Geodesic of the body.
         color : string
             Color of the Geodesic
 
         """
-        swc = Schwarzschild.from_spherical(coords, self.mass, self.time)
-
-        vals = swc.calculate_trajectory(
-            end_lambda=end_lambda, OdeMethodKwargs={"stepsize": step_size}
-        )[1]
+        vals = geodesic.trajectory
 
         # time = np.array([coord[0] for coord in vals])
         r = np.array([coord[1] for coord in vals])
@@ -80,6 +66,12 @@ class StaticGeodesicPlotter:
         x = r * np.cos(phi)
         y = r * np.sin(phi)
 
+        self.__xarr = x
+        self.__yarr = y
+
+        if only_points:
+            return x, y
+
         lines = self.ax.plot(x, y, "--", color=color)
 
         return lines, x[-1], y[-1]
@@ -88,36 +80,6 @@ class StaticGeodesicPlotter:
         if not self._attractor_present:
             self._draw_attractor()
 
-    def __get_x_y(self, coords, end_lambda, step_size):
-        """
-
-        Parameters
-        ----------
-        coords : ~einsteinpy.coordinates.velocity.SphericalDifferential
-            Initial position and velocity of particle in Spherical coordinates.
-        end_lambda : float, optional
-            Lambda where iteartions will stop.
-        step_size : float, optional
-            Step size for the ODE.
-
-        """
-        swc = Schwarzschild.from_spherical(coords, self.mass, self.time)
-
-        vals = swc.calculate_trajectory(
-            end_lambda=end_lambda, OdeMethodKwargs={"stepsize": step_size}
-        )[1]
-
-        # time = np.array([coord[0] for coord in vals])
-        r = np.array([coord[1] for coord in vals])
-        # theta = np.array([coord[2] for coord in vals])
-        phi = np.array([coord[3] for coord in vals])
-
-        x = r * np.cos(phi)
-        y = r * np.sin(phi)
-        self.__xarr = x
-        self.__yarr = y
-        return x, y
-
     def mindist(self, x, y):
         return np.sqrt(x * x + y * y)
 
@@ -150,23 +112,13 @@ class StaticGeodesicPlotter:
                 )
             )
 
-    def plot(
-        self,
-        coords,
-        end_lambda=10,
-        step_size=1e-3,
-        color="#{:06x}".format(random.randint(0, 0xFFFFFF)),
-    ):
+    def plot(self, geodesic, color="#{:06x}".format(random.randint(0, 0xFFFFFF))):
         """
 
         Parameters
         ----------
-        coords : ~einsteinpy.coordinates.velocity.SphericalDifferential
-            Initial position and velocity of particle in Spherical coordinates.
-        end_lambda : float, optional
-            Lambda where iteartions will stop.
-        step_size : float, optional
-            Step size for the ODE.
+        geodesic : ~einsteinpy.geodesic.Geodesic
+            Geodesic of the body
         color : hex code RGB, optional
             Color of the dashed lines. Picks a random color by default.
 
@@ -176,12 +128,12 @@ class StaticGeodesicPlotter:
             A list of Line2D objects representing the plotted data.
 
         """
-
-        self.__xarr, self.__yarr = self.__get_x_y(coords, end_lambda, step_size)
+        _, _ = self.plot_trajectory(geodesic, only_points=True, color=color)
+        self.mass = geodesic.attractor.mass
         self.plot_attractor()
         self._attractor_present = True
 
-        lines, x0, y0 = self.plot_trajectory(coords, end_lambda, step_size, color)
+        lines, x0, y0 = self.plot_trajectory(geodesic, color)
 
         l, = self.ax.plot(x0, y0, "o", mew=0, color=lines[0].get_color())
         lines.append(l)
@@ -193,23 +145,14 @@ class StaticGeodesicPlotter:
         return lines
 
     def animate(
-        self,
-        coords,
-        end_lambda=10,
-        step_size=1e-3,
-        color="#{:06x}".format(random.randint(0, 0xFFFFFF)),
-        interval=50,
+        self, geodesic, color="#{:06x}".format(random.randint(0, 0xFFFFFF)), interval=50
     ):
         """
 
         Parameters
         ----------
-        coords : ~einsteinpy.coordinates.velocity.SphericalDifferential
-            Initial position and velocity of particle in Spherical coordinates.
-        end_lambda : float, optional
-            Lambda where iteartions will stop.
-        step_size : float, optional
-            Step size for the ODE.
+        geodesic : ~einsteinpy.geodesic.Geodesic
+            Geodesic of the body.
         color : hex code RGB, optional
             Color of the dashed lines. Picks a random color by default.
         interval : int, optional
@@ -217,7 +160,8 @@ class StaticGeodesicPlotter:
 
         """
 
-        pos_x, pos_y = self.__get_x_y(coords, end_lambda, step_size)
+        pos_x, pos_y = self.plot_trajectory(geodesic, only_points=True, color=color)
+        self.mass = geodesic.attractor.mass
         x_max, x_min = max(pos_x), min(pos_x)
         y_max, y_min = max(pos_y), min(pos_y)
         margin_x = (x_max - x_min) * 0.1


Test patch:
diff --git a/src/einsteinpy/tests/test_bodies.py b/src/einsteinpy/tests/test_bodies.py
index 3bcb31b..a0d20c3 100644
--- a/src/einsteinpy/tests/test_bodies.py
+++ b/src/einsteinpy/tests/test_bodies.py
@@ -12,7 +12,7 @@ def test_sun_base_properties():
 
 def test_sun_extras():
     assert Sun.a == 0
-    assert Sun.identifier == "Sun"
+    assert Sun.name == "Sun"
     assert Sun.q == 0 * u.C
 
 
@@ -24,13 +24,13 @@ def test_earth_base_properties():
 
 def test_earth_extras():
     assert Earth.a == 0
-    assert Earth.identifier == "Earth"
+    assert Earth.name == "Earth"
     assert Earth.q == 0 * u.C
 
 
 def test_differentials():
     parent = Sun
-    identifier = "Earth"
+    name = "Earth"
     R = 6731 * u.km
     mass = 5.97219e24 * u.kg
     differential1 = CartesianDifferential(
@@ -39,12 +39,8 @@ def test_differentials():
     differential2 = SphericalDifferential(
         0 * u.km, 0 * u.rad, 0 * u.rad, 0 * u.km / u.s, 0 * u.rad / u.s, 0 * u.rad / u.s
     )
-    a = Body(
-        identifier=identifier, mass=mass, R=R, differential=differential1, parent=parent
-    )
-    b = Body(
-        identifier=identifier, mass=mass, R=R, differential=differential2, parent=parent
-    )
+    a = Body(name=name, mass=mass, R=R, differential=differential1, parent=parent)
+    b = Body(name=name, mass=mass, R=R, differential=differential2, parent=parent)
     assert isinstance(a.pos_vec, list)
     assert isinstance(a.vel_vec, list)
     assert isinstance(b.pos_vec, list)
diff --git a/src/einsteinpy/tests/test_geodesics.py b/src/einsteinpy/tests/test_geodesics.py
new file mode 100644
index 0000000..5658c91
--- /dev/null
+++ b/src/einsteinpy/tests/test_geodesics.py
@@ -0,0 +1,39 @@
+import astropy.units as u
+import numpy as np
+import pytest
+from numpy.testing import assert_allclose
+
+from einsteinpy.bodies import Body
+from einsteinpy.coordinates import SphericalDifferential
+from einsteinpy.geodesic import Geodesic
+
+
+@pytest.fixture()
+def dummy_data():
+    obj = SphericalDifferential(
+        130 * u.m,
+        np.pi / 2 * u.rad,
+        -np.pi / 8 * u.rad,
+        0 * u.m / u.s,
+        0 * u.rad / u.s,
+        1900 * u.rad / u.s,
+    )
+    att = Body(name="attractor", mass=6e24 * u.kg, parent=None)
+    b1 = Body(name="obj", differential=obj, parent=att)
+    t = 0 * u.s
+    start_lambda = 0.0
+    end_lambda = 0.002
+    step_size = 5e-8
+    return b1, t, start_lambda, end_lambda, step_size
+
+
+def test_Geodesics_conserves_the_attractor(dummy_data):
+    body, t, _, end_lambda, stepsize = dummy_data
+    geo = Geodesic(body, t, end_lambda=end_lambda, step_size=stepsize)
+    assert geo.attractor == body.parent
+
+
+def test_Geodesics_has_trajectory(dummy_data):
+    body, t, _, end_lambda, stepsize = dummy_data
+    geo = Geodesic(body, t, end_lambda=end_lambda, step_size=stepsize)
+    assert isinstance(geo.trajectory, np.ndarray)
diff --git a/src/einsteinpy/tests/test_metric/test_kerr.py b/src/einsteinpy/tests/test_metric/test_kerr.py
index d24ec80..1439748 100644
--- a/src/einsteinpy/tests/test_metric/test_kerr.py
+++ b/src/einsteinpy/tests/test_metric/test_kerr.py
@@ -70,7 +70,7 @@ def test_calculate_trajectory(
     coords, time, M, start_lambda, end_lambda, OdeMethodKwargs
 ):
     _scr = schwarzschild_radius_dimensionless(M)
-    obj = Kerr.from_BL(coords, M, time)
+    obj = Kerr.from_coords(coords, M, time)
     ans = obj.calculate_trajectory(
         start_lambda=start_lambda,
         end_lambda=end_lambda,
@@ -110,7 +110,7 @@ def test_calculate_trajectory3():
     )
     end_lambda = ((1 * u.year).to(u.s)).value
     a = 0 * u.km
-    cl = Kerr.from_cartesian(cart_obj, M, a)
+    cl = Kerr.from_coords(cart_obj, M, a)
     ans = cl.calculate_trajectory(
         start_lambda=0.0,
         end_lambda=end_lambda,
@@ -170,14 +170,14 @@ def test_calculate_trajectory3():
 def test_calculate_trajectory_iterator(
     coords, time, M, start_lambda, end_lambda, OdeMethodKwargs, return_cartesian
 ):
-    cl1 = Kerr.from_BL(coords, M, time)
+    cl1 = Kerr.from_coords(coords, M, time)
     arr1 = cl1.calculate_trajectory(
         start_lambda=start_lambda,
         end_lambda=end_lambda,
         OdeMethodKwargs=OdeMethodKwargs,
         return_cartesian=return_cartesian,
     )[1]
-    cl2 = Kerr.from_BL(coords, M, time)
+    cl2 = Kerr.from_coords(coords, M, time)
     it = cl2.calculate_trajectory_iterator(
         start_lambda=start_lambda,
         OdeMethodKwargs=OdeMethodKwargs,
@@ -203,7 +203,7 @@ def test_calculate_trajectory_iterator_RuntimeWarning():
     M = 1e25 * u.kg
     start_lambda = 0.0
     OdeMethodKwargs = {"stepsize": 0.4e-6}
-    cl = Kerr.from_BL(bl_obj, M)
+    cl = Kerr.from_coords(bl_obj, M)
     with warnings.catch_warnings(record=True) as w:
         it = cl.calculate_trajectory_iterator(
             start_lambda=start_lambda,
diff --git a/src/einsteinpy/tests/test_metric/test_kerrnewman.py b/src/einsteinpy/tests/test_metric/test_kerrnewman.py
index 858a68d..819ba39 100644
--- a/src/einsteinpy/tests/test_metric/test_kerrnewman.py
+++ b/src/einsteinpy/tests/test_metric/test_kerrnewman.py
@@ -35,7 +35,7 @@ def test_calculate_trajectory0():
     )
     a = 0 * u.m
     end_lambda = ((1 * u.year).to(u.s)).value
-    cl = KerrNewman.from_cartesian(cart_obj, q, M, a, Q)
+    cl = KerrNewman.from_coords(coords=cart_obj, M=M, q=q, a=a, Q=Q)
     ans = cl.calculate_trajectory(
         start_lambda=0.0,
         end_lambda=end_lambda,
@@ -72,7 +72,7 @@ def test_calculate_trajectory1():
         0.0 * u.rad / u.s,
         a,
     )
-    cl = KerrNewman.from_BL(bl_obj, q, M, Q)
+    cl = KerrNewman.from_coords(coords=bl_obj, q=q, M=M, Q=Q)
     ans = cl.calculate_trajectory(
         end_lambda=end_lambda, OdeMethodKwargs={"stepsize": stepsize}
     )
@@ -101,15 +101,14 @@ def test_compare_calculate_trajectory_iterator_bl(test_input):
         a,
     )
     M = 0.5 * 5.972e24 * u.kg
-    cl1 = KerrNewman.from_BL(bl_obj, q, M, Q)
-    cl2 = KerrNewman.from_BL(bl_obj, q, M, Q)
+    cl1 = KerrNewman.from_coords(coords=bl_obj, q=q, M=M, Q=Q)
+    cl2 = KerrNewman.from_coords(coords=bl_obj, q=q, M=M, Q=Q)
     ans1 = cl1.calculate_trajectory(end_lambda=el, OdeMethodKwargs={"stepsize": ss})[1]
     it = cl2.calculate_trajectory_iterator(OdeMethodKwargs={"stepsize": ss})
     ans2 = list()
     for _, val in zip(range(20), it):
         ans2.append(val[1])
     ans2 = np.array(ans2)
-    print(ans1)
     assert_allclose(ans1[:20], ans2)
 
 
@@ -124,8 +123,8 @@ def test_compare_calculate_trajectory_iterator_cartesians(test_input):
     )
     M = 2e24 * u.kg
     q, a, Q, el, ss = test_input
-    cl1 = KerrNewman.from_cartesian(cart_obj, q, M, a, Q)
-    cl2 = KerrNewman.from_cartesian(cart_obj, q, M, a, Q)
+    cl1 = KerrNewman.from_coords(coords=cart_obj, q=q, M=M, a=a, Q=Q)
+    cl2 = KerrNewman.from_coords(coords=cart_obj, q=q, M=M, a=a, Q=Q)
     ans1 = cl1.calculate_trajectory(
         end_lambda=el, OdeMethodKwargs={"stepsize": ss}, return_cartesian=True
     )[1]
@@ -136,7 +135,6 @@ def test_compare_calculate_trajectory_iterator_cartesians(test_input):
     for _, val in zip(range(20), it):
         ans2.append(val[1])
     ans2 = np.array(ans2)
-    print(ans1)
     assert_allclose(ans1[:20], ans2)
 
 
@@ -154,7 +152,7 @@ def test_calculate_trajectory_iterator_RuntimeWarning():
     start_lambda = 0.0
     q, Q = 0 * u.C / u.kg, 0 * u.C
     OdeMethodKwargs = {"stepsize": 0.4e-6}
-    cl = KerrNewman.from_BL(bl_obj, q, M, Q)
+    cl = KerrNewman.from_coords(coords=bl_obj, q=q, M=M, Q=Q)
     with warnings.catch_warnings(record=True) as w:
         it = cl.calculate_trajectory_iterator(
             start_lambda=start_lambda,
diff --git a/src/einsteinpy/tests/test_metric/test_schwarzschild.py b/src/einsteinpy/tests/test_metric/test_schwarzschild.py
index a15d706..ba1de73 100644
--- a/src/einsteinpy/tests/test_metric/test_schwarzschild.py
+++ b/src/einsteinpy/tests/test_metric/test_schwarzschild.py
@@ -66,7 +66,7 @@ _c = constant.c.value
 def test_calculate_trajectory(
     coords, time, M, start_lambda, end_lambda, OdeMethodKwargs
 ):
-    cl = Schwarzschild.from_spherical(coords, M, time)
+    cl = Schwarzschild.from_coords(coords, M, time)
     ans = cl.calculate_trajectory(
         start_lambda=start_lambda,
         end_lambda=end_lambda,
@@ -103,7 +103,7 @@ def test_calculate_trajectory2():
         angular_vel,
     )
     end_lambda = ((1 * u.year).to(u.s)).value
-    cl = Schwarzschild.from_spherical(sph_obj, M)
+    cl = Schwarzschild.from_coords(sph_obj, M)
     ans = cl.calculate_trajectory(
         start_lambda=0.0,
         end_lambda=end_lambda,
@@ -131,7 +131,7 @@ def test_calculate_trajectory3():
         0 * u.km / u.h,
     )
     end_lambda = ((1 * u.year).to(u.s)).value
-    cl = Schwarzschild.from_cartesian(cart_obj, M)
+    cl = Schwarzschild.from_coords(cart_obj, M)
     ans = cl.calculate_trajectory(
         start_lambda=0.0,
         end_lambda=end_lambda,
@@ -189,14 +189,14 @@ def test_calculate_trajectory3():
 def test_calculate_trajectory_iterator(
     coords, time, M, start_lambda, end_lambda, OdeMethodKwargs, return_cartesian
 ):
-    cl1 = Schwarzschild.from_spherical(coords, M, time)
+    cl1 = Schwarzschild.from_coords(coords, M, time)
     arr1 = cl1.calculate_trajectory(
         start_lambda=start_lambda,
         end_lambda=end_lambda,
         OdeMethodKwargs=OdeMethodKwargs,
         return_cartesian=return_cartesian,
     )[1]
-    cl2 = Schwarzschild.from_spherical(coords, M, time)
+    cl2 = Schwarzschild.from_coords(coords, M, time)
     it = cl2.calculate_trajectory_iterator(
         start_lambda=start_lambda,
         OdeMethodKwargs=OdeMethodKwargs,
@@ -221,7 +221,7 @@ def test_calculate_trajectory_iterator_RuntimeWarning():
     M = 1e25 * u.kg
     start_lambda = 0.0
     OdeMethodKwargs = {"stepsize": 0.4e-6}
-    cl = Schwarzschild.from_spherical(sph_obj, M)
+    cl = Schwarzschild.from_coords(sph_obj, M)
     with warnings.catch_warnings(record=True) as w:
         it = cl.calculate_trajectory_iterator(
             start_lambda=start_lambda,
@@ -245,7 +245,7 @@ def test_calculate_trajectory_iterator_RuntimeWarning2():
     M = 1e25 * u.kg
     start_lambda = 0.0
     OdeMethodKwargs = {"stepsize": 0.4e-6}
-    cl = Schwarzschild.from_spherical(sph_obj, M)
+    cl = Schwarzschild.from_coords(sph_obj, M)
     with warnings.catch_warnings(record=True) as w:
         it = cl.calculate_trajectory_iterator(
             start_lambda=start_lambda,
diff --git a/src/einsteinpy/tests/test_plotting/test_scattergeodesicplotter.py b/src/einsteinpy/tests/test_plotting/test_scattergeodesicplotter.py
index 049df62..707a803 100644
--- a/src/einsteinpy/tests/test_plotting/test_scattergeodesicplotter.py
+++ b/src/einsteinpy/tests/test_plotting/test_scattergeodesicplotter.py
@@ -4,68 +4,72 @@ import astropy.units as u
 import numpy as np
 import pytest
 
+from einsteinpy.bodies import Body
 from einsteinpy.coordinates import SphericalDifferential
+from einsteinpy.geodesic import Geodesic
 from einsteinpy.plotting import ScatterGeodesicPlotter
 
 
 @pytest.fixture()
 def dummy_data():
-    sph_obj = SphericalDifferential(
-        306 * u.m,
-        np.pi / 2 * u.rad,
+    obj = SphericalDifferential(
+        130 * u.m,
         np.pi / 2 * u.rad,
+        -np.pi / 8 * u.rad,
         0 * u.m / u.s,
         0 * u.rad / u.s,
-        951.0 * u.rad / u.s,
+        1900 * u.rad / u.s,
     )
+    att = Body(name="attractor", mass=6e24 * u.kg, parent=None)
+    b1 = Body(name="obj", differential=obj, parent=att)
     t = 0 * u.s
-    m = 4e24 * u.kg
     start_lambda = 0.0
     end_lambda = 0.002
-    step_size = 0.5e-6
-    return sph_obj, t, m, start_lambda, end_lambda, step_size
+    step_size = 5e-8
+    geo = Geodesic(b1, t, end_lambda=end_lambda, step_size=step_size)
+    return geo
 
 
 def test_plot_attractor_is_called_only_once(dummy_data):
-    sph_obj, _, m, _, el, ss = dummy_data
-    cl = ScatterGeodesicPlotter(m)
+    geodesics = dummy_data
+    cl = ScatterGeodesicPlotter()
     assert not cl._attractor_present
-    cl.plot(sph_obj, el, ss)
+    cl.plot(geodesics)
     assert cl._attractor_present
 
 
 @mock.patch(
-    "einsteinpy.plotting.geodesics_scatter.ScatterGeodesicPlotter._plot_attractor"
+    "einsteinpy.plotting.geodesics.geodesics_scatter.ScatterGeodesicPlotter._plot_attractor"
 )
 def test_plot_calls_plot_attractor(mock_plot_attractor, dummy_data):
-    sph_obj, _, m, _, el, ss = dummy_data
-    cl = ScatterGeodesicPlotter(m)
-    cl.plot(sph_obj, el, ss)
+    geodesics = dummy_data
+    cl = ScatterGeodesicPlotter()
+    cl.plot(geodesics)
     mock_plot_attractor.assert_called_with()
 
 
-@mock.patch("einsteinpy.plotting.geodesics_scatter.plt.figure")
+@mock.patch("einsteinpy.plotting.geodesics.geodesics_scatter.plt.figure")
 def test_animate_calls_figure(mock_figure, dummy_data):
-    sph_obj, _, m, _, el, ss = dummy_data
-    cl = ScatterGeodesicPlotter(m)
-    cl.animate(sph_obj, el, ss)
+    geodesics = dummy_data
+    cl = ScatterGeodesicPlotter()
+    cl.animate(geodesics)
     mock_figure.assert_called_with()
 
 
-@mock.patch("einsteinpy.plotting.geodesics_scatter.plt.show")
+@mock.patch("einsteinpy.plotting.geodesics.geodesics_scatter.plt.show")
 def test_plot_show_shows_plot(mock_show, dummy_data):
-    sph_obj, _, m, _, el, ss = dummy_data
-    cl = ScatterGeodesicPlotter(m)
-    cl.plot(sph_obj, el, ss)
+    geodesics = dummy_data
+    cl = ScatterGeodesicPlotter()
+    cl.plot(geodesics)
     cl.show()
     mock_show.assert_called_with()
 
 
-@mock.patch("einsteinpy.plotting.geodesics_scatter.plt.savefig")
+@mock.patch("einsteinpy.plotting.geodesics.geodesics_scatter.plt.savefig")
 def test_plot_save_saves_plot(mock_save, dummy_data):
-    sph_obj, _, m, _, el, ss = dummy_data
-    cl = ScatterGeodesicPlotter(m)
-    cl.plot(sph_obj, el, ss)
+    geodesics = dummy_data
+    cl = ScatterGeodesicPlotter()
+    cl.plot(geodesics)
     name = "test_plot.png"
     cl.save(name)
     mock_save.assert_called_with(name)
diff --git a/src/einsteinpy/tests/test_plotting/test_staticgeodesicplotter.py b/src/einsteinpy/tests/test_plotting/test_staticgeodesicplotter.py
index 06bf277..e85a867 100644
--- a/src/einsteinpy/tests/test_plotting/test_staticgeodesicplotter.py
+++ b/src/einsteinpy/tests/test_plotting/test_staticgeodesicplotter.py
@@ -6,76 +6,80 @@ import matplotlib.pyplot as plt
 import numpy as np
 import pytest
 
+from einsteinpy.bodies import Body
 from einsteinpy.coordinates import SphericalDifferential
+from einsteinpy.geodesic import Geodesic
 from einsteinpy.plotting import StaticGeodesicPlotter
 
 
 @pytest.fixture()
 def dummy_data():
-    sph_obj = SphericalDifferential(
-        306 * u.m,
-        np.pi / 2 * u.rad,
+    obj = SphericalDifferential(
+        130 * u.m,
         np.pi / 2 * u.rad,
+        -np.pi / 8 * u.rad,
         0 * u.m / u.s,
         0 * u.rad / u.s,
-        951.0 * u.rad / u.s,
+        1900 * u.rad / u.s,
     )
+    att = Body(name="attractor", mass=6e24 * u.kg, parent=None)
+    b1 = Body(name="obj", differential=obj, parent=att)
     t = 0 * u.s
-    m = 4e24 * u.kg
     start_lambda = 0.0
     end_lambda = 0.002
-    step_size = 0.5e-6
-    return sph_obj, t, m, start_lambda, end_lambda, step_size
+    step_size = 5e-8
+    geo = Geodesic(b1, t, end_lambda=end_lambda, step_size=step_size)
+    return geo
 
 
 def test_staticgeodesicplotter_has_axes(dummy_data):
-    sph_obj, _, m, _, el, ss = dummy_data
-    cl = StaticGeodesicPlotter(m)
+    geodesic = dummy_data
+    cl = StaticGeodesicPlotter()
     assert isinstance(cl.ax, mpl.axes.SubplotBase)
     assert cl.time.value == 0.0
     assert cl._attractor_present is False
 
 
-@mock.patch("einsteinpy.plotting.geodesics_static.plt.show")
+@mock.patch("einsteinpy.plotting.geodesics.geodesics_static.plt.show")
 def test_plot_calls_plt_show(mock_show, dummy_data):
-    sph_obj, _, m, _, el, ss = dummy_data
-    cl = StaticGeodesicPlotter(m)
-    cl.plot(sph_obj, el, ss)
+    geodesic = dummy_data
+    cl = StaticGeodesicPlotter()
+    cl.plot(geodesic)
     cl.show()
     mock_show.assert_called_with()
     assert cl._attractor_present
 
 
 def test_animate_creates_ani(dummy_data):
-    sph_obj, _, m, _, el, ss = dummy_data
-    cl = StaticGeodesicPlotter(m)
-    cl.animate(sph_obj, el, ss, interval=10)
+    geodesic = dummy_data
+    cl = StaticGeodesicPlotter()
+    cl.animate(geodesic, interval=10)
     assert cl._attractor_present
     assert cl.ani
 
 
-@mock.patch("einsteinpy.plotting.geodesics_static.plt.savefig")
+@mock.patch("einsteinpy.plotting.geodesics.geodesics_static.plt.savefig")
 def test_plot_save_saves_plot(mock_save, dummy_data):
-    sph_obj, _, m, _, el, ss = dummy_data
-    cl = StaticGeodesicPlotter(m)
-    cl.plot(sph_obj, el, ss)
+    geodesic = dummy_data
+    cl = StaticGeodesicPlotter()
+    cl.plot(geodesic)
     name = "test_plot.png"
     cl.save(name)
     mock_save.assert_called_with(name)
 
 
 def test_plot_calls_draw_attractor_Manualscale(dummy_data):
-    sph_obj, _, m, _, el, ss = dummy_data
-    cl = StaticGeodesicPlotter(m, attractor_radius_scale=1500)
-    cl.plot(sph_obj, el, ss)
+    geodesic = dummy_data
+    cl = StaticGeodesicPlotter(attractor_radius_scale=1500)
+    cl.plot(geodesic)
     assert cl._attractor_present
     assert cl.attractor_radius_scale == 1500
     assert cl.get_curr_plot_radius != -1
 
 
 def test_plot_calls_draw_attractor_AutoScale(dummy_data):
-    sph_obj, _, m, _, el, ss = dummy_data
-    cl = StaticGeodesicPlotter(m)
-    cl.plot(sph_obj, el, ss)
+    geodesic = dummy_data
+    cl = StaticGeodesicPlotter()
+    cl.plot(geodesic)
     assert cl._attractor_present
     assert cl.get_curr_plot_radius != -1