Vous n'avez pas à vous soucier de la représentation graphique des données de séries chronologiques à partir d'une seule source. Cependant, je ne savais pas comment afficher des données de séries chronologiques provenant de différentes sources, alors j'ai essayé. De la conclusion, j'ai obtenu le résultat que je voulais, mais ce n'est pas assez bon.
Le résultat est désagréable, alors faites-moi savoir s'il existe un moyen plus intelligent.
Par exemple
C'est comme ça. Il est facile d'afficher chaque donnée, mais c'est gênant si la période d'acquisition et les unités (nombre de cas,%, etc.) sont différentes.
Veuillez consulter ici pour savoir comment obtenir des données à partir de DB ou CSV en premier lieu.
Avant de parler des détails, je ne suis pas habitué à Matploglib en premier lieu, je vais donc y jeter un coup d'œil. Le code le plus simple ressemble à ceci: C'est plus simple sans utiliser de subplot, mais j'ose l'écrire dans subplot (une description pour contrôler plusieurs figures) pour la compatibilité de la description suivante.
#coding:utf-8
import matplotlib.pyplot as plt
#Une toile vierge? Générer un
fig = plt.figure()
#Préparez une zone pour dessiner la première figure sur 1 ligne et 1 colonne
ax = fig.add_subplot(1,1,1)
#Préparer les données Le nombre de x et y doit correspondre
x = [0,1,2,3,4,5]
y = [54,35,32,44,74,45]
#Définir les données (tracé)
ax.plot(x,y)
#Afficher la figure
plt.show()
Eh bien, ça a l'air normal.
Voir les compléments de code et les explications en bas.
Préparez deux données avec deux propriétés différentes. Les données et les dates sont automatiquement générées par de puissantes fonctions Python.
Données quotidiennes du 2 juin 2016 au 7 juin 2016. Le nombre de données est de 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-Créez une liste de 6 éléments en générant des nombres aléatoires entre 100
y1 = np.random.randint(0,100,6)
#2016-06-02 00:00:Générer une date / heure quotidienne à partir de 00(Générer 6)
x1 = pd.date_range('2016-06-02 00:00:00',periods=6,freq='d')
ax.plot(x1,y1)
plt.show()
Comme ça.
Données horaires du 3 juin 2016 au 9 juin 2016. Le nombre de données est de 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-Générez une liste de 150 éléments en générant des nombres aléatoires entre 40
y2 = np.random.randint(5,40,150)
#2016-06-03 12:00:Générer datetime toutes les heures à partir de 00(150 pièces générées)
x2= pd.date_range('2016-06-03 12:00:00',periods=150,freq='H')
ax.plot(x2,y2)
plt.show()
Comme il s'agit d'une unité horaire, cela semble plus intense que les données 1.
Bien que les deux données ci-dessus aient une période de temps, elles ont des périodes d'acquisition et des propriétés différentes. Au minimum, je souhaite afficher ensemble l'axe des temps (axe des x).
Je vais l'afficher pour le moment.
#coding:utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig = plt.figure()
#Sécurisez un endroit pour dessiner un diagramme 2 en 1
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()
Cela ressemble à ça, mais la série chronologique ne correspond pas et le graphique n'a pratiquement aucun sens.
J'ai essayé différentes choses.Pour moi, débutant en Python, voici les limites pour le moment. Des données factices (x0, y0 dans ce cas), qui sont une unité commune aux deux données, sont générées et utilisées.
Ici, j'ai essayé d'utiliser les données du 6/1 au 6/10.
#coding:utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig = plt.figure()
#Sécurisez un endroit pour dessiner un diagramme 2 en 1
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)
#data0 Générer des données factices comme référence
#Liste contenant 10 0 valeurs pour y
#La valeur de x est 6/1 ~ 6/Datetime jusqu'à 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()
Apparemment, l'axe des temps est correct, mais il est difficile à voir à cause des légendes.
#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()
#Sécurisez un endroit pour dessiner un diagramme 2 en 1
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')
#Façonner
#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()
#Empêche la couverture des légendes verticales
plt.subplots_adjust(hspace=0.7,bottom=0.2)
plt.show()
La légende est verticale et seule la date est affichée. J'ai également changé la couleur du graphique. Personnellement, cela suffit.
Dans de nombreux cas, il n'est pas nécessaire de le diviser en deux graphiques, essayez donc de les afficher dans un seul graphique.
#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()
#Diagramme 1 ligne 1 colonne
ax1 = fig.add_subplot(1,1,1)
#Ajouter une couche (comme?)
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')
#Façonner
#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()
#Réglage du format de l'axe
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()
#Réglage du format de l'axe
ax2.set_ylabel('cpu', color='b')
for tl in ax2.get_yticklabels():
tl.set_color('b')
#Empêche la couverture des légendes verticales
plt.subplots_adjust(hspace=0.7,bottom=0.2)
plt.show()
Eh bien, ça ressemble à ça. J'ai changé la couleur de l'axe pour faciliter la compréhension de quelles données il s'agit (bien que ce soit difficile à comprendre).
Dans l'exemple ci-dessus, les données x ont été générées par date_range () des pandas, donc c'est de type datetime depuis le début, mais quand elles sont obtenues à partir de CSV ou DB, c'est une chaîne de caractères. Il semble que même une chaîne de caractères puisse être correctement traitée telle quelle, mais elle est convertie en datetime si nécessaire.
La conversion de la liste de chaînes en liste datetime est la suivante.
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]
Je vais vous expliquer comment éditer l'axe des x.
Il est un peu difficile de comprendre s'il s'agit d'une date, mais par exemple, si l'axe horizontal est de 0 à 1000 et que vous souhaitez afficher l'unité uniquement dans 3 endroits de 300, 600 et 900, utilisez set_xticks ([300,600,900]).
Ici, je veux insérer des légendes quotidiennement du 6/1 au 6/10, donc x0 généré par le mannequin est remplacé tel quel.
ax1.set_xticks(x0)
Après avoir décidé où placer la légende, l'étape suivante consiste à décider du contenu d'affichage, du format d'affichage, etc. Par exemple, dans ce qui précède, la position est set_xticks ([300,600,900]), mais si vous voulez la définir sur petite, moyenne ou grande sur l'affichage, set_xticklabels (['small', 'medium', 'large']). Vous pouvez spécifier l'inclinaison du caractère avec rotation. Si c'est 90, il sera vertical. La taille reste la même.
Ici, nous voulons afficher les dates du 6/1 au 6/10 telles quelles, nous substituons donc x0 telles quelles.
ax1.set_xticklabels(x0,rotation=90,size="small")
Lorsque x0 est affiché normalement, toute l'année, le mois, le jour, l'heure, les minutes et les secondes sont affichés et il est long, donc seuls l'année, le mois et le jour sont affichés.
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
Si vous souhaitez colorer les lignes des données, procédez comme suit. Dans cet exemple, il sera rouge.
ax1.plot(x1,y1,'r')
Si vous souhaitez spécifier l'axe et la légende et ajouter une couleur, procédez comme suit. Dans cet exemple, ce sera bleu.
ax2.set_ylabel('cpu', color='b')
for tl in ax2.get_yticklabels():
tl.set_color('b')
hspace ajuste l'espacement vertical entre les graphiques. Cela semble être une unité lorsque la hauteur des peluches est de 1,0. le bas est la marge du bas.
plt.subplots_adjust(hspace=0.7,bottom=0.2)
Recommended Posts