# Annotate Matplotlib Chart

This post aims to describe how to add an annotation to a matplotlib chart and show the variations & customizations you can make to the annotation.

## Text

You can annotate any point in your chart with text using the annotate() function. The function parameters used in the example below are:

• text : The text of the annotation
• xy : The point (x,y) to annotate
• xytext : The position (x,y) to place the text at (If None, defaults to xy)
• arrowprops : The properties used to draw an arrow between the positions xy and xytext
# Libraries
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

#Data
df=pd.DataFrame({'x_pos': range(1,101), 'y_pos': np.random.randn(100)*15+range(1,101) })

# Basic chart
plt.plot('x_pos', 'y_pos', data=df,  linestyle='none', marker='o')

# Annotate with text + Arrow
plt.annotate(
# Label and coordinate
'This point is interesting!', xy=(25, 50), xytext=(0, 80),

# Custom arrow
arrowprops=dict(facecolor='black', shrink=0.05))

# Show the graph
plt.show()

## Math

You can add a text of mathematical expression to your plot with text() function:

# Library
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# plot
df=pd.DataFrame({'x_pos': range(1,101), 'y_pos': np.random.randn(100)*15+range(1,101) })
plt.plot( 'x_pos', 'y_pos', data=df, linestyle='none', marker='o')

# Annotation
plt.text(40, 0, r'equation: $\sum_{i=0}^\infty x_i$', fontsize=20)

# Show the graph
plt.show()

## Rectangle

You can use the add_patch() function to add a matplotlib patch to the axes. In the example below, you will see how to add a rectangle. You can see the list of patches here.

# libraries
import matplotlib.patches as patches
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# Data
df=pd.DataFrame({'x_pos': range(1,101), 'y_pos': np.random.randn(100)*15+range(1,101) })

# Plot
fig1 = plt.figure()
ax1.plot( 'x_pos', 'y_pos', data=df, linestyle='none', marker='o')

patches.Rectangle(
(20, 25), # (x,y)
50, # width
50, # height
# You can add rotation as well with 'angle'
alpha=0.3, facecolor="red", edgecolor="black", linewidth=3, linestyle='solid')
)

# Show the graph
plt.show()

## Circle

# Libraries
import matplotlib.patches as patches
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# Data
df=pd.DataFrame({'x_pos': range(1,101), 'y_pos': np.random.randn(100)*15+range(1,101) })

# Plot
fig1 = plt.figure()
ax1.plot( 'x_pos', 'y_pos', data=df, linestyle='none', marker='o')

# Annotation
patches.Circle(
(40, 35),           # (x,y)
alpha=0.3, facecolor="green", edgecolor="black", linewidth=1, linestyle='solid'
)
)

# Show the graph
plt.show()

## Ellipse

# libraries
import matplotlib.patches as patches
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# Data
df=pd.DataFrame({'x_pos': range(1,101), 'y_pos': np.random.randn(100)*15+range(1,101) })

# Plot
fig1 = plt.figure()
ax1.plot( 'x_pos', 'y_pos', data=df, linestyle='none', marker='o')
patches.Ellipse(
(40, 35), # (x,y)
30, # width
100, # height
alpha=0.3, facecolor="green", edgecolor="black", linewidth=1, linestyle='solid'
)
)

# Show the graph
plt.show()

## Segment

In the example below, a line segment is added to the scatterplot by using plot() function. The first function draws the scatterplot and the second one draws a line segment by passing 'solid' as a linestyle parameter.

# Libraries
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# Data
df=pd.DataFrame({'x_pos': range(1,101), 'y_pos': np.random.randn(100)*15+range(1,101) })

# Basic chart
plt.plot( 'x_pos', 'y_pos', data=df, linestyle='none', marker='o')

# Annotation
plt.plot([80, 40], [30, 90], color="skyblue", lw=5, linestyle='solid', label="_not in legend")

# Show the graph
plt.show()

## Vertical and Horizontal Lines

It is possible to add a vertical and horizontal lines to a basic matplotlib chart using the axvline() and the axhline() functions:

# Libraries
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# Data
df=pd.DataFrame({'x_pos': range(1,101), 'y_pos': np.random.randn(100)*15+range(1,101) })

# Plot
plt.plot( 'x_pos', 'y_pos', data=df, linestyle='none', marker='o')

# Annotation
plt.axvline(40, color='r')
plt.axhline(40, color='green')

# Show the graph
plt.show()

## Contact & Edit

👋 This document is a work by Yan Holtz. You can contribute on github, send me a feedback on twitter or subscribe to the newsletter to know when new examples are published! 🔥