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: