drawing_graphs.py 8.5 KB

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