Formatieren und Anzeigen von Zeitreihendaten mit verschiedenen Maßstäben und Einheiten mit Python oder Matplotlib

Sie müssen sich nicht um die grafische Darstellung von Zeitreihendaten aus einer Hand kümmern. Da ich jedoch nicht wusste, wie Zeitreihendaten aus verschiedenen Quellen angezeigt werden sollen, habe ich es versucht. Zusammenfassend habe ich das gewünschte Ergebnis erzielt, aber es ist nicht gut genug.

Das Ergebnis ist unangenehm. Bitte lassen Sie mich wissen, ob es einen intelligenteren Weg gibt.

Was Sie tun möchten und Herausforderungen

Als Beispiel

Es ist wie es ist. Es ist einfach, alle Daten anzuzeigen, aber es ist umständlich, wenn der Erfassungszeitraum und die Einheiten (Anzahl der Fälle,% usw.) unterschiedlich sind.

Unter hier erfahren Sie zunächst, wie Sie Daten von DB oder CSV abrufen können.

Matplotlib Grundlagen

Bevor ich über die Details spreche, bin ich an Matploglib überhaupt nicht gewöhnt, also werde ich einen kurzen Blick darauf werfen. Der einfachste Code sieht folgendermaßen aus: Es ist einfacher, keine Nebenhandlung zu verwenden, aber ich wage es, sie in eine Nebenhandlung (eine Beschreibung zur Steuerung mehrerer Figuren) zu schreiben, um die Kompatibilität der folgenden Beschreibung zu gewährleisten.

#coding:utf-8
import matplotlib.pyplot as plt

#Eine leere Leinwand? Generieren Sie a
fig = plt.figure()
#Bereiten Sie einen Bereich vor, um die erste Figur in 1 Zeile und 1 Spalte zu zeichnen
ax = fig.add_subplot(1,1,1)

#Daten vorbereiten Die Anzahl von x und y muss übereinstimmen
x = [0,1,2,3,4,5]
y = [54,35,32,44,74,45]

#Daten einstellen (Plot)
ax.plot(x,y)

#Abbildung zeigen
plt.show()

Nun, es sieht normal aus.

plt

Siehe die Code-Ergänzungen und Erklärungen unten.

Bestätigung von Problemen

Bereiten Sie zwei Daten mit zwei unterschiedlichen Eigenschaften vor. Daten und Daten werden automatisch von leistungsstarken Python-Funktionen generiert.

Daten 1

Tägliche Daten vom 2. Juni 2016 bis 7. Juni 2016. Die Anzahl der Daten beträgt 6.

#coding:utf-8

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

#0-Erstellen Sie eine Liste mit 6 Elementen, indem Sie Zufallszahlen zwischen 100 generieren
y1 = np.random.randint(0,100,6)
#2016-06-02 00:00:Generieren Sie eine tägliche Datums- und Uhrzeitangabe ab 00(Generieren Sie 6)
x1 = pd.date_range('2016-06-02 00:00:00',periods=6,freq='d')

ax.plot(x1,y1)

plt.show()

So was.

plt

Daten 2

Stündliche Daten vom 3. Juni 2016 bis 9. Juni 2016. Die Anzahl der Daten beträgt 150.

#coding:utf-8

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

#5-Generieren Sie eine Liste mit 150 Elementen, indem Sie Zufallszahlen zwischen 40 generieren
y2 = np.random.randint(5,40,150)
#2016-06-03 12:00:Generieren Sie stündlich ab 00 eine Datums- und Uhrzeitangabe(150 Stück erzeugt)
x2= pd.date_range('2016-06-03 12:00:00',periods=150,freq='H')

ax.plot(x2,y2)

plt.show()

Da es sich um eine stündliche Einheit handelt, fühlt es sich intensiver an als Daten 1.

plt

Obwohl die beiden oben genannten Daten einen bestimmten Zeitraum haben, weisen sie unterschiedliche Erfassungszeiträume und -eigenschaften auf. Zumindest möchte ich die Zeitachse (x-Achse) zusammen anzeigen.

