task: metadata: install: pip install -e .[dev]
patch: diff --git a/nilearn/maskers/nifti_labels_masker.py b/nilearn/maskers/nifti_labels_masker.py
index 987ffc95b..689cf5238 100644
--- a/nilearn/maskers/nifti_labels_masker.py
+++ b/nilearn/maskers/nifti_labels_masker.py
@@ -324,6 +324,12 @@ class NiftiLabelsMasker(BaseMasker, _utils.CacheMixin):
 
             img = self._reporting_data['img']
 
+            # compute the cut coordinates on the label image in case
+            # we have a functional image
+            cut_coords = plotting.find_xyz_cut_coords(
+                labels_image, activation_threshold=.5
+            )
+
             # If we have a func image to show in the report, use it
             if img is not None:
                 if self._reporting_data["dim"] == 5:
@@ -335,6 +341,7 @@ class NiftiLabelsMasker(BaseMasker, _utils.CacheMixin):
                     self._report_content['warning_message'] = msg
                 display = plotting.plot_img(
                     img,
+                    cut_coords=cut_coords,
                     black_bg=False,
                     cmap=self.cmap,
                 )

problem_statement: masker.generate_report doesn't center on ROI if overlaid on functional data
<!--Provide a brief description of the bug.-->
When using masker.generate_report(), if no functional data is given ROIs are plotted on the MNI template, and the cursor centers on one of the ROIs. However, if the masker is first fit to functional data, ROIs are plotted on the functional data, but the cursor does not center on any of the ROIs. If the atlas happens to fall outside of where the cursor is, you cant see any of the ROIs and can't tell if the alignment is good or not.

<!--Please fill in the following information, to the best of your ability.-->
Nilearn version: 0.8.0

### Expected behavior
Figure generated by masker.generate_report() be centered somewhere on atlas, so alignment can be judged.

### Actual behavior
When functional data is used as the underlay, cursor is always at y=17, x=19, z=56, whether the atlas is visible in those slices or not.

