diff --git a/doc/releases/changelog-dev.md b/doc/releases/changelog-dev.md
index 7667e77f5..5c4a4b0d9 100644
--- a/doc/releases/changelog-dev.md
+++ b/doc/releases/changelog-dev.md
@@ -14,6 +14,11 @@
 
 <h3>Bug fixes 🐛</h3>
 
+* Raise a warning if control indicators are hidden when calling `qml.draw_mpl`
+  [(#4295)](https://github.com/PennyLaneAI/pennylane/pull/4295)
+
 <h3>Contributors ✍️</h3>
 
 This release contains contributions from (in alphabetical order):
+
+Matthew Silverman
diff --git a/pennylane/drawer/mpldrawer.py b/pennylane/drawer/mpldrawer.py
index 29c260d2b..c0d1a6cce 100644
--- a/pennylane/drawer/mpldrawer.py
+++ b/pennylane/drawer/mpldrawer.py
@@ -15,6 +15,7 @@
 This module contains the MPLDrawer class for creating circuit diagrams with matplotlib
 """
 from collections.abc import Iterable
+import warnings
 
 has_mpl = True
 try:
@@ -591,6 +592,15 @@ class MPLDrawer:
         min_wire = min(wires_all)
         max_wire = max(wires_all)
 
+        if len(wires_target) > 1:
+            min_target, max_target = min(wires_target), max(wires_target)
+            if any(min_target < w < max_target for w in wires_ctrl):
+                warnings.warn(
+                    "Some control indicators are hidden behind an operator. Consider re-ordering "
+                    "your circuit wires to ensure all control indicators are visible.",
+                    UserWarning,
+                )
+
         line = plt.Line2D((layer, layer), (min_wire, max_wire), **options)
         self._ax.add_line(line)
 

diff --git a/tests/drawer/test_mpldrawer.py b/tests/drawer/test_mpldrawer.py
index 28cd5a94c..26bb683ff 100644
--- a/tests/drawer/test_mpldrawer.py
+++ b/tests/drawer/test_mpldrawer.py
@@ -19,6 +19,7 @@ page in the developement guide.
 """
 # pylint: disable=protected-access,wrong-import-position
 
+import warnings
 import pytest
 
 plt = pytest.importorskip("matplotlib.pyplot")
@@ -429,6 +430,28 @@ class TestCTRL:
         assert circle.center == (0, 0)
         plt.close()
 
+    @pytest.mark.parametrize(
+        "control_wires,target_wires",
+        [
+            ((1,), (0, 2)),
+            ((0, 2), (1, 3)),
+            ((1, 3), (0, 2)),
+            ((0, 2, 4), (1, 3)),
+        ],
+    )
+    def test_ctrl_raises_warning_with_overlap(self, control_wires, target_wires):
+        """Tests that a warning is raised if some control indicators are not visible."""
+        drawer = MPLDrawer(1, 4)
+        with pytest.warns(UserWarning, match="control indicators are hidden behind an operator"):
+            drawer.ctrl(0, control_wires, target_wires)
+
+    @pytest.mark.parametrize("control_wires,target_wires", [((0,), (1, 2)), ((2,), (0, 1))])
+    def test_ctrl_no_warning_without_overlap(self, control_wires, target_wires):
+        drawer = MPLDrawer(1, 3)
+        with warnings.catch_warnings(record=True) as w:
+            drawer.ctrl(0, control_wires, target_wires)
+        assert len(w) == 0
+
     def test_target_x(self):
         """Tests hidden target_x drawing method"""
 

[BUG] draw_mpl misses controls for multi-target-wire ops with interspersed wires
### Expected behavior

All control and target wires are indicated in some way, or the draw function fails.

### Actual behavior

The control wire sandwiched between target wires is hidden behind a box drawing, For example, the attached image is hiding a control on wire 2.

![image](https://github.com/PennyLaneAI/pennylane/assets/23283972/8ddcac21-1fe9-46e8-94f0-731d931be315)


### Additional information

_No response_

### Source code

```shell
def c():
    qml.ctrl(qml.IsingXX(1.1, [1, 3]), [0, 2])

_ = qml.draw_mpl(c, wire_order=range(4))()
```


### Tracebacks

_No response_

### System information

```shell
Name: PennyLane
Version: 0.31.0.dev0
Summary: PennyLane is a Python quantum machine learning library by Xanadu Inc.
Home-page: https://github.com/XanaduAI/pennylane
Author: 
Author-email: 
License: Apache License 2.0
Location: /Users/matthews/.pyenv/versions/3.9.13/envs/pl/lib/python3.9/site-packages
Editable project location: /Users/matthews/src/github.com/PennyLaneAI/pennylane
Requires: appdirs, autograd, autoray, cachetools, networkx, numpy, pennylane-lightning, requests, rustworkx, scipy, semantic-version, toml
Required-by: PennyLane-Lightning

Platform info:           macOS-13.4-arm64-arm-64bit
Python version:          3.9.13
Numpy version:           1.23.5
Scipy version:           1.10.0
Installed devices:
- default.gaussian (PennyLane-0.31.0.dev0)
- default.mixed (PennyLane-0.31.0.dev0)
- default.qubit (PennyLane-0.31.0.dev0)
- default.qubit.autograd (PennyLane-0.31.0.dev0)
- default.qubit.jax (PennyLane-0.31.0.dev0)
- default.qubit.tf (PennyLane-0.31.0.dev0)
- default.qubit.torch (PennyLane-0.31.0.dev0)
- default.qutrit (PennyLane-0.31.0.dev0)
- null.qubit (PennyLane-0.31.0.dev0)
- lightning.qubit (PennyLane-Lightning-0.31.0.dev3)
```


### Existing GitHub issues

- [X] I have searched existing GitHub issues to make sure the issue does not already exist.
tests/drawer/test_mpldrawer.py::TestCTRL::test_ctrl_raises_warning_with_overlap[control_wires0-target_wires0] tests/drawer/test_mpldrawer.py::TestCTRL::test_ctrl_raises_warning_with_overlap[control_wires1-target_wires1] tests/drawer/test_mpldrawer.py::TestCTRL::test_ctrl_raises_warning_with_overlap[control_wires2-target_wires2] tests/drawer/test_mpldrawer.py::TestCTRL::test_ctrl_raises_warning_with_overlap[control_wires3-target_wires3]
tests/drawer/test_mpldrawer.py::TestInitialization::test_figsize_wires[2-2] tests/drawer/test_mpldrawer.py::TestInitialization::test_figsize_wires[2-3] tests/drawer/test_mpldrawer.py::TestInitialization::test_figsize_wires[3-2] tests/drawer/test_mpldrawer.py::TestInitialization::test_figsize_wires[3-3] tests/drawer/test_mpldrawer.py::TestInitialization::test_customfigsize tests/drawer/test_mpldrawer.py::TestInitialization::test_config_params_set tests/drawer/test_mpldrawer.py::TestInitialization::test_wires_formatting tests/drawer/test_mpldrawer.py::TestInitialization::test_fontsize tests/drawer/test_mpldrawer.py::TestLabels::test_labels tests/drawer/test_mpldrawer.py::TestLabels::test_labels_formatting tests/drawer/test_mpldrawer.py::TestBoxGate::test_simple_box tests/drawer/test_mpldrawer.py::TestBoxGate::test_multiwire_box tests/drawer/test_mpldrawer.py::TestBoxGate::test_notch_standard_styling tests/drawer/test_mpldrawer.py::TestBoxGate::test_active_wire_notches_number[wires0-0] tests/drawer/test_mpldrawer.py::TestBoxGate::test_active_wire_notches_number[wires1-0] tests/drawer/test_mpldrawer.py::TestBoxGate::test_active_wire_notches_number[wires2-4] tests/drawer/test_mpldrawer.py::TestBoxGate::test_active_wire_notches_number[wires3-6] tests/drawer/test_mpldrawer.py::TestBoxGate::test_no_active_wire_notches tests/drawer/test_mpldrawer.py::TestBoxGate::test_extra_width tests/drawer/test_mpldrawer.py::TestBoxGate::test_box_formatting tests/drawer/test_mpldrawer.py::TestBoxGate::test_text_formatting tests/drawer/test_mpldrawer.py::TestCTRL::test_ctrl_no_target tests/drawer/test_mpldrawer.py::TestCTRL::test_ctrl_multi_wires tests/drawer/test_mpldrawer.py::TestCTRL::test_ctrl_on_zero tests/drawer/test_mpldrawer.py::TestCTRL::test_ctrl_control_values_error tests/drawer/test_mpldrawer.py::TestCTRL::test_ctrl_formatting tests/drawer/test_mpldrawer.py::TestCTRL::test_ctrl_circ tests/drawer/test_mpldrawer.py::TestCTRL::test_ctrlo_circ tests/drawer/test_mpldrawer.py::TestCTRL::test_ctrl_target tests/drawer/test_mpldrawer.py::TestCTRL::test_ctrl_no_warning_without_overlap[control_wires0-target_wires0] tests/drawer/test_mpldrawer.py::TestCTRL::test_ctrl_no_warning_without_overlap[control_wires1-target_wires1] tests/drawer/test_mpldrawer.py::TestCTRL::test_target_x tests/drawer/test_mpldrawer.py::TestCTRL::test_target_x_color tests/drawer/test_mpldrawer.py::TestCTRL::test_CNOT tests/drawer/test_mpldrawer.py::TestCTRL::test_CNOT_control_values tests/drawer/test_mpldrawer.py::TestCTRL::test_CNOT_color tests/drawer/test_mpldrawer.py::TestSWAP::test_swap_x tests/drawer/test_mpldrawer.py::TestSWAP::test_SWAP tests/drawer/test_mpldrawer.py::TestSWAP::test_SWAP_options tests/drawer/test_mpldrawer.py::TestMeasure::test_measure tests/drawer/test_mpldrawer.py::TestMeasure::test_measure_formatted tests/drawer/test_mpldrawer.py::TestAutosize::test_autosize_false tests/drawer/test_mpldrawer.py::TestAutosize::test_autosize_one_wire tests/drawer/test_mpldrawer.py::TestAutosize::test_autosize_multiwires tests/drawer/test_mpldrawer.py::TestAutosize::test_multiline_text_single_wire tests/drawer/test_mpldrawer.py::TestAutosize::test_wide_multline_text_multiwires tests/drawer/test_mpldrawer.py::TestCond::test_cond_basic tests/drawer/test_mpldrawer.py::TestCond::test_cond_two_ctrl_wires tests/drawer/test_mpldrawer.py::TestCond::test_cond_two_ctrl_wires_upward tests/drawer/test_mpldrawer.py::TestCond::test_cond_fail_with_bad_order[ctrl_wires0-target_wires0] tests/drawer/test_mpldrawer.py::TestCond::test_cond_fail_with_bad_order[ctrl_wires1-target_wires1] tests/drawer/test_mpldrawer.py::TestCond::test_cond_fail_with_bad_order[ctrl_wires2-target_wires2] tests/drawer/test_mpldrawer.py::TestCond::test_cond_fail_with_bad_order[ctrl_wires3-target_wires3]