76

I have a figure created in matplotlib (time-series data) over which are a series of

matplotlib.pyplot.axvline

lines. I would like to create labels on the plot that appear close to (probably on the RHS of the line and towards the top of the figure) these vertical lines.

Bakuriu
  • 92,520
  • 20
  • 182
  • 218
tripkane
  • 799
  • 2
  • 7
  • 6

2 Answers2

105

You can use something like

plt.axvline(10)
plt.text(10.1,0,'blah',rotation=90)

you might have to play around with the x and y value in text to get it to align properly. You can find the more complete documentation here.

Dan
  • 11,759
  • 6
  • 38
  • 56
  • 1
    If you want to use data coordinates for the x-axis and axis coordinates for the y-axis, you can place the text at x=10.1 and at 50% of the height using: `ax.text(10.1, 0.5, 'blah', rotation=90, transform=ax.get_xaxis_text1_transform(0)[0])` – Maximilian Mordig Apr 02 '21 at 09:47
  • Link is outdated. – zabop Apr 20 '21 at 19:12
25

A solution without manual placement is to use "blended transformations".

Transformations transform coordinates from one coordinate system to another. By specifying a transformation through the transform parameter of text, you can give the x and y coordinates of the text in the axis coordinate system (going from 0 to 1 from left to right/top to bottom of the x/y axes, respectively). With blended transformations, you can used a mixed coordinate system.

This is exactly what you need: you have the x coordinate given by the data and you want to place the text on the y axes somewhere relative to the axis, say in the center. The code to do this looks like this:

import matplotlib.transforms as transforms
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

# the x coords of this transformation are data, and the
# y coord are axes
trans = ax.get_xaxis_transform()

x = 10
ax.axvline(x)
plt.text(x, .5, 'hello', transform=trans)

plt.show()
Matt Ryall
  • 9,342
  • 5
  • 22
  • 19
ingomueller.net
  • 3,388
  • 2
  • 32
  • 30