Plotten der Zeit in Python mit Matplotlib

163

Ich habe ein Array von Zeitstempeln im Format (HH: MM: SS.mmmmmm) und ein weiteres Array von Gleitkommazahlen, die jeweils einem Wert im Zeitstempel-Array entsprechen.

Kann ich mit Matplotlib die Zeit auf der x-Achse und die Zahlen auf der y-Achse zeichnen?

Ich habe es versucht, aber irgendwie akzeptierte es nur Anordnungen von Schwimmern. Wie kann ich es dazu bringen, die Zeit zu zeichnen? Muss ich das Format in irgendeiner Weise ändern?

zufälliger Gedanke
quelle

Antworten:

178

Sie müssen zuerst Ihre Zeitstempel in Python- datetimeObjekte konvertieren (verwenden datetime.strptime). Verwenden Sie dann date2num, um die Daten in das Matplotlib-Format zu konvertieren.

Zeichnen Sie die Daten und Werte mit plot_date:

dates = matplotlib.dates.date2num(list_of_datetimes)
matplotlib.pyplot.plot_date(dates, values)
Codeape
quelle
2
Wird das Datum oder nur die Uhrzeit aufgezeichnet? Ich möchte nur die Zeit, da bei der Konvertierung in datetime das Jahr auf 1990 eingestellt ist.
randomThought
"... bei der Konvertierung in datetime wird das Jahr auf 1990 gesetzt": Könnten Sie bitte den Code veröffentlichen, den Sie für die Konvertierung von Zeichenfolge in datetime verwenden? Bei der Konvertierung könnte etwas nicht stimmen. Re. Informationen zur Formatierung von Diagrammbeschriftungen finden Sie unter dem Link date_demo1 von JK Seppänen. Die Dokumentation zu matplot lib ist übrigens ausgezeichnet. matplotlib.sourceforge.net/index.html
codeape
14
plot_dates -> matplotlib.pyplot.plot_date (Daten, Werte)
Pete
3
Was ist mit einem Streudiagramm? Ich möchte ein Größenarray bereitstellen, um die Größe der Streublasen zu bestimmen, aber es gibt kein Äquivalent scatter_date()und keinen offensichtlichen / direkten Weg, um dieses Diagramm zu erhalten.
Dwanderson
4
Das Obige gibt eine Liste mit einem Objekt vom Typ zurück: matplotlib.lines.Line2D Objekt. Wie verwende ich dies nun, um das Diagramm anzuzeigen?
Arindam Roychowdhury
87

Sie können die Zeitstempel-Wertepaare auch mit pyplot.plot zeichnen (nachdem Sie sie aus ihrer Zeichenfolgendarstellung analysiert haben). (Getestet mit den Matplotlib-Versionen 1.2.0 und 1.3.1.)

Beispiel:

import datetime
import random
import matplotlib.pyplot as plt

# make up some data
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.plot(x,y)
# beautify the x-labels
plt.gcf().autofmt_xdate()

plt.show()

Ergebnisbild:

Liniendiagramm


Hier ist das gleiche wie bei einem Streudiagramm:

import datetime
import random
import matplotlib.pyplot as plt

# make up some data
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.scatter(x,y)
# beautify the x-labels
plt.gcf().autofmt_xdate()

plt.show()

Erzeugt ein ähnliches Bild:

Streudiagramm

moooeeeep
quelle
4
@andi es sollte genauso funktionieren wie in meinem Beispiel (ändern plotzu scatter).
Moooeeeep
1
Ich verstehe nicht, warum dies die fünfte Frage ist, auf die ich gestoßen bin, bei der niemand tatsächlich versucht hat , ein Streudiagramm zu verwenden - es funktioniert nicht. Type Error - invalid type promotion.
Dwanderson
1
@dwanderson Dann machst du vielleicht etwas falsch. Ich habe datetime.datetimemeinem Beitrag ein Beispiel für das Streudiagramm mit Objekten auf der x-Achse hinzugefügt .
Moooeeeep
Für das Gitter hinzufügenplt.grid(True)
Christophe Roussy
1
@AimForClarity Funktioniert für mich mit matplotlib.__version__2.2.2. Für das Streudiagramm sind jedoch standardmäßig einige zu breite x-Grenzwerte festgelegt. Diese Antwort scheint eine andere Problemumgehung als die manuelle Anpassung zu bieten plt.xlim(...): stackoverflow.com/a/46467896/1025391
moooeeeep
23

7 Jahre später und dieser Code hat mir geholfen. Meine Zeiten wurden jedoch immer noch nicht richtig angezeigt.

Geben Sie hier die Bildbeschreibung ein

Mit Matplotlib 2.0.0 und ich musste das folgende Codebit aus dem Bearbeiten der Datumsformatierung von x-Achsen-Tick-Labels in matplotlib von Paul H. hinzugefügt werden.

import matplotlib.dates as mdates
myFmt = mdates.DateFormatter('%d')
ax.xaxis.set_major_formatter(myFmt)

Ich habe das Format auf (% H:% M) geändert und die Uhrzeit korrekt angezeigt. Geben Sie hier die Bildbeschreibung ein

Alles dank der Community.

GeorgeLPerkins
quelle
16

Ich hatte Probleme damit mit matplotlib Version: 2.0.2. Wenn ich das Beispiel von oben ausführe, habe ich einen zentrierten, gestapelten Satz Blasen erhalten.

Grafik mit zentriertem Blasenstapel

Ich habe das Problem durch Hinzufügen einer weiteren Zeile "behoben":

plt.plot([],[])

Das gesamte Code-Snippet wird zu:

import datetime
import random
import matplotlib.pyplot as plt
import matplotlib.dates as mdates


# make up some data
x = [datetime.datetime.now() + datetime.timedelta(minutes=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.plot([],[])
plt.scatter(x,y)

# beautify the x-labels
plt.gcf().autofmt_xdate()
myFmt = mdates.DateFormatter('%H:%M')
plt.gca().xaxis.set_major_formatter(myFmt)

plt.show()
plt.close()

Dies erzeugt ein Bild mit den Blasen, die wie gewünscht verteilt sind.

Grafik mit über die Zeit verteilten Blasen

Kirche
quelle
Funktioniert bei py2.6 nicht für mich. Ich erhalte ValueError: Das Ansichtslimit mindestens -0.05500000000000001 ist kleiner als 1 und ein ungültiger Matplotlib-Datumswert. Dies passiert häufig, wenn Sie einen Nicht-Datums- / Uhrzeitwert an eine Achse mit Datums- / Uhrzeiteinheiten <Abbildung Größe 432x288 mit 1 Achsen> übergeben
AimForClarity
Eine Lösung für die seltsamen x-lims besteht darin, sie selbst einzustellen
Qaswed