class_docstr: Test def add_cyclic(data, x=None, y=None, axis=-1,
                      cyclic=360, precision=1e-4):
  - variations of data, x, and y with and without axis keyword
  - different units of x - cyclic keyword
  - detection of cyclic points - precision keyword
  - error catching
docstr: Test axis keyword data 4d, x 3d and y 2d
docstr_tok: ["Test","axis","keyword","data","4d",",","x","3d","and","y","2d"]
code: def test_data_and_x_y_with_axis_nd(self):
      """Test axis keyword data 4d, x 3d and y 2d"""
      c_data, c_lons, c_lats = add_cyclic(
          self.data4d, x=self.lon3d, y=self.lat2d, axis=1
      )
      assert_array_equal(c_data, self.c_data4d)
      assert_array_equal(c_lons, self.c_lon3d)
      assert_array_equal(c_lats, self.c_lat2d)
  
imports: import numpy
  import numpy.ma
  from numpy.testing import assert_array_equal
  import pytest
  from cartopy.util import add_cyclic, add_cyclic_point, has_cyclic
label_desc: Use image node_id 18 for calling the TestAddCyclic obj's underlying member method code with example usage: obj.test_data_and_x_y_with_axis_nd() without return types