import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Загрузка данных
eeg_file_path = 'E:/maga/3 семестр/СРиОД/conan-EEG/Blinks/нормализованные_данные2.xlsx'
df = pd.read_excel(eeg_file_path)

# Предобработка данных
if 'T[sec]' in df.columns:
    df.drop(columns=['T[sec]'], inplace=True)

df = df.replace(',', '.', regex=True).astype(float)

# Загрузка координат электродов
leads = pd.read_csv('E:/maga/3 семестр/СРиОД/conan-EEG/Blinks/leads.csv')

# Преобразование координат электродов в нижний регистр для сопоставления с df
df.columns = df.columns.str.lower()  # Приведение названий столбцов df к нижнему регистру
leads['Lead'] = leads['Lead'].str.lower()  # Приведение значений в столбце Lead к нижнему регистру

# Создаем словарь координат
coords = leads.set_index('Lead').to_dict(orient='index')

# Функция для вычисления координаты
def calculate_weighted_coordinate(row, coord, relevant_columns):
    # Используем только существующие электроды
    electrodes = [e for e in relevant_columns if e in coords]
    weighted_sum = sum(row[e] * coords[e][coord] for e in electrodes)
    total_excitation = sum(row[e] for e in electrodes)
    return weighted_sum / total_excitation if total_excitation != 0 else 0

# Вычисляем x, y, z, исключая новые столбцы
df['x'] = df.apply(lambda row: calculate_weighted_coordinate(row, 'x', df.columns), axis=1)
df['y'] = df.apply(lambda row: calculate_weighted_coordinate(row, 'y', df.columns), axis=1)
df['z'] = df.apply(lambda row: calculate_weighted_coordinate(row, 'z', df.columns), axis=1)

# Визуализация расположения электродов
plt.figure(figsize=(10, 8))
plt.scatter(leads['x'], leads['y'], c='blue', label='Электроды')
for i, txt in enumerate(leads['Lead']): # 'Lead' - названия электродов
    plt.annotate(txt, (leads['x'][i], leads['y'][i]), fontsize=9, color='red')
plt.xlabel('X координата')
plt.ylabel('Y координата')
plt.title('Расположение электродов')
plt.legend()
plt.grid()
plt.show()

# Визуализация траектории возбуждения с цветом
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

# Используем градиент цвета для времени
time_steps = np.linspace(0, 1, len(df))  # Массив для временного контекста
sc = ax.scatter(df['x'], df['y'], df['z'], c=time_steps, cmap='viridis', label='Траектория', s=15)

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_title('Траектория возбуждения')

# Добавляем colorbar, используя объект scatter (sc)
cbar = plt.colorbar(sc, ax=ax, pad=0.1)
cbar.set_label('Время')  # Подпись для цветовой шкалы

ax.legend()
plt.show()

# Совмещенная визуализация траектории и электродов
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

# Электроды
ax.scatter(leads['x'], leads['y'], leads['z'], c='blue', label='Электроды', s=50)
for i, txt in enumerate(leads['Lead']):  # 'Lead' - названия электродов
    ax.text(leads['x'][i], leads['y'][i], leads['z'][i], txt, color='red', fontsize=9)

# Траектория возбуждения
time_steps = np.linspace(0, 1, len(df))  # Массив времени
ax.plot(df['x'], df['y'], df['z'], color='green', label='Траектория', linewidth=1.5)

# Оси и заголовок
ax.set_xlabel('X координата')
ax.set_ylabel('Y координата')
ax.set_zlabel('Z координата')
ax.set_title('Траектория возбуждения и расположение электродов')

ax.legend()
plt.show()
у меня есть такой код. задание - построить траекторию возбуждения нейронов головного мозга. я не уверена что алгоритм построения траектории правильный, не знаю. как думаешь? какие формулы используются и какие нужны?