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.
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.
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.
Siehe die Code-Ergänzungen und Erklärungen unten.
Bereiten Sie zwei Daten mit zwei unterschiedlichen Eigenschaften vor. Daten und Daten werden automatisch von leistungsstarken Python-Funktionen generiert.
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.
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.
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.
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.
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.
#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.
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).
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]
Ich werde erklären, wie man die x-Achse bearbeitet.
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. 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
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
plt.subplots_adjust(hspace=0.7,bottom=0.2)
Recommended Posts