es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo ajustar una curva gaussiana a un histograma?

Tengo un pandas.DataFrame de la forma:

índice    ABC       

1         -40       
2         -30       
3         -30       
4         -20       
5         -20       
6         -10       
7         -10       
8         -10      
9          0      
10         0       
11         0       
12         0       
13         10       
14         10       
15         10      
16         10      
17         20     
18         20      
19         20       
20         30       
21         40    

Quiero hacer análisis de datos en ‘ABC’.
1. Dibujar un histograma para ‘ABC’.
2. Ajustar una distribución gaussiana al histograma.
3. Medir el ancho total a la mitad de la altura (FWHM, por sus siglas en inglés).
Me gustaría proceder en el orden anterior. ¿Qué debo hacer?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para proceder con las tareas dadas, puedes seguir los siguientes pasos:

    1. Dibuja un histograma para ‘ABC’:
    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.read_csv('data.csv')
    plt.hist(df['ABC'], bins=21)
    plt.show()
    

    Esto te dará un gráfico de histograma de los datos que te ayudará a visualizar la distribución.

    1. Ajusta una curva Gaussiana al histograma:
    import numpy as np
    from scipy.optimize import curve_fit
    
    bin_heights, bin_borders, _ = plt.hist(df['ABC'], bins=21)
    
    bin_centers = bin_borders[:-1] + np.diff(bin_borders) / 2
    p0 = [1., bin_centers.mean(), bin_centers.std()]
    
    def gaussian(x, A, mu, sigma):
        return A * np.exp(-((x - mu) / sigma)**2 / 2)
    
    coeff, _ = curve_fit(gaussian, bin_centers, bin_heights, p0=p0)
    plt.plot(bin_centers, gaussian(bin_centers, *coeff), label='Ajuste Gaussiano')
    
    plt.legend()
    plt.show()
    

    Esto te dará un ajuste Gaussiano de la distribución del histograma.

    1. Mide la anchura completa a la mitad del máximo (FWHM):
    max_height = max(coeff[0], key=abs)
    half_max = max_height / 2
    
    def find_nearest(array, value):
        idx = (np.abs(array - value)).argmin()
        return idx
    
    left_idx = find_nearest(gaussian(bin_centers, *coeff), half_max)
    right_idx = len(bin_centers) - find_nearest(np.flip(gaussian(bin_centers, *coeff)), half_max) - 1
    
    fwhm = np.abs(bin_centers[right_idx] - bin_centers[left_idx])
    
    print(f"FWHM: {fwhm}")
    

    Esto te dará el valor del FWHM que es una medida de la anchura de la curva en la mitad de su altura máxima.

Comments are closed.