Як побудувати вертикальну лінію на графіку часових рядів у Пандах?


81
  • Як побудувати вертикальну лінію ( vlines) у сюжеті серії Pandas?
  • Я використовую Pandas для складання засобів кочення тощо, і я хотів би позначити важливі позиції вертикальною лінією.
  • Чи можна використати vlinesчи щось подібне для цього?
  • У цьому випадку вісь x дорівнює datetime.

Відповіді:


110
plt.axvline(x_position)

Він приймає стандартний графік параметрів форматування ( linestlye, color, тощо)

(doc)

Якщо у вас є посилання на ваш axesоб’єкт:

ax.axvline(x, color='k', linestyle='--')

3
Так, у вас є доступ до осей об'єкт ах = s.plot (), де s є pandas.Series
Joao

42

Якщо у вас є вісь часу, і ви імпортуєте Pandas як pd, ви можете використовувати:

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

Для кількох рядків:

xposition = [pd.to_datetime('2010-01-01'), pd.to_datetime('2015-12-31')]
for xc in xposition:
    ax.axvline(x=xc, color='k', linestyle='-')

У мене 3-денна змова, і все, що я зробив, було: xposition = [pd.to_datetime('01/04/2016'), pd.to_datetime('02/04/2016'),pd.to_datetime('03/04/2016')]тоді for xc in xposition: ax.axvline(x=xc, color='k', linestyle='-'). І я отримав: ValueError: ordinal must be >= 1.. Що не так?
FaCoffee

@FaCoffee, ваші дати в іншому форматі, ніж приклад, наведений у відповіді, хоча я не бачу, як це може змінити ситуацію.
RufusVS

Я хотів би побудувати вертикальну лінію на графіку часового ряду для кожного дня, будь-яка допомога, будь ласка?
Ікбел Бенаб

12

Функція сюжету DataFrame повертає AxesSubplotоб'єкт, і на ньому ви можете додати скільки завгодно рядків. Погляньте на зразок коду нижче:

%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="--")

введіть тут опис зображення


3

matplotlib.pyplot.vlines

  • Для часового ряду дати для осі повинні бути власними об’єктами дати та часу , а не рядками.
    • Використовується pandas.to_datetimeдля перетворення стовпців у datetimedtype.
  • Дозволяє для одного або декількох місць
  • ymin& ymaxвказуються як конкретне значення y, а не як відсотокylim
  • Якщо посилання axesна щось подібне fig, axes = plt.subplots(), то змініть plt.xlinesнаaxes.xlines

plt.plot() & sns.lineplot()

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

plt.style.use('seaborn')  # these plots use this style

# 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))

# plot
plt.plot('v', data=df, color='magenta')

y_min = df.v.min()
y_max = df.v.max()

plt.vlines(x=['2020-07-14', '2021-07-14'], ymin=y_min, ymax=y_max, colors='purple', ls='--', lw=2, label='vline_multiple')
plt.vlines(x=datetime(2021, 9, 14), ymin=4, ymax=9, colors='green', ls=':', lw=2, label='vline_single')
plt.legend(bbox_to_anchor=(1.04, 0.5), loc="center left")
plt.show()

введіть тут опис зображення

df.plot()

df.plot(color='magenta')

ticks, _ = plt.xticks()
print(f'Date format is pandas api format: {ticks}')

y_min = df.v.min()
y_max = df.v.max()

plt.vlines(x=['2020-07-14', '2021-07-14'], ymin=y_min, ymax=y_max, colors='purple', ls='--', lw=2, label='vline_multiple')
plt.vlines(x='2020-12-25', ymin=y_min, ymax=8, colors='green', ls=':', lw=2, label='vline_single')
plt.legend(bbox_to_anchor=(1.04, 0.5), loc="center left")
plt.show()

введіть тут опис зображення

версії пакета

import matplotlib as mpl

print(mpl.__version__)
print(sns.__version__)
print(pd.__version__)

[out]:
3.3.1
0.10.1
1.1.0


Як ви додали сірий фон за допомогою білої сітки? Не можу зрозуміти з коду
blkpingu

1
plt.style.use('seaborn')
Трентон Мак-Кінні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.