![image](https://user-images.githubusercontent.com/63321511/147000740-44c08967-2f27-450f-9d74-82af79bd2596.png)


### Steps and code to reproduce bug
ROI attached, but I am not able to share functional image - any functional in MNI space should work.
```python
# load nilearn harvard oxford atlas
atlasI = nimg.load_img('/autofs/cluster/neuromod/personal_folders/walker_pedersen/BNSTmni/MNI152_T1_1mm-RBNST.nii.gz', dtype=int)
labelL = ['Background','RBNST']
# load atlas into masker
masker = input_data.NiftiLabelsMasker(
            atlasI, labels=labelL, standardize=False,
            verbose=0, detrend=False)
# visualize atlas ROIs
masker.fit()
report1 = masker.generate_report()
masker.fit(cleanI)
report2 = masker.generate_report()
```
[MNI152_T1_1mm-RBNST.nii.gz](https://github.com/nilearn/nilearn/files/7758303/MNI152_T1_1mm-RBNST.nii.gz)


repo: nilearn/nilearn
test_cmd: pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
test_patch: diff --git a/doc/changes/latest.rst b/doc/changes/latest.rst
index dae933bfe..881d1091d 100644
--- a/doc/changes/latest.rst
+++ b/doc/changes/latest.rst
@@ -25,6 +25,7 @@ Enhancements
 - :bdg-info:`Plotting` Allow setting ``vmin`` in :func:`~nilearn.plotting.plot_glass_brain` and :func:`~nilearn.plotting.plot_stat_map` (:gh:`3993` by `Michelle Wang`_).
 - :bdg-success:`API` Support passing t and F contrasts to :func:`~nilearn.glm.compute_contrast` that that have fewer columns than the number of estimated parameters. Remaining columns are padded with zero (:gh:`4067` by `Rémi Gau`_).
 - :bdg-dark:`Code` Multi-subject maskers' ``generate_report`` method no longer fails with 5D data but instead shows report of first subject. User can index input list to show report for different subjects (:gh:`3935` by `Yasmin Mzayek`_).
+- :bdg-dark:`Code` :meth:`~maskers.NiftiLabelsMasker.generate_report` now uses appropriate cut coordinates when functional image is provided (:gh:`4099` by `Yasmin Mzayek`_ and `Nicolas Gensollen`_).
 - :bdg-primary:`Code` Add `two_sided` option for :class:`~nilearn.image.binarize_img` (:gh:`4121` by `Steven Meisler`_).
 - :bdg-info:`Plotting` When plotting thresholded statistical maps with a colorbar, the threshold value(s) will now be displayed as tick labels on the colorbar (:gh:`#2833` by `Nicolas Gensollen`_).
 
diff --git a/nilearn/reporting/tests/test_html_report.py b/nilearn/reporting/tests/test_html_report.py
index 5e2bdec42..e5b0337d1 100644
--- a/nilearn/reporting/tests/test_html_report.py
+++ b/nilearn/reporting/tests/test_html_report.py
@@ -50,33 +50,31 @@ def mask(affine_eye):
 
 
 @pytest.fixture
-def niftimapsmasker_inputs():
+def niftimapsmasker_inputs(affine_eye):
     n_regions = 9
     shape = (13, 11, 12)
-    affine = np.diag([2, 2, 2, 1])
     label_img, _ = generate_maps(
-        shape, n_regions=n_regions, affine=affine
+        shape, n_regions=n_regions, affine=affine_eye
     )
     return {"maps_img": label_img}
 
 
 @pytest.fixture
-def input_parameters(masker_class, data_img_3d):
+def input_parameters(masker_class, data_img_3d, affine_eye):
     n_regions = 9
     shape = (13, 11, 12)
-    affine = np.diag([2, 2, 2, 1])
     labels = ["background"]
     labels += [f"region_{i}" for i in range(1, n_regions + 1)]
     if masker_class in (NiftiMasker, MultiNiftiMasker):
         return {"mask_img": data_img_3d}
     if masker_class in (NiftiLabelsMasker, MultiNiftiLabelsMasker):
         labels_img = generate_labeled_regions(
-            shape, n_regions=n_regions, affine=affine
+            shape, n_regions=n_regions, affine=affine_eye
         )
         return {"labels_img": labels_img, "labels": labels}
     elif masker_class in (NiftiMapsMasker, MultiNiftiMapsMasker):
         label_img, _ = generate_maps(
-            shape, n_regions=n_regions, affine=affine
+            shape, n_regions=n_regions, affine=affine_eye
         )
         return {"maps_img": label_img}
 
@@ -253,9 +251,8 @@ def test_nifti_maps_masker_report_image_in_fit(niftimapsmasker_inputs,
     assert html.body.count("<img") == 2
 
 
-def test_nifti_labels_masker_report(data_img_3d, mask):
+def test_nifti_labels_masker_report(data_img_3d, mask, affine_eye):
     shape = (13, 11, 12)
-    affine = np.diag([2, 2, 2, 1])
     n_regions = 9
     labels = (
         ['background'] +
@@ -266,7 +263,7 @@ def test_nifti_labels_masker_report(data_img_3d, mask):
                         'size (in mm^3)',
                         'relative size (in %)']
     labels_img = generate_labeled_regions(
-        shape, affine=affine, n_regions=n_regions
+        shape, affine=affine_eye, n_regions=n_regions
     )
     labels_img_floats = new_img_like(
         labels_img, get_data(labels_img).astype(float)
@@ -332,7 +329,7 @@ def test_nifti_labels_masker_report(data_img_3d, mask):
         assert_almost_equal(
             masker._report_content['summary']['size (in mm^3)'][r - 1],
             expected_region_sizes[r]
-            * np.abs(np.linalg.det(affine[:3, :3])))
+            * np.abs(np.linalg.det(affine_eye[:3, :3])))
 
     # Check that region labels are no displayed in the report
     # when they were not provided by the user.
@@ -347,6 +344,21 @@ def test_nifti_labels_masker_report(data_img_3d, mask):
             assert len(masker._report_content['summary'][col]) == n_regions
 
 
+@pytest.mark.parametrize("masker_class", [NiftiLabelsMasker])
+def test_nifti_labels_masker_report_cut_coords(
+    masker_class, input_parameters, data_img_3d
+):
+    """Test cut coordinate are equal with and without passing data to fit."""
+    masker = masker_class(**input_parameters, reports=True)
+    # Get display without data
+    masker.fit()
+    display = masker._reporting()
+    # Get display with data
+    masker.fit(data_img_3d)
+    display_data = masker._reporting()
+    assert display[0].cut_coords == display_data[0].cut_coords
+
+
 def test_4d_reports(mask, affine_eye):
     # Dummy 4D data
     data = np.zeros((10, 10, 10, 3), dtype="int32")