Anzeige vorerst

Ich werde es vorerst anzeigen.

#coding:utf-8

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

fig = plt.figure()
#Sichern Sie sich einen Platz zum Zeichnen eines 2-mal-1-Diagramms
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)

#data1
y1 = np.random.randint(0,100,6)
x1 = pd.date_range('2016-06-02 00:00:00',periods=6,freq='d')

#data2
y2 = np.random.randint(5,40,150)
x2 = pd.date_range('2016-06-03 12:00:00',periods=150,freq='H')

#plot
ax1.plot(x1,y1)
ax2.plot(x2,y2)

plt.show()

Es sieht so aus, aber die Zeitreihen stimmen nicht überein, und die Grafik ist praktisch bedeutungslos.

plt

Wie soll man antworten

Widerwillig

Ich habe verschiedene Dinge ausprobiert. Für mich als Python-Anfänger sind die folgenden Grenzen vorerst die folgenden. Dummy-Daten (in diesem Fall x0, y0), die für beide Daten eine gemeinsame Einheit darstellen, werden generiert und verwendet.

Hier habe ich versucht, die Daten von 6/1 bis 6/10 zu verwenden.

#coding:utf-8

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

fig = plt.figure()
#Sichern Sie sich einen Platz zum Zeichnen eines 2-mal-1-Diagramms
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)

#data0 Generiert Dummy-Daten als Referenz
#Liste mit 10 0 Werten für y
#Der Wert von x ist 6/1 ~ 6/Datumszeit bis zu 10
y0 = [0]*10
x0 = pd.date_range('2016-06-01 00:00:00',periods=10,freq='d')

#data1
y1 = np.random.randint(0,100,6)
x1 = pd.date_range('2016-06-02 00:00:00',periods=6,freq='d')

#data2
y2 = np.random.randint(5,40,150)
x2 = pd.date_range('2016-06-03 12:00:00',periods=150,freq='H')

#plot
#ax1
ax1.plot(x0,y0)
ax1.plot(x1,y1)
#ax2
ax2.plot(x0,y0)
ax2.plot(x2,y2)

plt.show()

Anscheinend ist die Zeitachse korrekt, aber aufgrund der Beschriftungen ist sie schwer zu erkennen.

plt

Passen Sie das Erscheinungsbild an

#coding:utf-8

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime as dt

fig = plt.figure()
#Sichern Sie sich einen Platz zum Zeichnen eines 2-mal-1-Diagramms
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)

#data0
y0 = [0]*10
x0 = pd.date_range('2016-06-01 00:00:00',periods=10,freq='d')

#data1
y1 = np.random.randint(0,100,6)
x1 = pd.date_range('2016-06-02 00:00:00',periods=6,freq='d')

#data2
y2 = np.random.randint(5,40,150)
x2 = pd.date_range('2016-06-03 12:00:00',periods=150,freq='H')

#plot
#ax1
ax1.plot(x0,y0)
ax1.plot(x1,y1,'r')
#ax2
ax2.plot(x0,y0)
ax2.plot(x2,y2,'b')

#Gestaltung
#ax1
ax1.set_xticks(x0)
ax1.set_xticklabels(x0,rotation=90,size="small")
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
ax1.grid()
#ax2
ax2.set_xticks(x0)
ax2.set_xticklabels(x0,rotation=90,size="small")
ax2.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
ax2.grid()

#Verhindert, dass vertikale Untertitel abgedeckt werden
plt.subplots_adjust(hspace=0.7,bottom=0.2)

plt.show()

Die Beschriftung ist vertikal und nur das Datum wird angezeigt. Ich habe auch die Farbe des Diagramms geändert. Persönlich ist das genug.

plt

In einem Diagramm zusammenführen

In vielen Fällen ist es nicht erforderlich, es in zwei Diagramme zu unterteilen. Versuchen Sie daher, sie in einem Diagramm anzuzeigen.

