Formater et afficher des données de séries chronologiques avec différentes échelles et unités avec Python ou Matplotlib

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.

Ce que vous voulez faire et les défis

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.

Principes de base de Matplotlib

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.

plt

Voir les compléments de code et les explications en bas.

Confirmation des problèmes

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 1

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.

plt

Données 2

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.

plt

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).

Affichage pour le moment

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.

plt

Comment répondre

À contrecœur

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.

plt

Ajuster l'apparence

#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.

plt

Fusionner en un seul graphique

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).

plt

Supplément / Explication

Conversion de chaîne en date / heure

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]

Edition de l'axe (axe X)

Je vais vous expliquer comment éditer l'axe des x.

Décidez où placer la légende

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)

Décidez comment afficher la légende

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")

Ajuster davantage le format d'affichage

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'))

Ajouter de la couleur

Couleur de la ligne

Si vous souhaitez colorer les lignes des données, procédez comme suit. Dans cet exemple, il sera rouge.

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

Couleur de l'axe

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')

Ajustement de la marge

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

Formater et afficher des données de séries chronologiques avec différentes échelles et unités avec Python ou Matplotlib
Graphique des données de séries chronologiques en Python à l'aide de pandas et matplotlib
Tracer CSV de données de séries temporelles avec une valeur unixtime en Python (matplotlib)
[Python] Tracer des données de séries chronologiques
[Python] Lisez le fichier csv et affichez la figure avec matplotlib
"Analyse des séries chronologiques de mesure des données économiques et financières" Résolution du problème de fin de chapitre avec Python
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
À propos des données de séries chronologiques et du surentraînement
Lors du traçage des données de séries chronologiques et de l'obtention d'une erreur de débordement matplotlib
Prédiction des données de séries chronologiques par projection simplex
Construction de pipeline de données avec Python et Luigi
Calculer et afficher le poids standard avec python
Prédire les données de séries chronologiques avec un réseau neuronal
Lecture des données de séries chronologiques OpenFOAM et des ensembles de données
Tracez plusieurs cartes et données en même temps avec matplotlib de Python
Exécuter du SQL brut avec redash à l'aide de la source de données Python et afficher le résultat
Obtenez des données de séries chronologiques de k-db.com avec Python
Lire les données csv Python avec Pandas ⇒ Graphique avec Matplotlib
Recevoir et afficher les données de formulaire HTML en Python
Afficher de manière interactive des courbes algébriques en Python, Jupyter
[Python] Mémo de conversion entre les données temporelles et les données numériques
Implémentez "Data Visualization Design # 3" avec pandas et matplotlib
Lissage des séries temporelles et des données de forme d'onde 3 méthodes (lissage)
Voir les détails des données de séries chronologiques dans Remotte
[Python] Convertit l'affichage de l'heure (type str) en utilisant "" "et" '"en secondes (type float) avec datetime et timedelta
J'ai créé un graphique à barres empilées avec matplotlib de Python et ajouté une étiquette de données
Implémentation de la méthode de clustering k-shape pour les données de séries chronologiques [Apprentissage non supervisé avec python Chapitre 13]
"Obtenir des données de séries chronologiques de stock à partir de k-db.com avec Python" Mémo de création d'environnement de programme
Extraire "date actuelle uniquement" et "date et heure actuelles" avec python datetime.
Lisez et analysez l'ensemble de données au format arff avec python scipy.io
Lire le fichier json avec Python, le formater et générer le json
Afficher et prendre des images de caméra Web avec Python Kivy [GUI]
[Série chronologique avec plotly] Visualisation dynamique avec plotly [python, cours boursier]
Étudiez l'échange de données Java et Python avec Apache Arrow
J'ai essayé la même analyse de données avec kaggle notebook (python) et PowerBI en même temps ②
J'ai essayé la même analyse de données avec kaggle notebook (python) et PowerBI en même temps ①
Analyse de données avec python 2
Python: analyse des séries chronologiques
Question sur la série chronologique Python
Carte thermique par Python + matplotlib
Analyse de données avec Python
Afficher les séries chronologiques TOPIX
Diagramme de séries chronologiques / Matplotlib
J'ai créé un package pour filtrer les séries chronologiques avec python
Effectuer une analyse isocurrent des canaux en eau libre avec Python et matplotlib
Remarques sur l'importation de données depuis MySQL ou CSV avec Python
Créons un diagramme PRML avec Python, Numpy et matplotlib.
Débarrassez-vous des données sales avec Python et les expressions régulières
Reformatez l'axe des temps du graphique de la série chronologique des pandas avec matplotlib
Résolvez le livre en spirale (algorithme et structure de données) avec python!
[Python] Afficher le temps écoulé en heures, minutes et secondes (00:00:00)
Cette fois, j'ai appris python III et IV avec Prorate
Obtenez des données supplémentaires vers LDAP avec python (Writer et Reader)