You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 line
4.6KB

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. from multiprocessing import Process, Queue
  4. class Figures():
  5. def __init__(self, nb_signals):
  6. self.nb_curves = nb_signals #nombre de courbes
  7. self.plots_grid = (1,1) # (y,x)
  8. self.total_subplots = self.plots_grid[0]*self.plots_grid[1] # nombre de fenetres de plot
  9. self.repartition = [] # repartition de chaque courbe dans les fenetres
  10. self.plots_grids(nb_signals) # determination de la grille de fenetres à l'init
  11. self.fig = None # objet Figure()
  12. self.axes = None # liste d'objets subplots(), suivant la grille plots_grid definie
  13. self.time = None # axe x des figures (pas dans data_array car reextractible dans un tableur)
  14. self.titles = []
  15. def plots_grids(self, nb_plots):
  16. """ Determine la grille (x,y) de fenêtres de plots dans la figure affichée.
  17. Dans tous les cas, pour voir quelque chose des mesures, le nombre de fenêtres
  18. de plots est < 6; on pourra afficher 2 graphiques dns une même fenêtre
  19. lorsqu'il y a plus de courbes à afficher que de fenêtres dans la grille,
  20. dans l'ordre de parcours " de gauche à droite, puis de haut en bas" ."""
  21. if(nb_plots == 1):
  22. self.plots_grid = (1,1)
  23. elif(nb_plots == 2):
  24. self.plots_grid = (1,2)
  25. elif(nb_plots == 3):
  26. self.plots_grid = (1,3)
  27. elif(nb_plots == 4 or nb_plots == 5):
  28. self.plots_grid = (2,2)
  29. elif(nb_plots == 6):
  30. self.plots_grid = (2,3)
  31. else:
  32. if(type(nb_plots/2) == type(int())):
  33. self.plots_grids(nb_plots/2)
  34. elif(nb_plots >= 9):
  35. self.plots_grids(6)
  36. else:
  37. self.plots_grids(nb_plots-1)
  38. self.total_subplots = self.plots_grid[0]*self.plots_grid[1]
  39. # definition de la repartition sous forme d'un nombre à 3 chiffres yXnb
  40. if(self.plots_grid == (1,1)):
  41. self.repartition = [111]
  42. elif(self.plots_grid == (1,2)):
  43. self.repartition = [111, 122]
  44. elif(self.plots_grid == (1,3)):
  45. self.repartition = [111, 122, 133]
  46. elif(self.plots_grid == (2,2)):
  47. self.repartition = [111, 122, 213, 224]
  48. elif(self.plots_grid == (2,3)):
  49. self.repartition = [111, 122, 133, 214, 225, 236]
  50. if(nb_plots > 6):
  51. for i in range(6,nb_plots):
  52. # parcours des cases de la figure de droite à gauche puis de haut en bas, suivant la grille
  53. self.repartition.append(self.repartition[i%self.nb_curves])
  54. def create_figure(self, titles_list):
  55. """Creation de la fenêtre contenant les plots.
  56. Mode interactif enclenché pour réactualiser à chaque fois que plot_data est
  57. appelée. Utilisation de plt.pause pour laisser la fenêtre s'afficher et
  58. actualiser les données."""
  59. plt.ion()
  60. self.fig, self.axes = plt.subplots(self.plots_grid[0], self.plots_grid[1])
  61. if(self.plots_grid[0] < 2): # si 1 seule ligne, empaqueter dans une liste pour
  62. # y acceder de la meme facon dans tous les cas
  63. self.axes = [self.axes]
  64. for j in range(self.plots_grid[0]):
  65. for i in range(self.plots_grid[1]):
  66. self.titles.append(", ".join(titles_list[j*self.plots_grid[1]+i::self.total_subplots]))
  67. self.axes[j][i].title.set_text(self.titles[j*self.plots_grid[1]+i])
  68. plt.show()
  69. plt.pause(0.05)
  70. def plot_data(self, data_array):
  71. """Appel pour réactualistion des données. Utilisation de plt.pause pour laisser
  72. afficher les données."""
  73. data_array_t = np.transpose(data_array)
  74. self.time = np.linspace(0,data_array_t.shape[1]-1,data_array_t.shape[1])
  75. for i in self.repartition:
  76. self.axes[i//100-1][(i//10)%10-1].clear()
  77. 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])
  78. for i in range(self.nb_curves):
  79. self.axes[self.repartition[i]//100-1][(self.repartition[i]//10)%10-1].scatter(self.time, data_array_t[i])
  80. plt.show()
  81. plt.pause(0.05)
  82. def reinit(self):
  83. """Remise à zéro (défaut) de l'objet Figures(), permet aussi de fermer la figure
  84. et d'en réouvrir une nouvelle lors de la réutilisation de l'objet."""
  85. plt.close(self.fig)
  86. self.plots_grid = (1,1)
  87. self.total_subplots = self.plots_grid[0]*self.plots_grid[1]
  88. self.repartition = []
  89. self.fig = None
  90. self.axes = None