123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- import cycler
- from matplotlib import pyplot as plt
- class GraphsDrawing:
- def __init__(self, start_date, end_date, path_to_pic):
- self.start_date = start_date
- self.end_date = end_date
- self.path_to_pic = path_to_pic
- self.box = {'facecolor': 'white', # цвет области
- 'edgecolor': 'red', # цвет крайней линии
- 'boxstyle': 'round'}
- def __del__(self):
- """Деструктор, закрывающий все объекты Figure, созданные в процессе работы класса."""
- plt.close('all')
- @staticmethod
- def change_design():
- """Метод, который должен применяться вначале, для изменения размера и веса шрифта. А также для изменения,
- цвета линий на графиках. Без него цвета, когда количество линий > 10 начнут повторяться"""
- font = {'weight': 'bold',
- 'size': 18}
- plt.rc('font', **font)
- plt.rc('axes',
- prop_cycle=(
- cycler.cycler('color', ['r', 'g', 'b', 'darkblue', 'lawngreen', 'hotpink', 'c', 'y', 'm', 'orange',
- 'burlywood', 'darkmagenta', 'grey', 'darkslategray', 'saddlebrown',
- 'lightsalmon'])))
- return None
- def graph_format(self, y_lim, x_label, y_label):
- """Метод, прописывающий неизменный формат для графиков, желательно добавить смену figsize и fontsize"""
- plt.figure(figsize=(18, 10))
- plt.xlabel(x_label, fontsize=40)
- plt.ylabel(y_label, fontsize=40)
- plt.grid()
- plt.minorticks_on()
- plt.tick_params(axis='both', which='minor', direction='out', length=10, width=2, pad=10)
- plt.tick_params(axis='both', which='major', direction='out', length=20, width=4, pad=10)
- plt.grid(which='minor',
- color='k',
- linestyle=':')
- plt.ylim(y_lim)
- plt.xlim([self.start_date, self.end_date])
- def worktime_graph(self, worktime_frame, cluster):
- """Метод, рисующий график продолжительности работы установки ПРИЗМА-32 для заданного кластера, дает на выходе
- путь к месту, где в системе лежит график"""
- self.graph_format(y_lim=[0, 25], x_label='Дата', y_label='Время работы, ч')
- plt.xticks([i.date() for i in list(worktime_frame['Date'])[::4]],
- [i.date() for i in list(worktime_frame['Date'])[::4]])
- plt.plot(worktime_frame['Date'], worktime_frame['Worktime'], marker='s', markersize=15, color='darkblue',
- linewidth='6')
- plt.title(f"{cluster}-кластер", bbox=self.box, fontsize=20, loc='center')
- 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'
- plt.savefig(path_pic, bbox_inches='tight')
- return path_pic
- def amp_5_fr_4_graph(self, amp_5_fr_4_frame, amp_5_fr_4_frame_2, worktime_frame, worktime_frame_2):
- """Метод, рисующий график количества событий с A>5, Fr>=4 на 1-м и 2-м кластере, дает на выходе путь к месту,
- где в системе лежит график"""
- self.graph_format(y_lim=[0, 5], x_label='Дата', y_label='N, соб/час')
- plt.xticks([i.date() for i in list(amp_5_fr_4_frame['Date'])[::4]],
- [i.date() for i in list(amp_5_fr_4_frame['Date'])[::4]])
- plt.plot(amp_5_fr_4_frame['Date'], amp_5_fr_4_frame['Events'] / worktime_frame['Worktime'], label='1 Кл.',
- marker='s', markersize=15, color='darkblue', linewidth='6')
- plt.plot(amp_5_fr_4_frame_2['Date'], amp_5_fr_4_frame_2['Events'] / worktime_frame_2['Worktime'], label='2 Кл.',
- marker='s', markersize=15, color='crimson', linewidth='6')
- plt.legend(bbox_to_anchor=(1.04, 1), loc="upper left")
- 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'
- plt.savefig(path_pic, bbox_inches='tight')
- return path_pic
- def neutron_to_0_tr_graph(self, neutron_num_0_tr_frame, cluster):
- """Метод, рисующий для заданного кластера график нормированного числа импульсов, отобранных установкой
- ПРИЗМА-32, как нейтрон при самозапуске, происходящем раз в 5 минут. Нормировка произведена на количество
- самозапусков. Метод дает на выходе путь к месту, где в системе лежит график"""
- self.graph_format(y_lim=[0, 0.5], x_label='Дата', y_label=r'$(coб)^{-1}$')
- plt.xticks([i.date() for i in list(neutron_num_0_tr_frame['Date'])[::4]],
- [i.date() for i in list(neutron_num_0_tr_frame['Date'])[::4]])
- plt.title(f"{cluster}-кластер", bbox=self.box, fontsize=20, loc='center')
- for i in range(1, 17):
- plt.plot(neutron_num_0_tr_frame['Date'], neutron_num_0_tr_frame[f'n{i}'], label=f'{i}', linewidth=5)
- plt.legend(bbox_to_anchor=(1.04, 1), loc="upper left")
- 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'
- plt.savefig(path_pic, bbox_inches='tight')
- return path_pic
- def amp_distribution_graph(self, amp_distribution_frame, cluster, a_crit, freq):
- """Метод, рисующий график амплитудного распределений событий с A>5, Fr>=2 для заданного кластера, дает на выходе
- путь к месту где в системе лежит график"""
- plt.figure(figsize=(18, 10))
- plt.xlabel('Амплитуда, код АЦП', fontsize=40)
- plt.yscale('log')
- plt.xscale('log')
- plt.ylabel('N_соб(Fr≥2, A>5)', fontsize=40)
- plt.minorticks_on()
- plt.tick_params(axis='both', which='minor', direction='out', length=10, width=2, pad=10)
- plt.tick_params(axis='both', which='major', direction='out', length=20, width=4, pad=10)
- plt.xlim([a_crit - 1, 1000])
- plt.ylim([1, 1000])
- plt.text(500, 500, "1-кластер", bbox=self.box, fontsize=20)
- for i in range(1, 17):
- plt.plot(amp_distribution_frame[amp_distribution_frame[f'amp{i}'] >= a_crit][
- f'amp{i}'].value_counts().sort_index().keys().tolist(),
- amp_distribution_frame[amp_distribution_frame[f'amp{i}'] >= a_crit][
- f'amp{i}'].value_counts().sort_index(), label=f'{i}', linewidth=5)
- plt.legend(bbox_to_anchor=(1.04, 1), loc="upper left")
- 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'
- plt.savefig(path_pic, bbox_inches='tight')
- return path_pic
- def count_rate_graph(self, count_rate_frame, working_frame, cluster, a_crit, freq):
- """Метод, рисующий скорость счета детекторов для событий с A>5, Fr>=2 для заданного кластера, дает на выходе
- путь к месту где в системе лежит график"""
- self.graph_format(y_lim=[0, 8], x_label='Дата', y_label='N, соб/час')
- plt.title("1-кластер", bbox=self.box, fontsize=20, loc='center')
- for i in range(1, 17):
- plt.xticks([i.date() for i in list(count_rate_frame['Date'])[::4]],
- [i.date() for i in list(count_rate_frame['Date'])[::4]])
- plt.plot(count_rate_frame['Date'], count_rate_frame[f'amp{i}'], label=f'{i}',
- linewidth=6)
- plt.legend(bbox_to_anchor=(1.04, 1), loc="upper left")
- 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'
- plt.savefig(path_pic, bbox_inches='tight')
- return path_pic
|