#coding:utf-8

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime as dt

fig = plt.figure()
#1 Zeile 1 Säulendiagramm
ax1 = fig.add_subplot(1,1,1)
#Ebene hinzufügen (wie?)
ax2 = ax1.twinx()

#data0
y0 = [0]*10
x0 = pd.date_range('2016-06-01 00:00:00',periods=10,freq='d')

#data1
y1 = np.random.randint(0,100,6)
x1 = pd.date_range('2016-06-02 00:00:00',periods=6,freq='d')

#data2
y2 = np.random.randint(5,40,150)
x2 = pd.date_range('2016-06-03 12:00:00',periods=150,freq='H')

#plot
#ax1
ax1.plot(x0,y0)
ax1.plot(x1,y1,'r')

#ax2
ax2.plot(x0,y0)
ax2.plot(x2,y2,'b')

#Gestaltung
#ax1
ax1.set_xticks(x0)
ax1.set_xticklabels(x0,rotation=90,size="small")
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
ax1.grid()
#Anpassung des Achsenformats
ax1.set_ylabel('pv', color='r')
for tl in ax1.get_yticklabels():
    tl.set_color('r')
#ax2
ax2.set_xticks(x0)
ax2.set_xticklabels(x0,rotation=90,size="small")
ax2.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
ax2.grid()
#Anpassung des Achsenformats
ax2.set_ylabel('cpu', color='b')
for tl in ax2.get_yticklabels():
    tl.set_color('b')

#Verhindert, dass vertikale Untertitel abgedeckt werden
plt.subplots_adjust(hspace=0.7,bottom=0.2)

plt.show()

Nun, es sieht so aus. Ich habe die Farbe der Achse geändert, um leichter zu verstehen, um welche Daten es sich handelt (obwohl es schwer zu verstehen ist).

plt

Ergänzung / Erklärung

Konvertierung von Zeichenfolge zu Datum / Uhrzeit

Im obigen Beispiel wurden x-Daten von date_range () von Pandas generiert, es handelt sich also von Anfang an um einen Datums- / Uhrzeittyp. Wenn sie jedoch von CSV oder DB abgerufen werden, handelt es sich um eine Zeichenfolge. Es scheint, dass sogar eine Zeichenfolge so gut verarbeitet werden kann, wie sie ist, aber sie wird bei Bedarf in datetime konvertiert.

Die Konvertierung von der Zeichenfolgenliste in die Datums- / Uhrzeitliste erfolgt wie folgt.

y1 = [0.43,0.26,0.33]
d1 = ['2016-06-21 12:00:00','2016-06-23 09:00:00','2016-06-26 18:00:00']
x1 = [dt.datetime.strptime(d,'%Y-%m-%d %H:%M:%S') for d in d1]

Bearbeiten der Achse (X-Achse)

Ich werde erklären, wie man die x-Achse bearbeitet.

Entscheiden Sie, wo die Beschriftung abgelegt werden soll

Es ist etwas schwierig zu verstehen, ob es sich um ein Datum handelt. Wenn die horizontale Achse jedoch 0 bis 1000 beträgt und Sie die Einheit nur an drei Stellen mit 300, 600 und 900 anzeigen möchten, verwenden Sie set_xticks ([300.600.900]).

Hier möchte ich täglich von 6/1 bis 6/10 Untertitel einfügen, damit x0, das vom Dummy generiert wird, so ersetzt wird, wie es ist.

ax1.set_xticks(x0)

ax1.set_xticklabels(x0,rotation=90,size="small")

ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))

