/
AlexEly
/
Course_proj_ead
Обзор
Документация
Войти
/
AlexEly
/
Course_proj_ead
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
chap1-2.py
122 строки
6 KB
AlexEly
create: chap1-11.py, chap1-10.py, chap1-9.py, chap1-8.py, chap1-7.py, chap1-6.py, chap1-5.py, chap1-4.py, chap1-3.py, chap1-2.py, chap1-1.py, chap1-0.py
19 апр 2026, 14:12
Верифицирован
19 апр 2026, 14:12
feb66de
Код
Авторство
О чём код?
import matplotlib.pyplot as plt import pandas as pd import numpy as np from matplotlib.widgets import RadioButtons, CheckButtons # Загрузка данных df = pd.read_csv('feature_time_48k_2048_load_1.csv') # Включение интерактивного режима plt.ion() # Создание фигуры с двумя подграфиками fig = plt.figure(figsize=(14, 6)) fig.canvas.manager.set_window_title('Интерактивная визуализация признаков') # ============================================================================= # График 1: Диаграмма рассеяния (mean vs std) с цветовой кодировкой по типу дефекта # ============================================================================= ax1 = plt.subplot(1, 2, 1) scatter = ax1.scatter(df['mean'], df['sd'], c=pd.factorize(df['fault'])[0], cmap='tab10', alpha=0.7, s=50, edgecolors='black') ax1.set_xlabel('Mean (Среднее значение)', fontsize=10) ax1.set_ylabel('SD (Стандартное отклонение)', fontsize=10) ax1.set_title('Scatter Plot: Mean vs Standard Deviation', fontsize=12, fontweight='bold') ax1.grid(True, alpha=0.3) # Добавление легенды с типами дефектов fault_types = df['fault'].unique() colors = plt.cm.tab10(np.linspace(0, 1, len(fault_types))) for i, fault in enumerate(fault_types): ax1.scatter([], [], c=[colors[i]], label=fault, s=50, edgecolors='black') ax1.legend(title='Тип дефекта', fontsize=8, title_fontsize=9) # ============================================================================= # График 2: Гистограмма распределения признака 'rms' с возможностью выбора типа # ============================================================================= ax2 = plt.subplot(1, 2, 2) # Функция для обновления гистограммы def update_histogram(selected_faults): ax2.clear() mask = df['fault'].isin(selected_faults) if selected_faults else pd.Series([True]*len(df)) data = df.loc[mask, 'rms'] ax2.hist(data, bins=30, color='steelblue', edgecolor='black', alpha=0.8) ax2.set_xlabel('RMS (Среднеквадратичное значение)', fontsize=10) ax2.set_ylabel('Частота', fontsize=10) ax2.set_title(f'Histogram: RMS Distribution\nВыбрано: {len(selected_faults) if selected_faults else "Все"} типов', fontsize=12, fontweight='bold') ax2.grid(True, alpha=0.3, axis='y') fig.canvas.draw_idle() # Инициализация гистограммы update_histogram(list(fault_types)) # ============================================================================= # Интерактивные элементы управления # ============================================================================= # Позиция для кнопок ax_check = plt.axes([0.02, 0.02, 0.15, 0.15], facecolor='lightgoldenrodyellow') check = CheckButtons(ax_check, fault_types, [True]*len(fault_types)) # Обработчик событий для CheckButtons def func(label): selected = [l for l, val in zip(check.labels, check.get_status()) if val] update_histogram(selected) check.on_clicked(func) # ============================================================================= # Интерактивность: отображение информации при наведении на точку (для scatter plot) # ============================================================================= annot = ax1.annotate("", xy=(0,0), xytext=(15,15), textcoords="offset points", bbox=dict(boxstyle="round", fc="w", alpha=0.8), arrowprops=dict(arrowstyle="->")) annot.set_visible(False) def update_annot(ind): idx = ind["ind"][0] pos = scatter.get_offsets()[idx] annot.xy = pos text = f"Fault: {df['fault'].iloc[idx]}\nMean: {df['mean'].iloc[idx]:.5f}\nSD: {df['sd'].iloc[idx]:.5f}" annot.set_text(text) annot.get_bbox_patch().set_alpha(0.9) def hover(event): vis = annot.get_visible() if event.inaxes == ax1: cont, ind = scatter.contains(event) if cont: update_annot(ind) annot.set_visible(True) fig.canvas.draw_idle() elif vis: annot.set_visible(False) fig.canvas.draw_idle() fig.canvas.mpl_connect("motion_notify_event", hover) # ============================================================================= # Настройка отображения # ============================================================================= plt.tight_layout(rect=[0.2, 0.15, 1, 1]) # Место для элементов управления plt.subplots_adjust(bottom=0.2) # Инструкция для пользователя instruction = fig.text(0.5, 0.01, '💡 Используйте: \n• Мышь для масштабирования (колесико/выделение)\n' '• Клик по чекбоксам для фильтрации гистограммы\n' '• Наведение на точки для просмотра деталей', ha='center', fontsize=9, bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5)) print("✅ Графики построены! Закройте окно для завершения.") print("🔧 Для полноценной интерактивности используйте backend: 'TkAgg', 'Qt5Agg' или 'WXAgg'") # Отображение графиков plt.show(block=True)