Intervalo de configuración de datos

Un poco nuevo a pitón para que el código pueda mejorarse.

Tengo un archivo txt con valores x y y, separado por algún NaN en medio.

Los datos van de -x a x y luego regresan (x a -x) pero con valores algo diferentes de y, dicen:

x=np.array([-0.02,-0.01,0,0.01,0.02,NaN,1,NaN,0.02,0.01,0,-0.01,-0.02])

Y me gustaría trazar (matplotlib) hasta el primer NaN con cierto formato, x=1 con otro formato, y último conjunto de datos con un tercer formato diferente (color, marcador, ancho de línea...).

Por supuesto, los datos que tengo son un poco más complejos, pero supongo que es una simple aproximación útil.

¿Alguna idea? Estoy usando pandas como mi herramienta de manipulación de datos

Pregunta hecha hace 3 años, 4 meses, 27 días - Por cyberjedi


3 Respuestas:

  • Puede crear una etiqueta de grupo tomando el cumsum de donde x está nula. Luego se puede definir un diccionario clave por la etiqueta con valores siendo un diccionario que contiene todos los parámetros de trazado. Uso groupby para trazar cada grupo por separado, desempaquetando todos los parámetros para establecer los argumentos para ese grupo.

    Datos de muestra

    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    
    x = np.array([-0.02,-0.01,0,0.01,0.02,np.NaN,1,np.NaN,0.02,0.01,0,-0.01,-0.02])
    df = pd.DataFrame({'x': x})
    

    Código

    df['label'] = df.x.isnull().cumsum().where(df.x.notnull())
    
    plot_params = {0: {'lw': 2, 'color': 'red', 'marker': 'o'},
                   1: {'lw': 6, 'color': 'black', 'marker': 's'},
                   2: {'lw': 9, 'color': 'blue', 'marker': 'x'}}
    
    fig, ax = plt.subplots(figsize=(3,3))
    for label, gp in df.groupby('label'):
        gp.plot(y='x', **plot_params[label], ax=ax, legend=None)
    plt.show()
    

    enter image description here


    Esto es lo que df busca referencia después de definir la etiqueta del grupo

    print(df)
           x  label
    0  -0.02    0.0
    1  -0.01    0.0
    2   0.00    0.0
    3   0.01    0.0
    4   0.02    0.0
    5    NaN    NaN
    6   1.00    1.0
    7    NaN    NaN
    8   0.02    2.0
    9   0.01    2.0
    10  0.00    2.0
    11 -0.01    2.0
    12 -0.02    2.0
    

    Respondida el Dec 18, 2020 a las 18:29 - por devdynamo

    Votos positivos: 0 | Votos negativos: 0

  • Para lograr trazar los datos con distintos formatos en función de la ubicación de los NaN en el arreglo x, puedes seguir los siguientes pasos:

    • Leer los datos del archivo txt y cargarlos en un DataFrame de pandas.
    • Identificar los índices en los que se encuentran los NaN en el arreglo x.
    • Dividir el arreglo x en tres subconjuntos: desde el inicio hasta el primer NaN, desde el primer NaN hasta el segundo NaN (o el final si es el último) y desde el segundo NaN (o inicio si es el primero) hasta el final.
    • Graficar cada subconjunto con el formato deseado.

    A continuación te muestro un ejemplo de cómo podrías implementar esto:

    python
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    

    Leer los datos del archivo txt

    data = np.array([-0.02, -0.01, 0, 0.01, 0.02, np.nan, 1, np.nan, 0.02, 0.01, 0, -0.01, -0.02])

    Crear un DataFrame de pandas con los datos

    df = pd.DataFrame(data, columns=['x'])

    Obtener los índices de los NaN en el arreglo x

    nan_indexes = df.index[df['x'].isnull()].tolist()

    Dividir el arreglo x en tres subconjuntos

    subset1 = df['x'].iloc[:nan_indexes[0]] subset2 = df['x'].iloc[nan_indexes[0]+1:nan_indexes[1]] subset3 = df['x'].iloc[nan_indexes[1]+1:]

    Graficar cada subconjunto con un formato diferente

    plt.plot(subset1, color='blue', marker='o', label='Subset 1') plt.plot(subset2, color='green', marker='s', linestyle='--', label='Subset 2') plt.plot(subset3, color='red', marker='^', linestyle='-.', label='Subset 3') plt.legend() plt.show()

    Este código te permitirá trazar los datos con el formato deseado para cada subconjunto del arreglo x. Recuerda adaptar el código a tus datos reales, especialmente si la estructura es más compleja.

    Respondida el Dec 19, 2020 a las 18:31 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • python
    import pandas as pd
    import matplotlib.pyplot as plt
    
    

    Leer el archivo txt y dividirlo en dos conjuntos de datos basados en NaN

    data = pd.read_csv('data.txt', delimiter=',').dropna() data_1 = data[data['x'].notna()] data_2 = data[data['x'].isna()]

    Trazar el primer conjunto de datos

    plt.plot(data_1['x'], data_1['y'], color='blue', marker='o', linewidth=2)

    Trazar el segundo conjunto de datos

    plt.plot(data_2['x'], data_2['y'], color='red', marker='x', linewidth=1)

    Trazar el tercer conjunto de datos

    plt.plot(data_3['x'], data_3['y'], color='green', marker='^', linewidth=3)

    Personalizar la leyenda

    plt.legend(['Conjunto de datos 1', 'Conjunto de datos 2', 'Conjunto de datos 3'])

    Mostrar el gráfico

    plt.show()

    Respondida el Dec 19, 2020 a las 18:40 - por Gemini

    Votos positivos: 0 | Votos negativos: 0