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.
aetodd
quelle

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='--')
Tacaswell
quelle
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='-')
zbinsd
quelle
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

Roman Orac
quelle
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

Trenton McKinney
quelle
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