Wie zeichnet man eine vertikale Linie auf einem Zeitreihendiagramm in Pandas?


81
  • Wie zeichnet man eine vertikale Linie ( vlines) in einem Pandas-Serienplot?
  • Ich benutze Pandas, um Rollmittel usw. zu zeichnen, und möchte wichtige Positionen mit einer vertikalen Linie markieren.
  • Ist es möglich, dies zu verwenden vlinesoder etwas Ähnliches?
  • In diesem Fall ist die x-Achse datetime.

Antworten:


110
plt.axvline(x_position)

Es nimmt die Standardkurve Formatierungsoptionen ( linestlye, color, ect)

(doc)

Wenn Sie einen Verweis auf Ihr axesObjekt haben:

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

3
Ja, Sie haben Zugriff auf das Achsenobjekt ax = s.plot (), wobei s ein Pandas ist. Serie
Joao

41

Wenn Sie eine Zeitachse haben und Pandas als pd importiert haben, können Sie Folgendes verwenden:

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

Für mehrere Zeilen:

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

Ich habe ein 3-Tage-Grundstück und alles, was ich getan habe, war: xposition = [pd.to_datetime('01/04/2016'), pd.to_datetime('02/04/2016'),pd.to_datetime('03/04/2016')]dann for xc in xposition: ax.axvline(x=xc, color='k', linestyle='-'). Und ich habe : ValueError: ordinal must be >= 1.. Was ist los?
FaCoffee

@FaCoffee, Ihre Daten haben ein anderes Format als das in der Antwort angegebene Beispiel, obwohl ich nicht sehen kann, wie sich das auswirken würde.
RufusVS

Ich möchte für jeden Tag eine vertikale Linie auf einem Zeitreihen-Säulendiagramm zeichnen. Hilfe?
Ikbel Benab

12

Die DataFrame-Plotfunktion gibt ein AxesSubplotObjekt zurück und Sie können so viele Zeilen hinzufügen, wie Sie möchten. Schauen Sie sich das folgende Codebeispiel an:

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

Geben Sie hier die Bildbeschreibung ein


2

matplotlib.pyplot.vlines

  • Für eine Zeitreihe müssen die Daten für die Achse richtige Datums- / Uhrzeitobjekte sein , keine Zeichenfolgen.
    • Verwenden Sie pandas.to_datetimediese datetimeOption , um Spalten in dtype zu konvertieren.
  • Ermöglicht einzelne oder mehrere Standorte
  • ymin& ymaxwerden als spezifischer y-Wert angegeben, nicht als Prozent vonylim
  • Wenn Sie axesmit etwas wie referenzieren fig, axes = plt.subplots(), wechseln Sie plt.xlineszuaxes.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()

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

Paketversionen

import matplotlib as mpl

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

[out]:
3.3.1
0.10.1
1.1.0


Wie haben Sie den grauen Hintergrund mit dem weißen Gitter hinzugefügt? Ich kann es nicht aus dem Code herausfinden
Tobias Kolb

plt.style.use('seaborn')
Trenton McKinney
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.