Nachdem Sie entschieden haben, wo die Beschriftung abgelegt werden soll, müssen Sie im nächsten Schritt den Anzeigeinhalt, das Anzeigeformat usw. festlegen. Im obigen Beispiel lautet die Position beispielsweise set_xticks ([300.600.900]). Wenn Sie sie jedoch auf dem Display auf klein, mittel oder groß einstellen möchten, setzen Sie set_xticklabels (['klein', 'mittel', 'groß']). Sie können die Neigung des Zeichens mit Drehung festlegen. Wenn es 90 ist, wird es vertikal sein. Die Größe bleibt gleich. Hier möchten wir die Daten von 6/1 bis 6/10 so anzeigen, wie sie sind, also ersetzen wir x0 so wie sie sind. Weitere Anpassung des Anzeigeformats Wenn x0 normal angezeigt wird, werden das ganze Jahr, der Monat, der Tag, die Stunde, die Minute und die Sekunde angezeigt und es ist lang, sodass nur das Jahr, der Monat und der Tag angezeigt werden....

Nachdem Sie entschieden haben, wo die Beschriftung abgelegt werden soll, müssen Sie im nächsten Schritt den Anzeigeinhalt, das Anzeigeformat usw. festlegen. Im obigen Beispiel lautet die Position beispielsweise set_xticks ([300.600.900]). Wenn Sie sie jedoch auf dem Display auf klein, mittel oder groß einstellen möchten, setzen Sie set_xticklabels (['klein', 'mittel', 'groß']). Sie können die Neigung des Zeichens mit Drehung festlegen. Wenn es 90 ist, wird es vertikal sein. Die Größe bleibt gleich. Hier möchten wir die Daten von 6/1 bis 6/10 so anzeigen, wie sie sind, also ersetzen wir x0 so wie sie sind. Weitere Anpassung des Anzeigeformats Wenn x0 normal angezeigt wird, werden das ganze Jahr, der Monat, der Tag, die Stunde, die Minute und die Sekunde angezeigt und es ist lang, sodass nur das Jahr, der Monat und der Tag angezeigt werden. Farbe hinzufügen

Nachdem Sie entschieden haben, wo die Beschriftung abgelegt werden soll, müssen Sie im nächsten Schritt den Anzeigeinhalt, das Anzeigeformat usw. festlegen. Im obigen Beispiel lautet die Position beispielsweise set_xticks ([300.600.900]). Wenn Sie sie jedoch auf dem Display auf klein, mittel oder groß einstellen möchten, setzen Sie set_xticklabels (['klein', 'mittel', 'groß']). Sie können die Neigung des Zeichens mit Drehung festlegen. Wenn es 90 ist, wird es vertikal sein. Die Größe bleibt gleich. Hier möchten wir die Daten von 6/1 bis 6/10 so anzeigen, wie sie sind, also ersetzen wir x0 so wie sie sind. Weitere Anpassung des Anzeigeformats Wenn x0 normal angezeigt wird, werden das ganze Jahr, der Monat, der Tag, die Stunde, die Minute und die Sekunde angezeigt und es ist lang, sodass nur das Jahr, der Monat und der Tag angezeigt werden. Farbe hinzufügen

ax1.plot(x1,y1,'r')

Nachdem Sie entschieden haben, wo die Beschriftung abgelegt werden soll, müssen Sie im nächsten Schritt den Anzeigeinhalt, das Anzeigeformat usw. festlegen. Im obigen Beispiel lautet die Position beispielsweise set_xticks ([300.600.900]). Wenn Sie sie jedoch auf dem Display auf klein, mittel oder groß einstellen möchten, setzen Sie set_xticklabels (['klein', 'mittel', 'groß']). Sie können die Neigung des Zeichens mit Drehung festlegen. Wenn es 90 ist, wird es vertikal sein. Die Größe bleibt gleich. Hier möchten wir die Daten von 6/1 bis 6/10 so anzeigen, wie sie sind, also ersetzen wir x0 so wie sie sind. Weitere Anpassung des Anzeigeformats Wenn x0 normal angezeigt wird, werden das ganze Jahr, der Monat, der Tag, die Stunde, die Minute und die Sekunde angezeigt und es ist lang, sodass nur das Jahr, der Monat und der Tag angezeigt werden. Farbe hinzufügen

