Cómo trazar valores de mediana en cada bin, y para mostrar el valor 25 y 75 por ciento

Me gustaría trazar mis datos similares a la siguiente figura con mostrar mediana en cada bin y 25 y 75 por ciento de valor.[La línea sólida y los círculos abiertos muestran los valores medianos en cada contenedor, y las líneas rotas muestran los valores del 25% y del 75%.] enter image description here

Tengo esta muestra. datos. Y me gustó esto para conseguir la trama similar

import numpy as np
import matplotlib.pyplot as plt
from astropy.table import Table
data=Table.read('sample_data.fits')
# Sample data
X=data['density']
Y=data['lineflux']
total_bins = 15
bins = np.linspace(min(X),max(X), total_bins)
delta = bins[1]-bins[0]
idx  = np.digitize(X,bins)
running_median = [np.median(Y[idx==k]) for k in range(total_bins)]

plt.plot(X,Y,'.')
plt.plot(bins-delta/2,running_median,'--r',marker='o',fillstyle='none',markersize=20,alpha=1)
plt.xlabel('log $\delta_{5th}[Mpc^{-3}]$')
plt.ylabel('log OII[flux]')
plt.loglog()
plt.axis('tight')
plt.show()

Y tengo esta trama. enter image description here

Hay una gran compensación. También cambio el tamaño de la basura, aún así, tengo la gran compensación. Cómo trazar de la manera correcta y cómo incluir el valor 25 y 75 por ciento como la figura anterior en mi parcela.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por debugduke


