|
- import matplotlib.pyplot as plt
- import numpy as np
- from multiprocessing import Process, Queue
-
- class Figures():
-
- def __init__(self, nb_signals):
- self.nb_curves = nb_signals #nombre de courbes
- self.plots_grid = (1,1) # (y,x)
- self.total_subplots = self.plots_grid[0]*self.plots_grid[1] # nombre de fenetres de plot
- self.repartition = [] # repartition de chaque courbe dans les fenetres
- self.plots_grids(nb_signals) # determination de la grille de fenetres à l'init
- self.fig = None # objet Figure()
- self.axes = None # liste d'objets subplots(), suivant la grille plots_grid definie
- self.time = None # axe x des figures (pas dans data_array car reextractible dans un tableur)
- self.titles = []
-
- def plots_grids(self, nb_plots):
- """ Determine la grille (x,y) de fenêtres de plots dans la figure affichée.
- Dans tous les cas, pour voir quelque chose des mesures, le nombre de fenêtres
- de plots est < 6; on pourra afficher 2 graphiques dns une même fenêtre
- lorsqu'il y a plus de courbes à afficher que de fenêtres dans la grille,
- dans l'ordre de parcours " de gauche à droite, puis de haut en bas" ."""
- if(nb_plots == 1):
- self.plots_grid = (1,1)
- elif(nb_plots == 2):
- self.plots_grid = (1,2)
- elif(nb_plots == 3):
- self.plots_grid = (1,3)
- elif(nb_plots == 4 or nb_plots == 5):
- self.plots_grid = (2,2)
- elif(nb_plots == 6):
- self.plots_grid = (2,3)
- else:
- if(type(nb_plots/2) == type(int())):
- self.plots_grids(nb_plots/2)
- elif(nb_plots >= 9):
- self.plots_grids(6)
- else:
- self.plots_grids(nb_plots-1)
- self.total_subplots = self.plots_grid[0]*self.plots_grid[1]
-
- # definition de la repartition sous forme d'un nombre à 3 chiffres yXnb
-
- if(self.plots_grid == (1,1)):
- self.repartition = [111]
- elif(self.plots_grid == (1,2)):
- self.repartition = [111, 122]
- elif(self.plots_grid == (1,3)):
- self.repartition = [111, 122, 133]
- elif(self.plots_grid == (2,2)):
- self.repartition = [111, 122, 213, 224]
- elif(self.plots_grid == (2,3)):
- self.repartition = [111, 122, 133, 214, 225, 236]
- if(nb_plots > 6):
- for i in range(6,nb_plots):
- # parcours des cases de la figure de droite à gauche puis de haut en bas, suivant la grille
- self.repartition.append(self.repartition[((i+1)%6)-1])
-
- def create_figure(self, titles_list):
- """Creation de la fenêtre contenant les plots.
- Mode interactif enclenché pour réactualiser à chaque fois que plot_data est
- appelée. Utilisation de plt.pause pour laisser la fenêtre s'afficher et
- actualiser les données."""
- plt.ion()
- self.fig, self.axes = plt.subplots(self.plots_grid[0], self.plots_grid[1])
- if(self.plots_grid[0] < 2): # si 1 seule ligne de figures, empaqueter dans une
- # liste pour y acceder de la meme facon dans tous les cas
- self.axes = [self.axes]
- for j in range(self.plots_grid[0]):
- for i in range(self.plots_grid[1]):
- self.titles.append(", ".join(titles_list[j*self.plots_grid[1]+i::self.total_subplots]))
- self.axes[j][i].title.set_text(self.titles[j*self.plots_grid[1]+i])
- plt.show()
- plt.pause(0.05)
-
- def plot_data(self, data_array):
- """Appel pour réactualistion des données. Utilisation de plt.pause pour laisser
- afficher les données."""
- data_array_t = np.transpose(data_array)
- self.time = np.linspace(0,data_array_t.shape[1]-1,data_array_t.shape[1])
- for i in self.repartition:
- self.axes[i//100-1][(i//10)%10-1].clear()
- self.axes[i//100-1][(i//10)%10-1].title.set_text(self.titles[(i//100-1)*self.plots_grid[1]+(i//10)%10-1])
- for i in range(self.nb_curves):
- self.axes[self.repartition[i]//100-1][(self.repartition[i]//10)%10-1].scatter(self.time, data_array_t[i], marker = '.')
- plt.show()
- plt.pause(0.05)
-
- def reinit(self):
- """Remise à zéro (défaut) de l'objet Figures(), permet aussi de fermer la figure
- et d'en réouvrir une nouvelle lors de la réutilisation de l'objet."""
- plt.close(self.fig)
- self.plots_grid = (1,1)
- self.total_subplots = self.plots_grid[0]*self.plots_grid[1]
- self.repartition = []
- self.fig = None
- self.axes = None
|