Nachdem Sie entschieden haben, wo die Beschriftung abgelegt werden soll, müssen Sie im nächsten Schritt den Anzeigeinhalt, das Anzeigeformat usw. festlegen. Im obigen Beispiel lautet die Position beispielsweise set_xticks ([300.600.900]). Wenn Sie sie jedoch auf dem Display auf klein, mittel oder groß einstellen möchten, setzen Sie set_xticklabels (['klein', 'mittel', 'groß']). Sie können die Neigung des Zeichens mit Drehung festlegen. Wenn es 90 ist, wird es vertikal sein. Die Größe bleibt gleich. Hier möchten wir die Daten von 6/1 bis 6/10 so anzeigen, wie sie sind, also ersetzen wir x0 so wie sie sind. Weitere Anpassung des Anzeigeformats Wenn x0 normal angezeigt wird, werden das ganze Jahr, der Monat, der Tag, die Stunde, die Minute und die Sekunde angezeigt und es ist lang, sodass nur das Jahr, der Monat und der Tag angezeigt werden. Farbe hinzufügen

ax2.set_ylabel('cpu', color='b')
for tl in ax2.get_yticklabels():
    tl.set_color('b')

Nachdem Sie entschieden haben, wo die Beschriftung abgelegt werden soll, müssen Sie im nächsten Schritt den Anzeigeinhalt, das Anzeigeformat usw. festlegen. Im obigen Beispiel lautet die Position beispielsweise set_xticks ([300.600.900]). Wenn Sie sie jedoch auf dem Display auf klein, mittel oder groß einstellen möchten, setzen Sie set_xticklabels (['klein', 'mittel', 'groß']). Sie können die Neigung des Zeichens mit Drehung festlegen. Wenn es 90 ist, wird es vertikal sein. Die Größe bleibt gleich. Hier möchten wir die Daten von 6/1 bis 6/10 so anzeigen, wie sie sind, also ersetzen wir x0 so wie sie sind. Weitere Anpassung des Anzeigeformats Wenn x0 normal angezeigt wird, werden das ganze Jahr, der Monat, der Tag, die Stunde, die Minute und die Sekunde angezeigt und es ist lang, sodass nur das Jahr, der Monat und der Tag angezeigt werden. Farbe hinzufügen

Nachdem Sie entschieden haben, wo die Beschriftung abgelegt werden soll, müssen Sie im nächsten Schritt den Anzeigeinhalt, das Anzeigeformat usw. festlegen. Im obigen Beispiel lautet die Position beispielsweise set_xticks ([300.600.900]). Wenn Sie sie jedoch auf dem Display auf klein, mittel oder groß einstellen möchten, setzen Sie set_xticklabels (['klein', 'mittel', 'groß']). Sie können die Neigung des Zeichens mit Drehung festlegen. Wenn es 90 ist, wird es vertikal sein. Die Größe bleibt gleich. Hier möchten wir die Daten von 6/1 bis 6/10 so anzeigen, wie sie sind, also ersetzen wir x0 so wie sie sind. Weitere Anpassung des Anzeigeformats Wenn x0 normal angezeigt wird, werden das ganze Jahr, der Monat, der Tag, die Stunde, die Minute und die Sekunde angezeigt und es ist lang, sodass nur das Jahr, der Monat und der Tag angezeigt werden. Farbe hinzufügen

plt.subplots_adjust(hspace=0.7,bottom=0.2)

Recommended Posts