3 Respuestas:

  • Para responder a la otra pregunta: se puede utilizar np.percentile. Tuve que bajar el número de bin (había un bin sin datos, esto conduce a problemas con el percentil). Para los bines logarítmicos ver mi comentario arriba:

    import numpy as np
    import matplotlib.pyplot as plt
    from astropy.table import Table
    
    data=Table.read('sample_data.fits')
    # Sample data
    X=data['density']
    Y=data['lineflux']
    total_bins = 10
    #bins = np.linspace(min(X), max(X), total_bins)
    bins = np.logspace(np.log10(0.0001), np.log10(0.1), total_bins)
    delta = bins[1]-bins[0]
    idx  = np.digitize(X, bins)
    running_median = [np.median(Y[idx==k]) for k in range(total_bins)]
    
    running_prc25 = [np.percentile(Y[idx==k], 25) for k in range(total_bins)]
    running_prc75 = [np.percentile(Y[idx==k], 75) for k in range(total_bins)]
    
    plt.plot(X,Y,'.')
    plt.plot(bins-delta/2,running_median,'-r',marker='o',fillstyle='none',markersize=20,alpha=1)
    
    plt.plot(bins-delta/2,running_prc25,'--r',marker=None,fillstyle='none',markersize=20,alpha=1)
    plt.plot(bins-delta/2,running_prc75,'--r',marker=None,fillstyle='none',markersize=20,alpha=1)
    
    plt.xlabel('log $\delta_{5th}[Mpc^{-3}]$')
    plt.ylabel('log OII[flux]')
    plt.loglog()
    plt.axis('tight')
    plt.show()
    

    que produce

    enter image description here

    EDIT:

    Para mostrar una parcela llena que puede probar (sólo la sección pertinente mostrada):

    fig, ax = plt.subplots()
    
    plt.plot(X,Y,'.')
    plt.plot(bins-delta/2,running_median,'-r',marker='o',fillstyle='none',markersize=20,alpha=1)
    
    #plt.plot(bins-delta/2,running_prc25,'--r',marker=None,fillstyle='none',markersize=20,alpha=1)
    #plt.plot(bins-delta/2,running_prc75,'--r',marker=None,fillstyle='none',markersize=20,alpha=1)
    
    ax.fill_between(bins-delta/2,running_prc25,running_median, facecolor='orange')
    ax.fill_between(bins-delta/2,running_prc75,running_median, facecolor='orange')
    

    que produce

    enter image description here

    Respondida el Dec 17, 2020 a las 09:42 - por codergeek24

    Votos positivos: 0 | Votos negativos: 0

  • Para trazar correctamente los valores de mediana en cada bin y los valores del 25% y del 75%, puedes usar la función np.percentile para calcular estos valores. Aquí te dejo el código actualizado con estas modificaciones:

    python
    import numpy as np
    import matplotlib.pyplot as plt
    from astropy.table import Table
    
    data = Table.read('sample_data.fits')
    

    Sample data

    X = data['density'] Y = data['lineflux'] total_bins = 15 bins = np.linspace(min(X), max(X), total_bins) delta = bins[1] - bins[0] idx = np.digitize(X, bins) running_median = [np.median(Y[idx==k]) for k in range(1, total_bins+1)] running_25percentile = [np.percentile(Y[idx==k], 25) for k in range(1, total_bins+1)] running_75percentile = [np.percentile(Y[idx==k], 75) for k in range(1, total_bins+1)] plt.plot(X, Y, '.') plt.plot(bins-delta/2, running_median, '--r', marker='o', fillstyle='none', markersize=10, label='Median') plt.errorbar(bins-delta/2, running_median, yerr=[running_25percentile, running_75percentile], linestyle='--', color='k', marker='o', label='25th-75th percentile') plt.xlabel('log $\delta_{5th}[Mpc^{-3}]$') plt.ylabel('log OII[flux]') plt.legend() plt.loglog() plt.axis('tight') plt.show()

    Con este código, ahora estás calculando y trazando la mediana en cada bin, así como los valores del 25% y 75% utilizando las funciones np.percentile y plt.errorbar. Esto debería darte la trama con los valores deseados.

    Respondida el Dec 18, 2020 a las 09:40 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para crear un gráfico similar a la figura proporcionada, donde se muestran la mediana y los valores del 25% y del 75% de cada bin, puedes utilizar las siguientes modificaciones en tu código:

    python
    import numpy as np
    import matplotlib.pyplot as plt
    from astropy.table import Table
    data = Table.read('sample_data.fits')
    
    

    Datos de muestra

    X = data['density'] Y = data['lineflux']

    Número de bins

    total_bins = 15

    Crear bins

    bins = np.linspace(min(X), max(X), total_bins)

    Calcular mediana y valores del 25% y 75% para cada bin

    medians = [] percentiles_25 = [] percentiles_75 = [] for i in range(total_bins): idx = np.where(X >= bins[i] - 0.5 (bins[1] - bins[0]) & X < bins[i] + 0.5 (bins[1] - bins[0]))[0] medians.append(np.median(Y[idx])) percentiles_25.append(np.percentile(Y[idx], 25)) percentiles_75.append(np.percentile(Y[idx], 75))

    Crear la trama

    plt.scatter(X, Y, s=2, alpha=0.5)

    Trazar la mediana y los valores del 25% y 75%

    plt.plot(bins - 0.5 (bins[1] - bins[0]), medians, color='red', marker='o', markersize=10, label='Mediana') plt.plot(bins - 0.5 (bins[1] - bins[0]), percentiles_25, color='blue', marker='^', markersize=10, label='25%') plt.plot(bins - 0.5 (bins[1] - bins[0]), percentiles_75, color='green', marker='s', markersize=10, label='75%') plt.xlabel('log $\delta_{5th}[Mpc^{-3}]$') plt.ylabel('log OII[flux]') plt.loglog() plt.legend() plt.tight_layout() plt.show()

    Explicación de las modificaciones:

    Se calculan los valores de mediana, percentil 25 y percentil 75 para cada bin, en lugar de solo la mediana. Se ajustan los centroides de los bins para que se alineen con los bordes de los bins. Se utilizan diferentes formas y colores de marcadores para distinguir los diferentes valores (mediana, percentil 25, percentil 75). Se añade una leyenda para identificar los distintos tipos de valores trazados.

    Resultado:*

    Este código producirá un gráfico similar a la figura proporcionada, mostrando la mediana y los valores del 25% y del 75% en cada bin. La compensación inicial ya no debería estar presente.

    Respondida el Dec 18, 2020 a las 09:55 - por Gemini

    Votos positivos: 0 | Votos negativos: 0