Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

99 рядки
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+1)%6)-1])
  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 de figures, empaqueter dans une
  62. # liste pour 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], marker = '.')
  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