Faire une heatmap avec python

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour !

Je cherche à réaliser une heatmap à partir de donnés contenues dans un fichier csv en Python. C'est à dire quelque chose comme ça : Exemple d'heatmap Celle-ci est trouvable sur ce site (réalisée en javascript).

Je pensais que matplotlib permettait d'en faire mais impossible de trouver comment… Surtout que je ne sais pas utiliser matplotlib/pyplot/numpy/jeSuisPerduDansLesNoms.

Du coup, je me tourne vers vous, comment est-ce que je peux réaliser quelque chose comme ça en python ? Les valeurs seront celle d'une humidité. Plus c'est humide, plus c'est bleu et inversement ! ;)

Merci de votre aide !

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

A priori pcolor peut t'aider :

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt
column_labels = list('ABC') # trois colonnes : A B et C
row_labels = list('WXYZ')# quatre lignes : W X Y et Z
data = [[1, 2, 3], [4, 3, 2], [1, 2, 3], [4, 3, 2]] # quatre lignes de trois colonnes
fig, axis = plt.subplots() # il me semble que c'est une bonne habitude de faire supbplots
heatmap = axis.pcolor(data, cmap=plt.cm.Blues) # heatmap contient les valeurs
plt.save("ton_fichier.png") # sauvegarde la heatmap
plt.show() # montre la heatmap dans une fenêtre ATTENTION ne met pas le processus en pause.

Édité par artragis

+0 -0
Auteur du sujet

Salut et merci de ta réponse.
Du coup, ça me semble la bonne solution. Mais j'ai une erreur à l’exécution de ton script :

1
2
3
4
5
6
7
8
Traceback (most recent call last):
  File "plot.py", line 9, in <module>
    heatmap = axis.pcolor(data, cmap=plt.cm.Blues) # heatmap contient les valeurs
  File "/usr/lib/python3/dist-packages/matplotlib/axes.py", line 7547, in pcolor
    X, Y, C = self._pcolorargs('pcolor', *args, allmatch=False)
  File "/usr/lib/python3/dist-packages/matplotlib/axes.py", line 7343, in _pcolorargs
    numRows, numCols = C.shape
AttributeError: 'list' object has no attribute 'shape'

J'ai de plus commencé à réfléchir à comment j'allais faire pour extraire les valeurs de mon fichier csv pour les mettre sous forme de liste. Et enfaite, ça va se révéler beaucoup plus ardu que prévu… Voici à quoi ressemble mon fichier csv :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
moisture,time,weekday
434,10,0
560,11,0
650,12,0
340,13,0
980,14,0
880,15,0
434,16,0
434,17,0
434,07,1
560,08,1

Sur ma heatmap, il me faut en abscisse la colonne time (qui va de 0 à 23) et en ordonnée les jours (weekday).

Mais il faut prendre en compte qu'il peut y avoir plusieurs données pour une heure et qu'il faut donc faire la moyenne de ces données ou qu'il peut n'y avoir aucunes données et donc mettre la valeur 0 pour l'heure qui n’apparaît pas.

Voici ce qu'il faut que mon script fasse :

1
2
3
4
5
Lire le fichier à l'envers
Prendre les données d'une semaine entière (du premier weekday == 6 au dernier weekday == 0)
Prendre chaque ligne une part une et les traiter 
(regarder si les suivantes ont la même valeur et en 
faire la moyenne ou encore regarder si il me manque des valeurs et les compléter...)

Comment est-ce que je peux réaliser ça en Python ? Ça me semble totalement impossible…

Édité par Wizix

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0
Auteur du sujet

Merci de ton aide, voici la version fonctionnelle chez moi :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import matplotlib.pyplot as plt
import numpy as np

column_labels = list('ABC') # trois colonnes : A B et C
row_labels = list('WXYZ')# quatre lignes : W X Y et Z
data = np.array([[1, 2, 3], [0, 3, 2], [1, 2, 3], [4, 3, 2]]) # quatre lignes de trois colonnes
fig, axis = plt.subplots() # il me semble que c'est une bonne habitude de faire supbplots
heatmap = axis.pcolor(data, cmap=plt.cm.Greens) # heatmap contient les valeurs
plt.savefig('test.png')
plt.show() # montre la heatmap dans une fenêtre ATTENTION ne met pas le processus en pause.

Plus qu'a adapter les valeurs. Je referais peut-être un sujet si je si je bloque ! ;)
Merci encore !

Édité par Wizix

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+1 -0
Auteur du sujet

Oui petit oubli de ma part :-°
Et parce que j'en suis fier voici ma heatmap générée avec ton aide ! MA heatmap Et le code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import matplotlib.pyplot as plt
import numpy as np

column_labels = list(range(0,24))
row_labels = ["Lundi",
              "Mardi",
              "Mercredi",
              "Jeudi",
              "Vendredi",
              "Samedi",
              "Dimanche"]
data = np.array([
                [0,0,0,0,0,0,0,0,0,0,434,560,650,340,980,880,434,434,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,434,560,0,650,0,0,0,0,340,980,0,0,0,880,0,434,343],
                [0,0,0,0,0,0,0,0,0,0,434,560,650,340,980,880,434,434,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,434,560,0,650,0,0,0,0,340,980,0,0,0,880,0,434,343],
                [0,0,0,0,0,0,0,0,0,0,434,560,650,340,980,880,434,434,0,0,0,0,0,0],
                [0,0,0,0,0,0,0,434,560,0,650,0,0,0,0,340,980,0,0,0,880,0,434,343],
                [0,0,0,0,0,0,0,0,0,0,434,560,650,340,980,880,434,434,0,0,0,0,0,0]
                ])
fig, axis = plt.subplots() # il me semble que c'est une bonne habitude de faire supbplots
heatmap = axis.pcolor(data, cmap=plt.cm.GnBu) # heatmap contient les valeurs

axis.set_yticks(np.arange(data.shape[0])+0.5, minor=False)
axis.set_xticks(np.arange(data.shape[1])+0.5, minor=False)

axis.invert_yaxis()

axis.set_yticklabels(row_labels, minor=False)
axis.set_xticklabels(column_labels, minor=False)

fig.set_size_inches(11.03, 3.5)

plt.savefig('test.png', dpi=100)
plt.show() # montre la heatmap dans une fenêtre ATTENTION ne met pas le processus en pause.

Merci ! :)

Édité par Wizix

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0
Auteur du sujet

Chaque case représente le taux d'humidité à pour cette heure et ce jour sur une semaine. Ça permet de voir rapidement à quelle heure de la journée le taux d'humidité de la terre de ma plante est le plus élevé. J'ai rajouté une échelle à côté (ce sera peut-être plus clair ;) ) : Final Heatmap!

Sur l'axe des abscisses tu as l'heure et sur l'axe des ordonnées tu as le jour. J'aurais très bien pu en faire une courbe, mais je trouve une heatmap beaucoup plus clair ! :)

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte