Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you plot a vertical line on a time series plot in Pandas?

  • How do you plot a vertical line (vlines) in a Pandas series plot?
  • I am using Pandas to plot rolling means, etc., and would like to mark important positions with a vertical line.
  • Is it possible to use vlines, or something similar, to accomplish this?
  • In this case, the x axis is datetime.
like image 382
aetodd Avatar asked Oct 06 '13 20:10

aetodd


People also ask

How do you graph a vertical line in a time series?

To create a time series plot, we can use simply apply plot function on time series object and if we want to create a vertical line on that plot then abline function will be used with v argument.

How do you put a vertical line in a plot Python?

By using axvline() In matplotlib, the axvline() method is used to add vertical lines to the plot. The above-used parameters are described as below: x: specify position on the x-axis to plot the line. ymin and ymax: specify the starting and ending range of the line.


4 Answers

plt.axvline(x_position)

It takes the standard plot formatting options (linestlye, color, ect)

(doc)

If you have a reference to your axes object:

ax.axvline(x, color='k', linestyle='--')
like image 128
tacaswell Avatar answered Oct 16 '22 19:10

tacaswell


If you have a time-axis, and you have Pandas imported as pd, you can use:

ax.axvline(pd.to_datetime('2015-11-01'), color='r', linestyle='--', lw=2)

For multiple lines:

xposition = [pd.to_datetime('2010-01-01'), pd.to_datetime('2015-12-31')]
for xc in xposition:
    ax.axvline(x=xc, color='k', linestyle='-')
like image 35
zbinsd Avatar answered Oct 16 '22 18:10

zbinsd


DataFrame plot function returns AxesSubplot object and on it, you can add as many lines as you want. Take a look at the code sample below:

%matplotlib inline

import pandas as pd
import numpy as np

df = pd.DataFrame(index=pd.date_range("2019-07-01", "2019-07-31"))  # for sample data only
df["y"] = np.logspace(0, 1, num=len(df))  # for sample data only

ax = df.plot()
# you can add here as many lines as you want
ax.axhline(6, color="red", linestyle="--")
ax.axvline("2019-07-24", color="red", linestyle="--")

enter image description here

like image 15
Roman Orac Avatar answered Oct 16 '22 18:10

Roman Orac


matplotlib.pyplot.vlines

  • For a time series, the dates for the axis must be proper datetime objects, not strings.
    • Use pandas.to_datetime to convert columns to datetime dtype.
  • Allows for single or multiple locations
  • ymin & ymax are specified as a specific y-value, not as a percent of ylim
  • If referencing axes with something like fig, axes = plt.subplots(), then change plt.xlines to axes.xlines
  • Also see How to draw vertical lines on a given plot
  • Tested in python 3.10, pandas 1.4.2, matplotlib 3.5.1, seaborn 0.11.2

Imports and Sample Data

from datetime import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns  # if using seaborn

# configure synthetic dataframe
df = pd.DataFrame(index=pd.bdate_range(datetime(2020, 6, 8), freq='1d', periods=500).tolist())
df['v'] = np.logspace(0, 1, num=len(df))

# display(df.head())
                   v
2020-06-08  1.000000
2020-06-09  1.004625
2020-06-10  1.009272
2020-06-11  1.013939
2020-06-12  1.018629

Make the initial plot

Using matplotlib.pyplot.plot or matplotlib.axes.Axes.plot

fig, ax = plt.subplots(figsize=(9, 6))
ax.plot('v', data=df, label='v')
ax.set(xlabel='date', ylabel='v')

Using pandas.DataFrame.plot

ax = df.plot(ylabel='v', figsize=(9, 6))

Using seaborn.lineplot

fig, ax = plt.subplots(figsize=(9, 6))
sns.lineplot(data=df, ax=ax)
ax.set(ylabel='v')

Add the vertical lines

  • This should follow any of the 3 methods used to make the plot
y_min = df.v.min()
y_max = df.v.max()

# add x-positions as a list of date strings
ax.vlines(x=['2020-07-14', '2021-07-14'], ymin=y_min, ymax=y_max, colors='purple', ls='--', lw=2, label='vline_multiple')

# add x-positions as a datetime
ax.vlines(x=datetime(2020, 12, 25), ymin=4, ymax=9, colors='green', ls=':', lw=2, label='vline_single')

ax.legend(bbox_to_anchor=(1.04, 0.5), loc="center left")
plt.show()

enter image description here

like image 7
Trenton McKinney Avatar answered Oct 16 '22 18:10

Trenton McKinney