drawing_graphs.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import cycler
  2. from matplotlib import pyplot as plt
  3. class GraphsDrawing:
  4. def __init__(self, start_date, end_date, path_to_pic):
  5. self.start_date = start_date
  6. self.end_date = end_date
  7. self.path_to_pic = path_to_pic
  8. self.box = {'facecolor': 'white', # цвет области
  9. 'edgecolor': 'red', # цвет крайней линии
  10. 'boxstyle': 'round'}
  11. def __del__(self):
  12. """Деструктор, закрывающий все объекты Figure, созданные в процессе работы класса."""
  13. plt.close('all')
  14. @staticmethod
  15. def change_design():
  16. """Метод, который должен применяться вначале, для изменения размера и веса шрифта. А также для изменения,
  17. цвета линий на графиках. Без него цвета, когда количество линий > 10 начнут повторяться"""
  18. font = {'weight': 'bold',
  19. 'size': 18}
  20. plt.rc('font', **font)
  21. plt.rc('axes',
  22. prop_cycle=(
  23. cycler.cycler('color', ['r', 'g', 'b', 'darkblue', 'lawngreen', 'hotpink', 'c', 'y', 'm', 'orange',
  24. 'burlywood', 'darkmagenta', 'grey', 'darkslategray', 'saddlebrown',
  25. 'lightsalmon'])))
  26. return None
  27. def graph_format(self, y_lim, x_label, y_label):
  28. """Метод, прописывающий неизменный формат для графиков, желательно добавить смену figsize и fontsize"""
  29. plt.figure(figsize=(18, 10))
  30. plt.xlabel(x_label, fontsize=40)
  31. plt.ylabel(y_label, fontsize=40)
  32. plt.grid()
  33. plt.minorticks_on()
  34. plt.tick_params(axis='both', which='minor', direction='out', length=10, width=2, pad=10)
  35. plt.tick_params(axis='both', which='major', direction='out', length=20, width=4, pad=10)
  36. plt.grid(which='minor',
  37. color='k',
  38. linestyle=':')
  39. plt.ylim(y_lim)
  40. plt.xlim([self.start_date, self.end_date])
  41. def worktime_graph(self, worktime_frame, cluster):
  42. """Метод, рисующий график продолжительности работы установки ПРИЗМА-32 для заданного кластера, дает на выходе
  43. путь к месту, где в системе лежит график"""
  44. self.graph_format(y_lim=[0, 25], x_label='Дата', y_label='Время работы, ч')
  45. plt.xticks([i.date() for i in list(worktime_frame['Date'])[::4]],
  46. [i.date() for i in list(worktime_frame['Date'])[::4]])
  47. plt.plot(worktime_frame['Date'], worktime_frame['Worktime'], marker='s', markersize=15, color='darkblue',
  48. linewidth='6')
  49. plt.title(f"{cluster}-кластер", bbox=self.box, fontsize=20, loc='center')
  50. path_pic = f'{self.path_to_pic}\\{cluster}worktime{self.start_date.day}-{self.start_date.month}-{self.end_date.day}-{self.end_date.month}.png'
  51. plt.savefig(path_pic, bbox_inches='tight')
  52. return path_pic
  53. def amp_5_fr_4_graph(self, amp_5_fr_4_frame, amp_5_fr_4_frame_2, worktime_frame, worktime_frame_2):
  54. """Метод, рисующий график количества событий с A>5, Fr>=4 на 1-м и 2-м кластере, дает на выходе путь к месту,
  55. где в системе лежит график"""
  56. self.graph_format(y_lim=[0, 5], x_label='Дата', y_label='N, соб/час')
  57. plt.xticks([i.date() for i in list(amp_5_fr_4_frame['Date'])[::4]],
  58. [i.date() for i in list(amp_5_fr_4_frame['Date'])[::4]])
  59. plt.plot(amp_5_fr_4_frame['Date'], amp_5_fr_4_frame['Events'] / worktime_frame['Worktime'], label='1 Кл.',
  60. marker='s', markersize=15, color='darkblue', linewidth='6')
  61. plt.plot(amp_5_fr_4_frame_2['Date'], amp_5_fr_4_frame_2['Events'] / worktime_frame_2['Worktime'], label='2 Кл.',
  62. marker='s', markersize=15, color='crimson', linewidth='6')
  63. plt.legend(bbox_to_anchor=(1.04, 1), loc="upper left")
  64. path_pic = f'{self.path_to_pic}\\amp_5_fr_4{self.start_date.day}-{self.start_date.month}-{self.end_date.day}-{self.end_date.month}.png'
  65. plt.savefig(path_pic, bbox_inches='tight')
  66. return path_pic
  67. def neutron_to_0_tr_graph(self, neutron_num_0_tr_frame, cluster):
  68. """Метод, рисующий для заданного кластера график нормированного числа импульсов, отобранных установкой
  69. ПРИЗМА-32, как нейтрон при самозапуске, происходящем раз в 5 минут. Нормировка произведена на количество
  70. самозапусков. Метод дает на выходе путь к месту, где в системе лежит график"""
  71. self.graph_format(y_lim=[0, 0.5], x_label='Дата', y_label=r'$(coб)^{-1}$')
  72. plt.xticks([i.date() for i in list(neutron_num_0_tr_frame['Date'])[::4]],
  73. [i.date() for i in list(neutron_num_0_tr_frame['Date'])[::4]])
  74. plt.title(f"{cluster}-кластер", bbox=self.box, fontsize=20, loc='center')
  75. for i in range(1, 17):
  76. plt.plot(neutron_num_0_tr_frame['Date'], neutron_num_0_tr_frame[f'n{i}'], label=f'{i}', linewidth=5)
  77. plt.legend(bbox_to_anchor=(1.04, 1), loc="upper left")
  78. path_pic = f'{self.path_to_pic}\\{cluster}n_to_0_tr{self.start_date.day}-{self.start_date.month}-{self.end_date.day}-{self.end_date.month}.png'
  79. plt.savefig(path_pic, bbox_inches='tight')
  80. return path_pic
  81. def amp_distribution_graph(self, amp_distribution_frame, cluster, a_crit, freq):
  82. """Метод, рисующий график амплитудного распределений событий с A>5, Fr>=2 для заданного кластера, дает на выходе
  83. путь к месту где в системе лежит график"""
  84. plt.figure(figsize=(18, 10))
  85. plt.xlabel('Амплитуда, код АЦП', fontsize=40)
  86. plt.yscale('log')
  87. plt.xscale('log')
  88. plt.ylabel('N_соб(Fr≥2, A>5)', fontsize=40)
  89. plt.minorticks_on()
  90. plt.tick_params(axis='both', which='minor', direction='out', length=10, width=2, pad=10)
  91. plt.tick_params(axis='both', which='major', direction='out', length=20, width=4, pad=10)
  92. plt.xlim([a_crit - 1, 1000])
  93. plt.ylim([1, 1000])
  94. plt.text(500, 500, "1-кластер", bbox=self.box, fontsize=20)
  95. for i in range(1, 17):
  96. plt.plot(amp_distribution_frame[amp_distribution_frame[f'amp{i}'] >= a_crit][
  97. f'amp{i}'].value_counts().sort_index().keys().tolist(),
  98. amp_distribution_frame[amp_distribution_frame[f'amp{i}'] >= a_crit][
  99. f'amp{i}'].value_counts().sort_index(), label=f'{i}', linewidth=5)
  100. plt.legend(bbox_to_anchor=(1.04, 1), loc="upper left")
  101. path_pic = f'{self.path_to_pic}\\{cluster}amp_distr_{a_crit}_fr_{freq}{self.start_date.day}-{self.start_date.month}-{self.end_date.day}-{self.end_date.month}.png'
  102. plt.savefig(path_pic, bbox_inches='tight')
  103. return path_pic
  104. def count_rate_graph(self, count_rate_frame, working_frame, cluster, a_crit, freq):
  105. """Метод, рисующий скорость счета детекторов для событий с A>5, Fr>=2 для заданного кластера, дает на выходе
  106. путь к месту где в системе лежит график"""
  107. self.graph_format(y_lim=[0, 8], x_label='Дата', y_label='N, соб/час')
  108. plt.title("1-кластер", bbox=self.box, fontsize=20, loc='center')
  109. for i in range(1, 17):
  110. plt.xticks([i.date() for i in list(count_rate_frame['Date'])[::4]],
  111. [i.date() for i in list(count_rate_frame['Date'])[::4]])
  112. plt.plot(count_rate_frame['Date'], count_rate_frame[f'amp{i}'], label=f'{i}',
  113. linewidth=6)
  114. plt.legend(bbox_to_anchor=(1.04, 1), loc="upper left")
  115. path_pic = f'{self.path_to_pic}\\{cluster}count_rate_{a_crit}_fr_{freq}{self.start_date.day}-{self.start_date.month}-{self.end_date.day}-{self.end_date.month}.png'
  116. plt.savefig(path_pic, bbox_inches='tight')
  117. return path_pic