Files
Microtracking/heatmapgenerator.py

75 lines
2.6 KiB
Python

import pandas as pd
import numpy as np
import re
import matplotlib.pyplot as plt
print("Procesando el archivo de log para generar el mapa de calor...")
try:
# --- 1. Cargar los datos del archivo log(3).txt ---
log_pattern = re.compile(r'\[(.*?)\] X:(\d+),Y:(\d+),C:(\d+),V:(\d+),P:(\d+),')
data = []
filename = '21092025.txt'
with open(filename, 'r') as f:
for line in f:
match = log_pattern.search(line)
if match:
data.append([
match.group(1),match.group(2), match.group(3),
match.group(4), match.group(6)
])
df = pd.DataFrame(data, columns=['t','X', 'Y', 'C', 'P'])
df['t'] = df['t'].astype(str)
df['X'] = df['X'].astype(int)
df['Y'] = df['Y'].astype(int)
df['C'] = df['C'].astype(int)
df['P'] = df['P'].astype(int)
# --- 2. Calcular el "Índice de Rendimiento Óptimo" ---
p_range = df['P'].max() - df['P'].min()
c_range = df['C'].max() - df['C'].min()
if p_range > 0:
df['P_norm'] = (df['P'] - df['P'].min()) / p_range
else:
df['P_norm'] = 0.5
if c_range > 0:
df['C_norm'] = (df['C'] - df['C'].min()) / c_range
else:
df['C_norm'] = 0.5
df['perf_index'] = (df['P_norm'] + df['C_norm']) * (1 - abs(df['P_norm'] - df['C_norm']))
# --- 3. Filtrar para "Rendimiento Extremo" ---
threshold = df['perf_index'].quantile(0.5)
df_extreme = df[df['perf_index'] > threshold].copy()
# --- 4. Crear y guardar el mapa de calor ---
plt.figure(figsize=(12, 10))
hb = plt.hexbin(
df_extreme['Y'], df_extreme['X'], C=df_extreme['perf_index'],
gridsize=60, cmap='plasma', reduce_C_function=np.mean
)
cb = plt.colorbar(hb)
cb.set_label('Índice de Rendimiento Óptimo (Promedio)', fontsize=12)
plt.title('Mapa de Calor de Rendimiento Extremo (log(3).txt)', fontsize=16)
plt.xlabel('Coordenada X', fontsize=12)
plt.ylabel('Coordenada Y', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.3)
plt.axis('equal')
output_filename = 'heatmap_log3.png'
plt.savefig(output_filename)
print(f"\n¡Éxito! Se ha guardado el mapa de calor como '{output_filename}'")
# Intenta mostrar el gráfico en una ventana emergente
plt.show()
except FileNotFoundError:
print(f"ERROR: No se encontró el archivo '{filename}'. Asegúrate de que esté en la misma carpeta que este script.")
except Exception as e:
print(f"Ocurrió un error inesperado: {e}")