Scripts de Python 3 para hacer un ajuste lineal usando un fichero TXT con columnas tabuladas, X,Y1,Y2,Y3,Y4.
Tendrás que editar el script y cambiar la ruta de la carpeta raíz donde se encuentra el archivo de texto con los datos, en mi caso "/LUSTRE/home/CTS164/jant.encinar.umh.es/py-linux/09-fit-recta/datos-X-Y.txt".
Las líneas 80 y 82 te permiten usar el script en Linux y Windows, respectivamente. Anula la que no quieras usar según tu SO.
# -*- coding: iso-8859-1 -*-
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
# Ruta del archivo de texto con los datos X e Y
ruta_archivo = "/LUSTRE/home/CTS164/jant.encinar.umh.es/py-linux/09-fit-recta/datos-X-Y.txt"
# Si ejecutamos este script en Windows debemos usar la ruta justo debajo y anular la superior
# ruta_archivo = "C:\\Users\\jant2\\Desktop\\notebook\\datos-X-Y.txt"
# Leer los datos desde el archivo de texto
datos = np.loadtxt(ruta_archivo, delimiter="\t")
# Obtener los datos X y Y en columnas separadas
x = datos[:, 0]
y = datos[:, 1:]
# Calcular la media y la desviacion estandar de los valores de Y
media_y = np.mean(y, axis=1)
std_y = np.std(y, axis=1)
# Realizar el ajuste de la recta y calcular los parametros
pendiente, intercep, r_value, p_value, std_err = stats.linregress(x, media_y)
# Calcular el coeficiente de determinacion r^2
r2 = r_value ** 2
# Configurar el tamano del punto en el diagrama de dispersion
tam_punto = 30
# Graficar los datos como un diagrama de dispersion con puntos rojos
fig, ax = plt.subplots()
ax.scatter(x, media_y, s=tam_punto, color='red')
# Agregar la linea de la recta de regresion
ax.plot(x, intercep + pendiente*x, '-', color='blue')
# Agregar las barras de error para la desviacion estandar
ax.errorbar(x, media_y, yerr=std_y, fmt='none', ecolor='black', capsize=2)
# Agregar la ecuacion de la recta al grafico
eqn = "y = {:.2f}x + {:.2f}".format(pendiente, intercep)
plt.annotate(eqn, xy=(0.05, 0.95), xycoords='axes fraction', fontsize=12, ha='left', va='top')
# Agregar la media y desviacion estandar al grafico
#for i in range(len(x)):
#ax.text(x[i], media_y[i] + std_y[i] + 0.1, f"{media_y[i]:.2f}\n±{std_y[i]:.2f}", ha='center')
# Agregar un titulo y etiquetas de los ejes
ax.set_title("Diagrama de dispersion con linea de regresion")
ax.set_xlabel("Eje X")
ax.set_ylabel("Eje Y")
# Mostrar el valor de r2 en la esquina superior derecha del grafico.
ax.text(0.95, 0.95, f"r^2 = {r2:.3f}", transform=ax.transAxes, ha='right', va='top')
# Mostrar el grafico
plt.savefig('nombre_de_archivo.png')
plt.show()
Los datos de partida en mi ejemplo son:
X Y1 Y2 Y3 Y4
0 0 0 0 0
0.1 9.666666667 9 7 13
0.2 11.66666667 11 9 15
0.3 16.66666667 16 18 16
0.4 21.33333333 22 23 19
0.5 25 26 23 26
0.7 33 33 33 33
0.8 44.33333333 42 51 40
1 44.66666667 46 46 42
1.2 60 66 57 57
Justo debajo ves el resultado con el gráfico, la ecuación y el valor r^2: