diff --git a/doc/python/dumbbell-plots.md b/doc/python/dumbbell-plots.md
new file mode 100644
index 0000000000..f3ff1f8dc5
--- /dev/null
+++ b/doc/python/dumbbell-plots.md
@@ -0,0 +1,176 @@
+---
+jupyter:
+ jupytext:
+ notebook_metadata_filter: all
+ text_representation:
+ extension: .md
+ format_name: markdown
+ format_version: '1.3'
+ jupytext_version: 1.14.1
+ kernelspec:
+ display_name: Python 3 (ipykernel)
+ language: python
+ name: python3
+ language_info:
+ codemirror_mode:
+ name: ipython
+ version: 3
+ file_extension: .py
+ mimetype: text/x-python
+ name: python
+ nbconvert_exporter: python
+ pygments_lexer: ipython3
+ version: 3.8.0
+ plotly:
+ description: How to create dumbbell plots in Python with Plotly.
+ display_as: basic
+ language: python
+ layout: base
+ name: Dumbbell Plots
+ order: 19
+ page_type: example_index
+ permalink: python/dumbbell-plots/
+ thumbnail: thumbnail/dumbbell-plot.jpg
+---
+
+## Basic Dumbbell Plot
+
+
+Dumbbell plots are useful for demonstrating change between two sets of data points, for example, the population change for a selection of countries for two different years
+
+In this example, we compare life expectancy in 1952 with life expectancy in 2002 for countries in Europe.
+
+```python
+import plotly.graph_objects as go
+from plotly import data
+
+import pandas as pd
+
+df = data.gapminder()
+df = df.loc[(df.continent == "Europe") & (df.year.isin([1952, 2002]))]
+
+countries = (
+ df.loc[(df.continent == "Europe") & (df.year.isin([2002]))]
+ .sort_values(by=["lifeExp"], ascending=True)["country"]
+ .unique()
+)
+
+data = {"x": [], "y": [], "colors": [], "years": []}
+
+for country in countries:
+ data["x"].extend(
+ [
+ df.loc[(df.year == 1952) & (df.country == country)]["lifeExp"].values[0],
+ df.loc[(df.year == 2002) & (df.country == country)]["lifeExp"].values[0],
+ None,
+ ]
+ )
+ data["y"].extend([country, country, None]),
+ data["colors"].extend(["green", "blue", "brown"]),
+ data["years"].extend(["1952", "2002", None])
+
+fig = go.Figure(
+ data=[
+ go.Scatter(
+ x=data["x"],
+ y=data["y"],
+ mode="lines",
+ marker=dict(
+ color="grey",
+ ),
+ ),
+ go.Scatter(
+ x=data["x"],
+ y=data["y"],
+ mode="markers+text",
+ marker=dict(
+ color=data["colors"],
+ size=10,
+ ),
+ hovertemplate="""Country: %{y}
Life Expectancy: %{x}
""",
+ ),
+ ]
+)
+
+fig.update_layout(
+ title="Life Expectancy in Europe: 1952 and 2002",
+ width=1000,
+ height=1000,
+ showlegend=False,
+)
+
+fig.show()
+
+```
+
+## Dumbbell Plot with Arrow Markers
+
+*Note: The `arrow`, `angleref`, and `standoff` properties used on the `marker` in this example are new in 5.11*
+
+In this example, we add arrow markers to the plot. The first trace adds the lines connecting the data points and arrow markers.
+The second trace adds circle markers. On the first trace, we use `standoff=8` to position the arrow marker back from the data point.
+For the arrow marker to point directly at the circle marker, this value should be half the circle marker size.
+
+```python
+import pandas as pd
+import plotly.graph_objects as go
+from plotly import data
+
+df = data.gapminder()
+df = df.loc[(df.continent == "Europe") & (df.year.isin([1952, 2002]))]
+
+countries = (
+ df.loc[(df.continent == "Europe") & (df.year.isin([2002]))]
+ .sort_values(by=["lifeExp"], ascending=True)["country"]
+ .unique()
+)
+
+data = {"x": [], "y": [], "colors": [], "years": []}
+
+for country in countries:
+ data["x"].extend(
+ [
+ df.loc[(df.year == 1952) & (df.country == country)]["lifeExp"].values[0],
+ df.loc[(df.year == 2002) & (df.country == country)]["lifeExp"].values[0],
+ None,
+ ]
+ )
+ data["y"].extend([country, country, None]),
+ data["colors"].extend(["silver", "lightskyblue", "white"]),
+ data["years"].extend(["1952", "2002", None])
+
+fig = go.Figure(
+ data=[
+ go.Scatter(
+ x=data["x"],
+ y=data["y"],
+ mode="markers+lines",
+ marker=dict(
+ symbol="arrow", color="black", size=16, angleref="previous", standoff=8
+ ),
+ ),
+ go.Scatter(
+ x=data["x"],
+ y=data["y"],
+ text=data["years"],
+ mode="markers",
+ marker=dict(
+ color=data["colors"],
+ size=16,
+ ),
+ hovertemplate="""Country: %{y}
Life Expectancy: %{x}
Year: %{text}
""",
+ ),
+ ]
+)
+
+fig.update_layout(
+ title="Life Expectancy in Europe: 1952 and 2002",
+ width=1000,
+ height=1000,
+ showlegend=False,
+)
+
+
+fig.show()
+
+```