Formatieren und Anzeigen von Zeitreihendaten mit verschiedenen Maßstäben und Einheiten mit Python oder Matplotlib
Zeichnen Sie Zeitreihendaten in Python mit Pandas und Matplotlib
Zeichnen Sie die CSV von Zeitreihendaten mit einem Unixtime-Wert in Python (matplotlib).
[Python] Zeichnen Sie Zeitreihendaten
[Python] Lesen Sie die CSV-Datei und zeigen Sie die Abbildung mit matplotlib an
"Zeitreihenanalyse von Wirtschafts- und Finanzdaten messen" Das Problem am Ende des Kapitels mit Python lösen
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Über Zeitreihendaten und Übertraining
Beim Zeichnen von Zeitreihendaten und Abrufen von matplotlib OverflowError
Vorhersage von Zeitreihendaten durch Simplex-Projektion
Datenpipeline-Aufbau mit Python und Luigi
Berechnen Sie das Standardgewicht und zeigen Sie es mit Python an
Vorhersage von Zeitreihendaten mit einem neuronalen Netzwerk
OpenFOAM-Zeitreihendaten lesen und Daten einstellen
Zeichnen Sie mit Pythons Matplotlib mehrere Karten und Daten gleichzeitig
Führen Sie Raw SQL mit Redash unter Verwendung der Python-Datenquelle aus und zeigen Sie das Ergebnis an
Holen Sie sich mit Python Zeitreihendaten von k-db.com
Lesen Sie Python-CSV-Daten mit Pandas ⇒ Graph mit Matplotlib
Empfangen und Anzeigen von HTML-Formulardaten in Python
Interaktive Anzeige algebraischer Kurven in Python, Jupyter
[Python] Konvertierungsnotiz zwischen Zeitdaten und numerischen Daten
Implementieren Sie "Data Visualization Design # 3" mit Pandas und Matplotlib
Glättung von Zeitreihen und Wellenformdaten 3 Methoden (Glättung)
Zeigen Sie Details zu Zeitreihendaten mit Remotte an
[Python] Konvertiert die Zeitanzeige (str-Typ) mit "" "und" '"in Sekunden (float-Typ) mit datetime und timedelta
Ich habe ein gestapeltes Balkendiagramm mit matplotlib von Python erstellt und eine Datenbeschriftung hinzugefügt
Implementierung der Clustering-K-Form-Methode für Zeitreihendaten [Unüberwachtes Lernen mit Python Kapitel 13]
"Abrufen von Zeitreihendaten von k-db.com mit Python" Memo zur Erstellung der Programmumgebung
Extrahieren Sie "Nur aktuelles Datum" und "Aktuelles Datum und Uhrzeit" mit Python datetime.
Lesen und analysieren Sie den Datensatz im Arff-Format mit python scipy.io
Lesen Sie die json-Datei mit Python, formatieren Sie sie und geben Sie json aus
Anzeigen und Aufnehmen von Webkamerabildern mit Python Kivy [GUI]
[Zeitreihen mit Handlung] Dynamische Visualisierung mit Handlung [Python, Aktienkurs]
Untersuchen Sie den Java- und Python-Datenaustausch mit Apache Arrow
Ich habe die gleiche Datenanalyse mit kaggle notebook (python) und PowerBI gleichzeitig versucht ②
Ich habe die gleiche Datenanalyse mit kaggle notebook (python) und PowerBI gleichzeitig versucht ①
Datenanalyse mit Python 2
Python: Zeitreihenanalyse
Python-Zeitreihenfrage
Heatmap von Python + matplotlib
Datenanalyse mit Python
TOPIX-Zeitreihen anzeigen
Zeitreihendiagramm / Matplotlib
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Führen Sie mit Python und Matplotlib eine Isostromanalyse offener Wasserkanäle durch
Hinweise zum Importieren von Daten aus MySQL oder CSV mit Python
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
Befreien Sie sich mit Python und regulären Ausdrücken von schmutzigen Daten
Formatieren Sie die Zeitachse des Pandas-Zeitreihendiagramms mit matplotlib neu
Löse das Spiralbuch (Algorithmus und Datenstruktur) mit Python!
[Python] Zeigt die verstrichene Zeit in Stunden, Minuten und Sekunden an (00:00:00)
Diesmal habe ich mit Prorate Python III und IV gelernt
Holen Sie sich zusätzliche Daten zu LDAP mit Python (Writer und Reader)